spark性能调优有很多措施,下面说说我用到的一些调优手段。
1.RDD分片数和executor个数的协调
要想充分的使数据并行执行,并且能充分的利用每一个executor,则在rdd的个数与executor的个数之间要有一个合适的值。若rdd的个数较多而executor的个数较少,则会导致部分rdd需要等待空闲的executor,这样不能使所有数据同时并行执行。若rdd较少,而executor的个数较多,则会导致部分ecexutor空闲,浪费资源。所以最理想的状态是rdd的个数与executor的个数一致,这样可以达到完全并行,但每个executor的执行能力又是不一样的,有的执行的快,则先执行完的会出现等待的情况,所以应该根据内存的大小来分配executor的个数,一般是取rdd个数不小于executor的数量。
rdd分片数可在程序中设置,一般是textFile()函数的第二个参数。executor的个数通过命令:--num-executors args来设置。
2. 优化数据结构
Spark 默认使用Java序列化对象,虽然Java对象的访问速度更快,但其占用的空间通常比其内部的属性数据大2-5倍。为了减少内存的使用,减少Java序列化后的额外开销,下面列举一些Spark官网(http://spark.apache.org/docs/latest/tuning.html#tuning-data-structures)提供的方法。
(1)使用对象数组以及原始类型(primitive type)数组以替代Java或者Scala集合类(collection class)。fastutil 库为原始数据类型提供了非常方便的集合类,且兼容Java标准类库。
(2)尽可能地避免采用含有指针的嵌套数据结构来保存小对象。
(3)考虑采用数字ID或者枚举类型以便替代String类型的主键。