spark何时以及如何在执行器上分配分区

Posted

技术标签:

【中文标题】spark何时以及如何在执行器上分配分区【英文标题】:When and how does spark distribute partitions on executors 【发布时间】:2017-04-21 16:29:53 【问题描述】:

spark 如何将分区分配给执行程序。

当我使用 1 个驱动程序和 5 个执行程序在 spark shell 中运行以下行时:

> var data = sc.textFile("file") // auto generates 2 partitions
> data.count()                   // materialize partitions on two nodes
> data = data.repartition(10)    // repartition data.count()            
> data.count()                   // 10 partitions still on original 2 nodes

重新分区后,10 个分区仍然位于原来的两个节点上(共 5 个)。这似乎非常低效,因为 5 个任务在每个包含分区的节点上重复运行,而不是均匀分布在节点之间。对于在同一个 rdds 上重复多次的迭代任务,效率低下最为明显。

所以我的问题是,spark 如何决定哪个节点有哪个分区,有没有办法可以强制将数据移动到其他节点?

【问题讨论】:

你说的是两个节点,但是你有一个 Executor,这没有多大意义。我们说的是哪个? 抱歉打错了,刚刚编辑。谢谢指出 您在 Sparks 任务分配方面遇到问题吗?或者这是一个普遍的问题?每个 Executor 有多少个核心? 我假设任务数与 rdd 分区数相同?运行任务的时候,因为我的10个partition是在2个节点上,那么10个task跑在2个节点上,效率比5个节点各2个partition,每个节点跑2个task效率低。所以我想知道 spark 是如何决定哪个分区到哪个节点的。 也许github.com/apache/spark/pull/8280 可以帮助... 【参考方案1】:

我只是在这里提供一个猜测以显示逻辑(不一定是真正发生的事情)。

假设您的文件不是很大,即它适合 1 个 HDFS 块。并假设该块被复制到 2 个节点。如果您想在第三个节点上进行处理,那么这意味着您需要复制它。由于计数是一种相对较快的计算,因此处理任务所需的时间可能相对较小。 Spark 可能已经决定,最好在本地等待并进行处理,而不是将数据随机发送到其他节点(您可以配置此参数)。

【讨论】:

你知道我该如何配置它会随机播放吗?我想做一个重复的迭代任务,因此需要洗牌

以上是关于spark何时以及如何在执行器上分配分区的主要内容,如果未能解决你的问题,请参考以下文章

Spark 任务内存分配

Spark 重新分区执行器

Apache spark如何计算分区以及在executor中如何处理分区

Spark 如何驱逐缓存的分区?

为啥 Spark 每个执行器只使用一个核心?它如何决定使用分区数量以外的核心?

Spark和YARN