Spark基本配额介绍:
每个executor (2cpu,10G)
常用参数介绍:
spark.shuffle.memoryFraction 0.5
默认是0.5,是指在shuffle阶段用于shuffle的内存配比
线上配置是0.7
spark.storage.memoryFraction 0.5
默认是0.5,用于指定在运算中常驻缓存的内存配比
线上配置是0.3
(一般的Hive任务无需提高这个值,甚至可以降低,但是如果是ML或者频繁迭代的任务提高这个值可以加快运算。而且
如果你在作业运行之前设置了set mapred.min.split.size=512000000;或者更大,你应该酌情提高这个参数)
关于set mapred.min.split.size这个参数:
在Spark里面,这个参数同样用于限制map输入的文件大小,集群默认的块大小是128M,因此Spark作业默认的输入大小也是128M,即128M对应一个Task.
以一个260G的任务为例,默认调度2200个Task作业。如果将这个值设为51200000,那么Task会变成1200。
这样做的好处是减少不必要的Task调度,同时更加贴近内存规划。建议25600000或者更高,随作业而定。
当然这个值过于高了也不一定就会有益处,比如:
设为25600000时:
设为512000000时:
可以看出在提高到512000000时速度并没有太大的提升,只快了6s。
但是 在128000000到512000000时还是有一定的提升的:
设为128M时:
设为256M时:
可见提高了36s.
控制你的num-executors:
spark-sql --master yarn-client --num-executors 20
运行20个executor的时候:
运行55个executor的时候:
虽然executor多了一倍,但是效率并没有快一倍,所以并不以executor越多,作业就越快。
参数:spark.sql.shuffle.partitions=200
设置reduce的数量,用于reduce阶段均分数据,group by类似的场景适用。