13

我使用火花 1.6.1。

我的 spark 应用程序读取存储在 s3 中的 10000 多个 parquet 文件。

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

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

Spark 会发出如下警告消息。

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

无论如何,Spark 已经设法运行并完成了这项工作,但我想这会减慢 Spark 处理工作的速度。

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

4

1 回答 1

15

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

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

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

一个解决方案是在您读取镶木地板文件之后(以及在执行操作之前)coalesce或您的数据集。repartition

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


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

警告 TaskScheduler(在驱动程序上运行)将使用不太有效的方法获取结果值(如您在代码IndirectTaskResult中所见)。

于 2017-05-16T12:52:55.877 回答