在 Spark 中,自定义Partitioner
可以为 RDD 提供。通常,生成的分区会随机分配给一组工作人员。例如,如果我们有 20 个分区和 4 个工作线程,则每个工作线程将(大约)获得 5 个分区。然而,放置分区到工作节点(节点)看起来是随机的,如下表所示。
trial 1 trial 2
worker 1: [10-14] [15-19]
worker 2: [5-9] [5-9]
worker 3: [0-4] [10-14]
worker 4: [15-19] [0-4]
这对于单个 RDD 上的操作来说很好,但是当你使用join()
or cogroup()
跨多个 RDD 的操作时,这些节点之间的通信成为瓶颈。我会为多个 RDD 使用相同的分区器,并希望确保它们最终位于同一个节点上,这样后续的 join() 的成本就不会很高。是否可以控制工作人员(节点)的分区放置?
desired
worker 1: [0-4]
worker 2: [5-9]
worker 3: [10-14]
worker 4: [15-19]
我会为多个 RDD 使用相同的分区器,并希望确定
它们将最终位于同一节点上,因此后续的 join() 不会
成本高昂。
这是处理 RDD 之间连接的正确方法,以确保要连接的记录位于同一分区/执行器中。
是否可以控制工人的分区放置
(节点)
不可能为每个分区显式指定工作节点。这将打破为 Spark 或任何其他并行计算框架(如 Map-Reduce/Tez 等)定义的并行计算的抽象。
Spark 和其他并行计算框架旨在容错。因此,这意味着如果一小部分工作节点发生故障,则会被其他工作节点替换,并且此过程对用户应用程序透明地发生。
如果允许用户在应用程序中显式引用工作节点,这些抽象就会被破坏。管理 RDD 分区放置的唯一方法是为 RDD 分区程序指定您自己的分区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)