V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
belcher
V2EX  ›  Hadoop

spark 的 shuffle 算子一定会产生宽依赖吗?

  •  
  •   belcher · 2019-01-19 20:56:29 +08:00 via Android · 4863 次点击
    这是一个创建于 2170 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天朋友抛出一个很有意思的结论: shuffle 不一定产生宽依赖,但是宽依赖一定是由 shuffle 产生的。 我想了好久,有没有这种情况,在极端情况下,就算使用了 shuffle 算子,父子 rdd 的 partition 依然是一对一的关系,这样实际就没有形成宽依赖虽然使用了 shuffle 算子。 熟悉 spark 的大佬,谁对这一块比较熟,不吝赐教!

    5 条回复    2019-01-20 22:36:15 +08:00
    bsidb
        1
    bsidb  
       2019-01-19 21:02:46 +08:00
    当两个参加 join 的 RDD 的 partitioner 是同一个对象时,会产生窄依赖而不是宽依赖。在这种情况下,两个 RDD 之间只要对应的 partition 互相 join 即可,不会产生宽依赖问题。

    RDD 的 partitioner 有专门的 API 设置,不设置则为 None。
    belcher
        2
    belcher  
    OP
       2019-01-19 21:20:04 +08:00 via Android
    @bsidb 我懂了,分区规则一样,join 的时候 partition 就不存在一对多的情况了,也就是 shuffle 算子不一定产生宽依赖。那么,宽依赖一定是由 shuffle 产生的,这句话是对的么,有没有特例?
    cyspy
        3
    cyspy  
       2019-01-20 00:18:35 +08:00
    shuffle 是用来解决宽依赖问题的一个方法,而可能产生宽依赖的算子就可以叫做 shuffle 算子。
    jakson
        4
    jakson  
       2019-01-20 22:23:59 +08:00
    个人看法:
    shuffle 一定是宽依赖,源码中对宽窄依赖,是根据算子的名称来定的(我记得源码里面是这样的,宽窄依赖也是这样定的)。
    他的意思是即使是宽依赖,但不一定会有数据的网络传输吧
    belcher
        5
    belcher  
    OP
       2019-01-20 22:36:15 +08:00 via Android
    @jakson 问题就在这,概念上是你说的这样的。宽依赖本质是父 rdd 的一个 partition 被多个子 rdd 的 partition 共享,就是一对多。那么如果使用了 shuffle 算子之后,父 rdd 的一个 partition 并没有被多个子 rdd 的 partition 共享,而是只分配给了一个子 rdd 的 partition,这还算宽依赖吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2426 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:57 · PVG 23:57 · LAX 07:57 · JFK 10:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.