spark 参数调优详解

作者: 清风_d587 | 来源:发表于2018-08-30 14:50 被阅读4次

    1、背景

    有需要的可以联系我2317384986     yxxy1717

    ① Application Properties 应用基本属性

    spark.driver.cores  

    driver端分配的核数,默认为1,thriftserver是启动thriftserver服务的机器,资源充足的话可以尽量给多。

    spark.driver.memory

    driver端分配的内存数,默认为1g,同上。

    spark.executor.memory

    每个executor分配的内存数,默认1g,会受到yarn CDH的限制,和memoryOverhead相加 不能超过总内存限制。

    spark.driver.maxResultSize

    driver端接收的最大结果大小,默认1GB,最小1MB,设置0为无限。

    这个参数不建议设置的太大,如果要做数据可视化,更应该控制在20-30MB以内。

    过大会导致OOM。

    spark.extraListeners

    默认none,随着SparkContext被创建而创建,用于监听单参数、无参数构造函数的创建,并抛出异常。

    ② Runtime Environment 运行环境

    主要是一些日志,jvm参数的额外配置,jars等一些自定义的配置,一般不会用到这一块。

    ③ Shuffle Behavior 

    spark.reducer.maxSizeInFlight

    默认48m。从每个reduce任务同时拉取的最大map数,每个reduce都会在完成任务后,需要一个堆外内存的缓冲区来存放结果,如果没有充裕的内存就尽可能把这个调小一点。。相反,堆外内存充裕,调大些就能节省gc时间。

    spark.reducer.maxBlocksInFlightPerAddress

    限制了每个主机每次reduce可以被多少台远程主机拉取文件块,调低这个参数可以有效减轻node manager的负载。(默认值Int.MaxValue)

    spark.reducer.maxReqsInFlight

    限制远程机器拉取本机器文件块的请求数,随着集群增大,需要对此做出限制。否则可能会使本机负载过大而挂掉。。(默认值为Int.MaxValue)

    spark.reducer.maxReqSizeShuffleToMem

    shuffle请求的文件块大小 超过这个参数值,就会被强行落盘,防止一大堆并发请求把内存占满。(默认Long.MaxValue)

    spark.shuffle.compress

    是否压缩map输出文件,默认压缩 true

    spark.shuffle.spill.compress

    shuffle过程中溢出的文件是否压缩,默认true,使用spark.io.compression.codec压缩。

    spark.shuffle.file.buffer

    在内存输出流中 每个shuffle文件占用内存大小,适当提高 可以减少磁盘读写 io次数,初始值为32k

    spark.shuffle.memoryFraction

    该参数代表了Executor内存中,分配给shuffle read task进行聚合操作的内存比例,默认是20%。

    cache少且内存充足时,可以调大该参数,给shuffle read的聚合操作更多内存,以避免由于内存不足导致聚合过程中频繁读写磁盘。

    spark.shuffle.manager

    当ShuffleManager为SortShuffleManager时,如果shuffle read task的数量小于这个阈值(默认是200),则shuffle write过程中不会进行排序操作,而是直接按照未经优化的HashShuffleManager的方式去写数据,但是最后会将每个task产生的所有临时磁盘文件都合并成一个文件,并会创建单独的索引文件。

    当使用SortShuffleManager时,如果的确不需要排序操作,那么建议将这个参数调大一些,大于shuffle read task的数量。那么此时就会自动启用bypass机制,map-side就不会进行排序了,减少了排序的性能开销。但是这种方式下,依然会产生大量的磁盘文件,因此shuffle write性能有待提高。

    spark.shuffle.consolidateFiles

    如果使用HashShuffleManager,该参数有效。如果设置为true,那么就会开启consolidate机制,会大幅度合并shuffle write的输出文件,对于shuffle read task数量特别多的情况下,这种方法可以极大地减少磁盘IO开销,提升性能。

    如果的确不需要SortShuffleManager的排序机制,那么除了使用bypass机制,还可以尝试将spark.shuffle.manager参数手动指定为hash,使用HashShuffleManager,同时开启consolidate机制。

    spark.shuffle.io.maxRetries

    shuffle read task从shuffle write task所在节点拉取属于自己的数据时,如果因为网络异常导致拉取失败,是会自动进行重试的。该参数就代表了可以重试的最大次数。如果在指定次数之内拉取还是没有成功,就可能会导致作业执行失败。

    对于那些包含了特别耗时的shuffle操作的作业,建议增加重试最大次数(比如60次),以避免由于JVM的full gc或者网络不稳定等因素导致的数据拉取失败。在实践中发现,对于针对超大数据量(数十亿~上百亿)的shuffle过程,调节该参数可以大幅度提升稳定性。

    spark.shuffle.io.retryWait

    同上,默认5s,建议加大间隔时长(比如60s),以增加shuffle操作的稳定性。

    spark.io.encryption.enabled + spark.io.encryption.keySizeBits + spark.io.encryption.keygen.algorithm

    io加密,默认关闭

    ④ Spark UI

    这一块配置,是有关于spark日志的。日志开关,日志输出路径,是否压缩。

    还有一些可视化界面、端口的配置 

     ⑤ Compression and Serialization

    spark.broadcast.compress

    广播变量前是否会先进行压缩。默认true (spark.io.compression.codec)

    spark.io.compression.codec

    相关文章

      网友评论

        本文标题:spark 参数调优详解

        本文链接:https://www.haomeiwen.com/subject/xxzrwftx.html