【发布时间】:2018-08-14 10:51:11
【问题描述】:
我正在通过
将镶木地板数据加载到数据框中spark.read.parquet('hdfs:///path/goes/here/...')
由于 parquet 分区,该路径中有大约 50k 个文件。当我运行该命令时,spark 会生成数十个小作业,这些小作业总体上需要几分钟才能完成。以下是 Spark UI 中作业的外观:
如您所见,虽然每个作业有大约 2100 个任务,但它们执行速度很快,大约 2 秒。启动如此多的“迷你作业”效率低下,并导致此文件列出步骤大约需要 10 分钟(其中集群资源大部分处于空闲状态,并且集群主要处理散乱的任务或管理作业/任务的开销)。
如何将这些任务整合到更少的工作中,每个工作都有更多的任务? 也适用于 pyspark 的解决方案的奖励积分。
我在 hadoop 2.8.3 上通过 pyspark 运行 spark 2.2.1。
【问题讨论】:
-
我相信你遇到了一个错误,我的一位前同事为此提交了工单并打开了拉取请求(仍然没有反馈)。您可以在这里查看:issues.apache.org/jira/browse/SPARK-21056 如果它适合您的问题,那么您最好的选择可能是投票支持该问题并在邮件列表中引起一些关注。 :)
-
您的转换是否包括任何洗牌。如果洗牌默认涉及 spark.sql.shuffle.partitions 是 200。这就是为什么您会看到每个作业有这么多任务
-
我可以举个例子说明你正在做什么转换
-
@saipradeepkumarkotha:无论我执行什么后续转换,都会出现这个问题。这是 spark '热切'地执行工作的例外情况之一——这些工作甚至在我对我的 DAG 执行任何操作之前运行。
-
@stefanobaghino:我想你已经解释了发生了什么。看起来 bbossy 的讨论表明调整
spark.sql.sources.parallelPartitionDiscovery.threshold参数可能会有所帮助。如果您写下调整该参数如何解决问题,我将接受您的答案作为解决方案(您将获得赏金)。
标签: apache-spark pyspark