- 复用rdd: 来自同一个数据源的,应该复用同一个rdd,从而减少内存的浪费。
- 尽量减少shuffer类的算子的使用: 因为spark的瓶颈大部分就是在shuffle,所以shuffle类的算子可以找到其他方式代替。比如,join的算子,使用使用广播变量的方式,将一个数据量少的文件分发,然后其他节点在map中再根据key去做关联。
- 对多次使用到的rdd做持久化处理: 就是减少重复劳动力的意思,每一个rdd执行算子操作的时候,都得从源头计算一遍,如果有相同的rdd,可以将其持久化(调用cache()或者persist())将其缓存在内存或者磁盘,下面步骤的rdd如果需要到这个rdd数据的时候,直接拿出来就可以用了。
- 使用预聚合shuffer操作: 这个有点类似于MapReduce的combiner,将map中的数据先进行一遍reduce后得到的数据量会比原先原先的少,然后再进行shuffer的时候,因为减少了数据规模从而降低的网络传输带宽的成本。 比如要使用groupByKey的时候,是否可以根据业务使用reduceByKey、aggregateByKey来替代,这类算子会根据用户自定义函数,现在对相同key的数据进行预处理。
- 序列化: 使用kryo序列化数据,不使用的话,好像默认是用gzip的方法压缩,但是kryo的效率较高,空间压缩规模更好。
转载于:https://my.oschina.net/u/3746234/blog/3048598