sparksql参数

Spark参数场景配置

参数类型

参数

参数说明

平台默认值

场景与建议

资源申请

spark.executor.memory

Executor Java进程的堆内存大小

即Executor Java进程的Xmx值

2g

默认设置,或者同时等比例增大,最高不超过默认值的3倍,超过的单独拿出来看下 (注意作业是否数据倾斜)

可根据单个文件大小进行预估 若是orc格式,需乘以2-3倍

spark.yarn.executor.memoryOverhead

Executor Java进程的off-heap内存,包括JVM overhead,sort,shuffle以及Netty的堆外内存等

1g

保持默认值,建议值1-3g

特殊问题单独拿出来讨论

executor的内存大小限制:
spark.executor.memory + spark.yarn.executor.memoryOverhead <= 16G

(YARN container最大内存限制)

spark.executor.cores

Executor中同时可以执行的task数目

共享整个excutor内存,cores越多,平均下来单个task占用的资源就越少

1

建议值1-3 再多需单独拿出来讨论

建议spark.executor.cores * spark.dynamicAllocation.maxExecutors < 5000
(cu, 队列总配额为14000)

spark.dynamicAllocation.maxExecutors

开启动态资源分配后,同一时刻,最多可申请的executor个数

1000

流量以及数据量在30亿以上的作业

可提高至2000个(不建议再提高)

其他情况保持默认

当在Spark UI中观察到task较多时,可适当调大此参数,缩短作业执行时间。 一般保持shuffle.partitions / (maxExecutors*executor.cores)=2

spark.dynamicAllocation.minExecutors

executor的最小个数。平台默认设置为3,即在任何时刻,作业都会保持至少有3个及以上的executor存活

3

保持默认即可

spark.memory.fraction

存储+执行内存占节点总内存的大小,社区版是0.6。平台为了方便的把hive任务迁移到spark任务,把该区域的内存比例调小至0.3

0.3

没有udf或者udf不会消耗太多内存的任务可以调整到0.5甚至社区版默认的0.6,减少spill的次数,提升性能。HBO参数修改方案v2

spark.driver.memory

driver使用内存大小

10G

  1. 一般不需要更改此设置。

  2. 确实需要有大表广播的,可以考虑增加这个数值

spark.yarn.driver.memoryOverhead

driver进程的off-heap内存

spark.driver.memory * 0.1,并且不小于384m

  1. 保持默认值即可

spark.sql.autoBroadcastJoinThreshold

当执行join时,小表被广播的阈值

当被设置为-1,则禁用广播

该参数设置的过大会对driver和executor都产生压力。

26214400
(25M)

  1. 由于我们的表大部分为ORC压缩格式,解压后的数据量达到3-5倍甚至10倍 所以调大该参数需要注意

  2. 建议值广播不超过128m

文件合并

spark.hadoop.hive.exec.orc.split.strategy

参数控制在读取ORC表时生成split的策略:

BI策略以文件为粒度进行split划分;

ETL策略会将文件进行切分,多个stripe组成一个split;

HYBRID策略当文件的平均大小大于hadoop最大split值(默认256M)时使用ETL策略,否则使用BI策略

BI模式

  1. 由于读orc文件时默认按文件划分task(BI模式), 有数据倾斜的表(这里的数据倾斜指大量stripe存储于少数文件中)的情况并发可能不够, 影响执行效率. 可以改成ETL模式

  2. 对于一些较大的ORC表,可能其footer较大,ETL策略可能会导致其从hdfs拉取大量的数据来切分split,甚至会导致driver端OOM,因此这类表的读取建议使用BI策略。

  3. 流量数据建议采用默认策略,因其存在大量文件和大量小文件 其他情况若发现有处理倾斜,请查看文件大小是否均匀

文件合并

spark.hadoop.mapreduce.input.fileinputformat.split.minsize

计算Split划分时的minSize

保持默认

spark.hadoop.mapreduce.input.fileinputformat.split.maxsize

控制在ORC切分时stripe的合并处理。具体逻辑是,当几个stripe的大小小于spark.hadoop.mapreduce.input.fileinputformat.split.maxsize时,会合并到一个task中处理。可以适当调小该值,如set spark.hadoop.mapreduce.input.fileinputformat.split.maxsize=134217728。以此增大读ORC表的并发

建议值不超过128m

spark.hadoopRDD.targetBytesInPartition

读取输入文件时&最终合并小文件时,每个task读取的数据量

33554432
(32M)

1:非grouping set情况

建议67108864, 如果发现读取文件的task较多,可以适当增大该值到128m。

2:grouping set 情况

建议调下该值 降低该值 详见case

----详见作业最后一个阶段遇到shuffle慢节点

spark.sql.adaptive.shuffle.targetPostShuffleInputSize

开启spark.sql.adaptive.enabled后,最后一个stage在进行动态合并partition时,会根据shuffle read的数据量除以该参数设置的值来计算合并后的partition数量。所以增大该参数值会减少partition数量,反之会增加partition数量

67108864

(64M)

256m, 可以适当增大或减小

spark.sql.mergeSmallFileSize

写入hdfs后小文件合并的阈值。如果生成的文件平均大小低于该参数配置,则额外启动一轮stage进行小文件的合并。

当任务中添加task:Listing leaf files and directorioes for 55 paths

128000000
  1. 建议40m,如果最终文件数仍然较多,可适当调大.。

  2. 如果输入数据量量大,但是最终结果数据量较少时,可以在最后加一个同时结合distribute by操作。如果最终结果数据量本来就较大,没必要加distribute by。

  3. 效率上面建议使用此参数 数据量大时不建议使用distribute by

shuffle相关

spark.sql.shuffle.partitions

reduce阶段(shuffle read)的数据分区,分区数越多,启动的task越多,同时生成的文件数也会越多。

2000

1. 建议一个partition保持在256mb左右的大小就好。当作业数据较多时,适当调大该值,当作业数据较少时,适当调小以节省资源

2. spark.sql.shuffle.partitions设置过大可能会导致很多reducer同时向一个mapper拉取数据。该mapper由于请求压力过大挂掉或响应缓慢,从而导致fetch failed

spark.sql.adaptive.shuffle.targetPostShuffleInputSize

最后一个stage在进行动态合并partition时,会根据shuffle read的数据量除以该参数设置的值来计算合并后的partition数量。所以增大该参数值会减少partition数量,反之会增加partition数量。

67108864

(64M)

  1. 建议128m, 可以适当增大或减小

spark.sql.statistics.fallBackToHdfs

当表的文件大小元数据信息不可能用时回退到hdfs计算表的文件大小,从而决定是否使用map join. 分区表如果读入数据较少也不会优化为BroadcastJoin, 可以通过添加该参数优化:

false

1:建议保持默认

2:如果mapjoin的值不生效 建议设置为true

推测执行

spark.speculation

spark推测执行的开关,作用同hive的推测执行

true

  1. 保持默认值即可

spark.speculation.interval

开启推测执行后,每隔多久通过checkSpeculatableTasks方法检测是否有需要推测式执行的tasks

1000ms

  1. 保持默认值即可

spark.speculation.quantile

当成功的Task数超过总Task数的spark.speculation.quantile时(社区版默认75%,公司默认99%),再统计所有成功的Tasks的运行时间,得到一个中位数,用这个中位数乘以spark.speculation.multiplier(社区版默认1.5,公司默认3)得到运行时间门限,如果在运行的Tasks的运行时间超过这个门限,则对它启用推测。

0.99

1: 如果资源充足,可以适当减小 spark.speculation.quantile和spark.speculation.multiplier的值

2:目前不建议调整

你可能感兴趣的:(spark,大数据)