我使用spark 1.6.1。
我的火花应用程序读取存储在s3中的10000多个镶木地板文件。
val df = sqlContext.read.option("mergeSchema", "true").parquet(myPaths: _*)
myPaths
是Array[String]
,其中包含10000个镶木地板文件的路径。每条路径都是这样的s3n://bucketname/blahblah.parquet
Spark警告如下消息。
WARN TaskSetManager:阶段4包含一个非常大的任务 (108KB)。建议的最大任务大小为100KB。
Spark无论如何都设法运行并完成了这项工作,但我想这可能会减慢火花处理工作。
有人对这个问题有好的建议吗?
答案 0 :(得分:6)
问题是您的数据集不是均匀分布在分区中,因此某些分区比其他分区拥有更多数据(因此某些任务会计算更大的结果)。
默认情况下,Spark SQL假定使用spark.sql.shuffle.partitions
属性的200个分区(请参阅Other Configuration Options):
spark.sql.shuffle.partitions (默认值:200)配置为连接或聚合数据移动数据时要使用的分区数。
在您阅读镶木地板文件后(以及在执行操作之前),解决方案是coalesce
或repartition
数据集。
使用explain
或网络用户界面查看执行计划。
警告为您提供了优化查询的提示,以便使用更有效的结果提取(请参阅TaskSetManager)。
使用警告TaskScheduler(在驱动程序上运行)将使用效率较低的方法IndirectTaskResult
获取结果值(如the code中所示)。