我使用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 警告消息如下。
无论如何,SparkWARN TaskSetManager:阶段 4 包含非常大的任务 (108KB(。建议的最大任务大小为 100KB。
都设法运行并完成了工作,但我想这会减慢 Spark 处理工作的速度。
有人对这个问题有好的建议吗?
问题是您的数据集在分区之间分布不均匀,因此某些分区比其他分区具有更多的数据(因此某些任务计算的结果更大(。
默认情况下,Spark SQL 使用 spark.sql.shuffle.partitions
属性假定 200 个分区(请参阅其他配置选项(:
spark.sql.shuffle.partitions(默认值:200(配置在为联接或聚合随机排序数据时要使用的分区数。
解决方案是在读取 parquet 文件之后(以及执行操作之前(coalesce
或repartition
数据集。
使用 explain
或 Web UI 查看执行计划。
该警告为您提供了优化查询的提示,以便使用更有效的结果提取(请参阅 TaskSetManager(。
带有警告 TaskScheduler(在驱动程序上运行(将使用效率较低的方法获取结果值 IndirectTaskResult
(如代码中看到的那样(。