1 避免使用重复RDD,多次使用的RDD可以持久化复用
2 避免使用Shuffle类算子
shuffle类算子效率低(网络传输,下一轮节点内存不足落磁盘导致增加io读写等),还可能产生数据倾斜
故避免使用:redcueByKey,join,distinct,repartition等shuffle算子。尽量使用map类非shuffle算子
解决方法 mapjoin:
1 使用位图/位运算
2 广播 mapjoin
位图法使用实例
3 使用Map-Side预聚合的shuffle操作
例如reduceByKey/aggregateByKey代替groupByKey
4 使用高性能算子
1 shuffle前预聚合
reduceByKey/aggregateByKey代替groupByKey
2 使用foreachPartition/mapPartition代替map
例如当连接数据库时,使用map rdd内所有数据都需要访问一次数据库压力太大
改成mapPartition每个分区读取只一次数据库即可,然后改方法内再加入map算子做数据逻辑操作。再+数据库连接池
3 使用filter后使用coalesce
filter数据过滤后再coalesce合并数据。
例如100个分区每个分区10G,过滤后每个分区1G,则合并位10个分区。资源利用率则提高10倍
4 使用repartitionAndSortWithPartitions代替repartition和sort类操作
边shuffle边排序,而不是shuffle完了再排序
5 Kryo优化序列化
对象头信息只序列化一次,对象体有多少个对象序列化多少次
6 优化数据结构
字符串代替对象
原始类型代替字符串
数组代替集合类型
mapjoin和combiner能用则用