在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]
答案 0 :(得分:2)
我会为多个RDD使用相同的分区程序,并希望确定 它们最终将在同一个节点上,因此后续的join()不会 很贵。
这是处理RDD之间连接的正确方法,以便确保要连接的记录位于同一分区/执行程序中。
是否可以控制分区到工作人员的位置 (节点)
无法为每个分区显式指定工作节点。这将破坏为Spark或任何其他并行计算框架(如Map-Reduce / Tez等)定义的并行计算的抽象。
Spark和其他并行计算框架旨在实现容错。因此,这意味着如果一小部分工作节点发生故障,则会被其他工作节点替换,并且此过程对用户应用程序透明地发生。
如果允许用户明确引用应用程序中的工作节点,则这些抽象会中断。管理RDD分区放置的唯一方法是为RDD分区程序指定自己的分区。