Spark如何解决数据倾斜问题?
分为简单倾斜和复杂倾斜
简单是数据资源分布不均衡,或者执行入filter操作导致的partition之间数据大小不一致 使用coalesce重分区就可以(spark3。X版本引入AQE功能,自适应查询执行,会自动对小分区数据进行合并)
复杂数据倾斜一般是根据业务字段进行聚合运算时进行shuffle之后导致partition之间数据严重不均衡。比如针对全国信息表,以城市作为key,其他信息作为value,通过reduceByKey,你会发现]只有四个城市的数据非常大。
解决方案:
1)提高数据处理频率,同事降低单次数据处理量,这样可以导致每个partition之中的数据量减少
2)减少spark任务的并行度,把并行度降低到4 对象4个数据倾斜严重的分区(--num-executors 4 --executor-memory 5G)同时加大每个executor的内存和CPU核数 添加硬件资源同时不至于让硬件资源过于浪费。
3)尽量精简(单个)value的大小 只取聚合计算时value中需要的字段,不参加的字段全部抛弃 让value大小有效减少
4)对于严重的key进行加盐,把分区数增加,先进行聚合操作,然后再把key进行减盐操作,恢复到原本的kye,再次聚合得到最终结果
jar冲突(主要是版本要一致)
为什么会jar冲突?就是涉及到不同的依赖下面的子依赖有冲突
加载到不该加载的jar包
idea解决:(非社区版)
右击 Maven-> Show Dependencies
Driver和Executor
driver负责