Task优化:
1.慢任务的性能优化:可以考虑减少每个Partition处理的数据量,同时建议开启spark.speculation(慢任务推导,当检测的慢任务时,会同步开启相同的新任务,谁先完成就认定该任务完成)。
2.尽量减少Shuffle,例如我们要尽量减少groupByKey的操作,因为groupByKey会要求通过网络拷贝(Shuffle)所有的数据,优先考虑使用reduceByKey。因为reduceByKey会首先reduce locally。例如在进行join操作的时候,形如(k1,v1) join (k1,v2) => (k1,v3) 此时就可以进行pipeline,但是(o1) join (o2) => (o3) ,此时就会产生Shuffle操作。
3.Repartition:增加Task数量时考虑使用(一个partition分成多个),从而更加充分地使用计算资源。
4.Coalesce:整理Partition碎片(多个partition合成一个)时使用。
数据倾斜:
1.定义更加合理的key(自定义Partitioner)。
2.可以考虑使用ByteBuffer来存储Block,最大的存储容量为2G,如果超出这个大小就会报异常。
网络传输:
1.可以考虑Shuffle的数据放到Tachyon(基于内存的文件系统)中来带来更好的数据本地性,减少网络传输。
2.优先采用Netty的方式进行网络通信。
3.使用广播:在需要较大数据量分发时使用,提高数据本地性。
4.使用mapPartitions,该函数会直接作用在整个Partition上。
5.优先考虑使用PROCESS_LOCAL(默认)。
6.若要访问HBase或Canssandra,务必保证数据处理发送在数据所在的机器上。