有迹象表明Spark中的连接是使用/基于cogroup函数/ primitive / transform实现的。因此,让我首先关注cogroup - 它返回一个RDD结果,该结果基本上由cogrouped RDD的所有元素组成。换句话说 - 对于每个cogrouped RDD中的每个键,存在来自至少一个cogrouped RDD的至少一个元素。
这意味着当更小时,还需要流式传输,例如JavaPairDstreamRDDs继续加入更大的批量RDD,这将导致为结果的多个实例分配RAM(cogrouped)RDD a.k.a本质上是大批量RDD以及更多... 显然,当DStream RDD丢弃并且它们定期执行时,RAM将被返回,但这仍然是RAM消耗中不必要的峰值
我有两个问题:
无论如何,更“精确”地控制cogroup过程,例如告诉它包括我的cogrouped RDD only元素,其中每个给定键的cogrouped RDD的EACH中至少有一个元素。基于当前的cogroup API,这是不可能的
如果cogroup真的是这样一个大锤,其次连接是基于cogroup那么即使他们可以根据最终用户可见的最终结果呈现更漂亮的图片这意味着在引擎盖下
答案 0 :(得分:5)
不是那么糟糕。它很大程度上取决于分区的粒度。 Cogroup将首先通过磁盘中的密钥对不同的执行程序节点进行洗牌。对于每个键,是的,对于两个RDD,具有该键的所有元素的整个集合将被加载到RAM中并提供给您。但是并非所有键都必须在任何给定时间都在RAM中,因此除非您的数据真的偏斜,否则您不会受到太大影响。