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
Run Code Online (Sandbox Code Playgroud)
重新分区后,10 个分区仍然位于原来的两个节点上(共 5 个)。这似乎非常低效,因为 5 个任务在包含分区的每个节点上重复运行,而不是在节点之间均匀分布。对于在同一个 rdd 上重复多次的迭代任务,效率低下最为明显。
所以我的问题是,spark 如何决定哪个节点有哪个分区,有没有办法强制将数据移动到其他节点?
我只是在这里提供一个猜测来展示逻辑(不一定是真正发生的事情)。
假设您的文件并不是很大,即它适合 HDFS 的 1 个块。并假设该块被复制到 2 个节点。如果您想在第三个节点上进行处理,那么这意味着您需要复制它。由于 count 是一个相对较快的计算,因此处理任务所需的时间可能相对较短。Spark 可能认为最好在本地等待并进行处理,而不是将数据洗牌到其他节点(您可以配置此参数)。
| 归档时间: |
|
| 查看次数: |
2409 次 |
| 最近记录: |