Spark - 是否可以控制分区到节点的位置?

时间:2017-06-07 13:37:32

标签: apache-spark

在Spark中,可以为RDD提供自定义Partitioner。通常,生成的分区随机分配给一组工人。例如,如果我们有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上的操作,但是当您使用跨越多个RDD的join()cogroup()操作时,这些节点之间的通信将成为瓶颈。我会为多个RDD使用相同的分区器,并希望确保它们最终会在同一个节点上,因此后续的join()不会很昂贵。是否可以控制分区到工作者(节点)的位置?

          desired
worker 1: [0-4]
worker 2: [5-9]
worker 3: [10-14]
worker 4: [15-19]

1 个答案:

答案 0 :(得分:2)

  

我会为多个RDD使用相同的分区程序,并希望确定   它们最终将在同一个节点上,因此后续的join()不会   很贵。

这是处理RDD之间连接的正确方法,以便确保要连接的记录位于同一分区/执行程序中。

  

是否可以控制分区到工作人员的位置   (节点)

无法为每个分区显式指定工作节点。这将破坏为Spark或任何其他并行计算框架(如Map-Reduce / Tez等)定义的并行计算的抽象。

Spark和其他并行计算框架旨在实现容错。因此,这意味着如果一小部分工作节点发生故障,则会被其他工作节点替换,并且此过程对用户应用程序透明地发生。

如果允许用户明确引用应用程序中的工作节点,则这些抽象会中断。管理RDD分区放置的唯一方法是为RDD分区程序指定自己的分区。