如何处理“WARN TaskSetManager:阶段包含非常大的任务”?

14

我使用的是Spark 1.6.1版本。

我的Spark应用程序读取了存储在S3中的10000多个Parquet文件。

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

myPaths是一个包含10000个parquet文件路径的Array[String]。每个路径的格式如下:s3n://bucketname/blahblah.parquet

Spark会发出以下警告消息:

WARN TaskSetManager: Stage 4包含一个非常大的任务(108KB)。最大推荐任务大小为100KB。

尽管Spark仍然可以运行和完成作业,但我猜这可能会减慢Spark处理作业的速度。

是否有人对此问题有好的建议?


请分享您的代码,目前我们了解的信息太少,无法提供帮助。 - T. Gawęda
1
嗨!我不明白。即使在小数据集中,最小的分区通常也比100KB大得多,通常为~32Mo。那么重新分区怎么能帮助呢? - Boris
请参阅 https://github.com/jaceklaskowski/mastering-apache-spark-book/blob/master/spark-TaskSetManager.adoc - Boris
1个回答

16
问题在于您的数据集在分区上不均匀,因此一些分区比其他分区有更多的数据(因此一些任务计算较大的结果)。
默认情况下,Spark SQL假定使用200个分区的spark.sql.shuffle.partitions属性(请参见Other Configuration Options):

spark.sql.shuffle.partitions(默认值:200)配置聚合或连接时用于洗牌数据的分区数。

解决方案是在读取parquet文件后(在执行操作之前),对数据集进行coalescerepartition
使用explain或Web UI来查看执行计划。
警告提示您优化查询,以使用更有效的结果获取(请参阅TaskSetManager)。
使用此警告,TaskScheduler(在驱动程序上运行)将使用不太有效的方法IndirectTaskResult获取结果值(如代码中所示)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接