Spark数据倾斜及解决办法
数据倾斜 在执行shuffle操作过程中,map端按照key分配数据输出,reduce端同样也按照key进行拉取、聚合。通常每一个key对应的数据量不对等,经常出些某些key数据量比其他key多很多。这种现象导致的后果,轻则拖慢job执行时间(执行时间由最慢的task决定),重则直接OOM(数据量太大,处理完成前不能回收内存) 原因 我觉得是两个必要条件,缺一个都不发生数据倾斜,而我们打破其中一个或全部打破来解决数据倾斜。 每个key对应的数据量天然不均 发生shuffle操作 那么怎么定位代码中哪里出现了数据倾斜? 凭经验猜测会发生shuffle的算子 运行慢时。若是client模式,查看本地日志,当前还在运行的Stage、Task是哪个;若是cluster模式,查看UI,主要确定Stage中Task的数据量 报OOM时查看log抛错堆栈,可以定位到某一行代码,从而知道哪一个stage,哪个一个算子。 解决办法 数据源预处理 业务中,hive文件或其他数据源文件大小不均,有大有小。小文件处理很快,而大文件处理慢。如果提前对数据源数据进行一定的清洗、过滤、去重、重分区等操作,将原来不均匀的数据重新均匀放在多个文件中。 同理,针对key分布不均的情况,可以考虑将Spark 运算中业务时效不敏感的shuffle操作提前放到ETL进行预处理(比如预聚合、逻辑压缩等