如何处理“WARN TaskSetManager:Stage包含一个非常大的任务”?

时间:2017-05-16 08:49:20

标签: apache-spark apache-spark-1.6

我使用spark 1.6.1。

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

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

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

Spark警告如下消息。

  

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

Spark无论如何都设法运行并完成了这项工作,但我想这可能会减慢火花处理工作。

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

1 个答案:

答案 0 :(得分:6)

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

默认情况下,Spark SQL假定使用spark.sql.shuffle.partitions属性的200个分区(请参阅Other Configuration Options):

  

spark.sql.shuffle.partitions (默认值:200)配置为连接或聚合数据移动数据时要使用的分区数。

在您阅读镶木地板文件后(以及在执行操作之前),解决方案是coalescerepartition数据集。

使用explain或网络用户界面查看执行计划。

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

使用警告TaskScheduler(在驱动程序上运行)将使用效率较低的方法IndirectTaskResult获取结果值(如the code中所示)。