leftOuterJoin

时间:2016-06-05 00:11:21

标签: performance apache-spark partitioning rdd outer-join

我有这样的模式......伪代码,但我认为这是有道理的......

type K  //  key, function of records in B

class A             //  compact data structure
val a: RDD[(K, A)]  //  many records 

class B {          //  massive data structure
  def funcIter     // does full O(n) scans of huge data structure
}
val b: RDD[(K,B)]  //  comparatively few records
val emptyB = new B("", Nil, etc.)

val C: RDD[(A,B)] = {
  a
  .leftOuterJoin(b, 1.5x increase in partitions)
  .map{ case (k, (val_a, option_b)) => (val_a, option_b.getOrElse(emptyB)) }
  .map{ case (val_a, val_b) => (val_a, val_b.funcIter(val_a.attributes)) }
}

我的问题是,val b中的记录大小差异很大,而且因为它是一个leftOuterJoin,所以每个记录都被复制1,000或10,000次以加入val ...所以不仅仅是b中有大值要处理,而且b中的最坏情况记录最终会在连接后在一个分区中复制多次。因此,较差的分区几乎完全由b的较差情况值的许多副本组成。因此,我的最后几个分区需要很长时间才能完成,而我的大部分群集都处于空闲状态,耗尽我的钱包。

我可以做些什么来修改这个模式...尝试广播b并加入到位(它可能太大了)....或者在连接后拆分分区可能会将最差的b值分开进入不同的分区而不进行另一次shuffle ...就像coalesce的相反,所以至少在同一个核心实例上有多个执行程序(每个核心实例有3个执行程序)可以并行处理这些记录吗?

感谢您的任何建议。

0 个答案:

没有答案