如何处理"WARN TaskSetManager: Stage contains a task of very large size"?



我使用Spark 1.6.1。

我的 Spark 应用程序读取存储在 s3 中的 10000 多个镶木地板文件。

val df = sqlContext.read.option("mergeSchema", "true").parquet(myPaths: _*)

myPaths 是一个包含 10000 个镶木地板文件的路径的Array[String]。每条路径都是这样s3n://bucketname/blahblah.parquet

Spark 警告消息如下。

WARN TaskSetManager:阶段 4 包含非常大的任务 (108KB(。建议的最大任务大小为 100KB。

无论如何,Spark

都设法运行并完成了工作,但我想这会减慢 Spark 处理工作的速度。

有人对这个问题有好的建议吗?

问题是您的数据集在分区之间分布不均匀,因此某些分区比其他分区具有更多的数据(因此某些任务计算的结果更大(。

默认情况下,Spark SQL 使用 spark.sql.shuffle.partitions 属性假定 200 个分区(请参阅其他配置选项(:

spark.sql.shuffle.partitions(默认值:200(配置在为联接或聚合随机排序数据时要使用的分区数。

解决方案是在读取 parquet 文件之后(以及执行操作之前(coalescerepartition数据集。

使用 explain 或 Web UI 查看执行计划。


该警告为您提供了优化查询的提示,以便使用更有效的结果提取(请参阅 TaskSetManager(。

带有警告 TaskScheduler(在驱动程序上运行(将使用效率较低的方法获取结果值 IndirectTaskResult (如代码中看到的那样(。

最新更新