Spark中的加入和组合

Evo*_*mov 6 apache-spark spark-streaming

有迹象表明Spark中的连接是使用/基于cogroup函数/ primitive/transform实现的.因此,让我首先关注cogroup - 它返回一个RDD结果,该结果基本上由cogrouped RDD的所有元素组成.换句话说 - 对于每个cogrouped RDD中的每个键,存在来自至少一个cogrouped RDD的至少一个元素.

这意味着当更小时,而且流式传输,例如JavaPairDstreamRDDs继续加入更大的批量RDD,这将导致为多个结果实例分配RAM(cogrouped)RDD又称大批量RDD和更多...显然当DStream RDD丢弃并且它们定期执行时,RAM将被返回,但仍然看起来RAM消耗中不必要的峰值

我有两个问题:

  1. 无论如何都要更"精确"地控制组合过程,例如告诉它包括我的仅包含RDD的元素,其中每个给定的密钥存在来自每个cogrouped RDD的至少一个元素.基于当前的cogroup API,这是不可能的

  2. 如果cogroup真的是这样的大锤,其次连接基于cogroup,那么即使它们可以根据最终用户可见的最终结果呈现更漂亮的图片,这意味着在引擎盖下仍然存在相同的残酷RAM消费正在进行中

Dan*_*don 5

这并不坏.它很大程度上取决于分区的粒度.Cogroup将首先通过磁盘中的密钥对不同的执行程序节点进行洗牌.对于每个键,是的,对于两个RDD,具有该键的所有元素的整个集合将被加载到RAM中并提供给您.但是并非所有键都必须在任何给定时间都在RAM中,因此除非您的数据真的偏斜,否则您不会受到太大影响.