【问题标题】:When and how does spark distribute partitions on executorsspark何时以及如何在执行器上分配分区
【发布时间】: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 可以帮助...

标签: apache-spark rdd


【解决方案1】:

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

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

【讨论】:

  • 你知道我该如何配置它会随机播放吗?我想做一个重复的迭代任务,因此需要洗牌
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2017-02-10
  • 2018-02-16
  • 1970-01-01
相关资源
最近更新 更多