Spark性能优化(2)

来源:互联网 发布:java开发培训费用 编辑:程序博客网 时间:2024/05/08 19:44

一:Task性能优化
1. 慢任务的性能优化:可以考虑减少每个Partition处理的数据量,同时建议开启任务推测spark.speculation可以进行任务推测。最快完成的任务就会被采纳
慢任务出现的原因?任务倾斜,硬件故障。因为处理逻辑一样的话,时间差很多那么硬件就可能出现故障。Driver上有一个定时器不断的查看有没有慢任务。
2. 尽量减少Shuffle,例如我们要尽量减少groupByKey的操作,因为groupByKey会要求通过网络拷贝(Shuffle)所有的数据,优先考虑使用reduceByKey。因为reduceByKey会首先reduce locality,再例如在进行join操作的时候,形如:(k1,v1)join(k1,v2) => (k1,v3),此时就可以进行pipeline,但是(o1)join(o2) => (o3),此时就会产生Shuffle操作;
3. Repartition:分片的个数由小变大,增加Task数量的时候可以考虑使用,从而更加充分使用计算资源;
Coalesce:整理Partition碎片;
二:数据倾斜:一般发生在Shuffle
1. 某几个partition数据量特别大
导致后面的Stage无法执行,整个作业就会消耗特别多的时间。而Stage内部是线性执行的,Stage内部的Task是并行执行的,Stage中的Task没有执行完的话下一个Stage不能执行。
如何解决?
1) 自定义分片算法:定义更加合理的Key或者说自定义Partitioner。
2) 可以考虑使用ByteBuffer来存储Block,最大的存储数据为2G,如果超过就会报异常。
2. 某几台机器集中处理数据。
三:网络性能优化
1. 可以考虑Shuffle的数据放在tachyon中带来更好的数据本地性,减少网络的Shuffle。
2. 优先采用Nettry的方式进行网络通信。
3. 广播:例如进行Join操作的时候采用Broadcast可以达到完全的数据本地性的情况下进行Join操作。
4. mapPartitions中的函数会直接作用于整个Partition(一次!!),

/** * Return a new RDD by applying a function to each partition of this RDD. * * `preservesPartitioning` indicates whether the input function preserves the partitioner, which * should be `false` unless this is a pair RDD and the input function doesn't modify the keys. */def mapPartitions[U: ClassTag](
5.  优先考虑PROCESS_LOCAL(Spark默认情况下也是这样做的),所以你更应该考虑使用Tachyon。6.  如果要访问HBase或者Canssandra,务必保证数据处理发生在数据所在的机器上。
1 0