Spark SQL插入13M行至分区表失败,求故障排查方向
问题排查:Spark动态分区写入文件数超出限制导致任务失败
从报错核心信息java.lang.AssertionError: assertion failed: Created file counter 11 is beyond max value 10可以明确:Spark在写入动态分区表时,单个任务在同一个分区下创建的文件数超过了默认上限(10个),触发断言检查失败。以下是具体排查和解决方向:
调整动态分区文件数上限参数
Spark参数spark.sql.sources.maxConcurrentWrites默认值为10,控制单个任务每个分区允许创建的最大文件数。可在执行SQL前临时设置:set spark.sql.sources.maxConcurrentWrites=50;或提交任务时通过配置项指定:
--conf spark.sql.sources.maxConcurrentWrites=50数值可根据数据量和分区实际情况调整。
检查分区数据分布
可能存在某个partition_name对应的数据量远大于其他分区,导致单个任务处理时生成过多小文件。先查询各分区数据量:select partition_name, count(*) from (你的子查询) group by partition_name order by count(*) desc;若发现极端数据量分区,考虑拆分分区或调整任务并行度。
优化任务并行度
增加任务并行度,减少单个任务处理的数据量,从而降低单分区文件数。可调整以下参数:set spark.sql.shuffle.partitions=200; -- 默认200,可按数据量放大 set spark.default.parallelism=200;排查数据倾斜问题
如果某个分区数据量异常大,大概率是数据倾斜导致。通过抽样分析partition_name的分布,确认是否存在分区键选择不合理、异常数据等情况,针对性优化数据分布。控制单文件记录数
设置spark.sql.files.maxRecordsPerFile限制每个输出文件的记录数,减少小文件生成:set spark.sql.files.maxRecordsPerFile=1000000; -- 每个文件最多100万条记录
内容的提问来源于stack exchange,提问作者Jaumzera
相关产品推荐
相关产品推荐

