1.Spark现在主推的是dataset的api,越来越多的算子可以基于dataset去做,dataset基于天然自带的优化引擎,但是dataset操控能力不如RDD,如果你是大神你应该用的是RDD。
2.reduceByKey和groupbykey:reduceByKey会在map端先进行reduce聚合操作,而groupbykey不会提前进行聚合操作,把所有的数据全部传到reduce端,shuffle数据条数更多。
3.coalesce:使用coalesce重新设置分区数,当使用了filter算子之后,数据分区内的数据量会存在较大差异,存在数据碎片现象,使用coalesce(numpartition,shuffle = true)重新设置新的分区数目,一般设置一个更小的分区属。
4.spark内存参数设置;
spark.shuffle.memoryFraction:默认占用20%,如果计算依赖shuffle可以调高
spark.storage.memoryFraction: 默认占用60%,缓存实例数据,如果计算比较依赖缓存数据,可以将比例调高
5.并行度设置:
spark.default.parallelism:建议至少设置100,最好是700左右,executor-cores 决定了executor中的task并行数量,默认并行度太小的情况下,无法充分发挥executor并行能力。
官方推荐:task数量设置成Spark Application总cpu数目的2-3倍,意思是一共可以使用150 CPU cores,基本要设置task数量为300-500。
此外,如果机器内存资源充足,cpu资源紧张,可以将并行度设置偏小,如果cpu 资源充足,而内存资源紧张,可以设置较高的并行度,因为,内存资源在一个executor上是共享的,较大的任务,是使用更少的cpu和更多的内存资源。
待续……