tu
一, 判断是否是数据倾斜
看读取时间: 数据来源, 如 Kafka, 数据库读取
运行本身: 数据问题
二, 数据处理:
1) 数据预处理
一是 hive 或 sparkSQL 预处理, 过滤无用的 key, 或者在闲时处理倾斜数据
二是 key-value 改为 key-values 的形式
2) 动态监控 key, 利用 Redis 等内存级别的数据库, 并做处理. 或添加 key 处理流程
三, 改变并行度
1) 算子指定 (reduceByKey)
2)spark.defaule.paraller (80-100)cores 的 2-3 倍
3) 使用 coalesce 改变分区 (repartition 会造成 shuffle)
4) 在读取数据时指定, 比如 textfile,minPartitions
5) 继承父类 RDD 中的分区
四, mapJoin: 将小的 RDD 进行广播
拓展: 特殊情况, 也可将大的数据进行广播, 可以减少 shuffle 和内存使用, 限制条件高 (内存要大于数据量)
五, 对 key 进行处理
1) 抽样, 取出数据倾斜的 key: 单独处理或者加随机数
2) 大量倾斜的 key, 对一个 RDD 进行扩容 N, 另一个 RDD 进行随机数 N.N 越大, 越不容易数据倾斜. 但是会造成其他性能问题
来源: http://www.jianshu.com/p/3bb01ee608c1