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何时以及如何在执行器上分配分区的主要内容,如果未能解决你的问题,请参考以下文章
Apache spark如何计算分区以及在executor中如何处理分区