Spark 中:窄依賴:上游 RDD 流向至多一個下游 RDD ;寬依賴:上游 RDD 流向多個下游 RDD 。
這里的寬和窄,說的是當前節點流向下游節點,當前節點數據是否會分區變多份。
寬依賴往往需要 shuffle 操作,stage 會增加。寬依賴導致當前節點分區,可
能增加數據傳輸量,下游故障導致當前整個 RDD 重新計算,浪費。不同算子產生
相應的寬窄依賴。
Flink 中也有 stage 的概念,叫 task,多個算子合成一個 task,合成條件要滿足:
- 上下游的並行度一致
- 下游節點的入度為1 (也就是說下游節點沒有來自其他節點的輸入)
- 上下游節點都在同一個 slot group 中(下面會解釋 slot group)
- 下游節點的 chain 策略為 ALWAYS(可以與上下游鏈接,map、flatmap、filter等默認是ALWAYS)
- 上游節點的 chain 策略為 ALWAYS 或 HEAD(只能與下游鏈接,不能與上游鏈接,Source默認是HEAD)
- 兩個節點間數據分區方式是 forward(參考理解數據流的分區) 用戶沒有禁用 chain