寬依賴窄依賴的關(guān)系
答:
相比于寬依賴,窄依賴對(duì)優(yōu)化很有利,主要基于以下兩點(diǎn):
寬依賴往往對(duì)應(yīng)著Shuffle操作,需要在運(yùn)行過(guò)程中將同一個(gè)父RDD的分區(qū)傳入到不同的子RDD分區(qū)中,中間可能涉及多個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)傳輸;而窄依賴的每個(gè)父RDD的分區(qū)只會(huì)傳入到一個(gè)子RDD分區(qū)中,通常可以在一個(gè)節(jié)點(diǎn)內(nèi)完成轉(zhuǎn)換。
當(dāng)RDD分區(qū)丟失時(shí)(某個(gè)節(jié)點(diǎn)故障),Spark會(huì)對(duì)數(shù)據(jù)進(jìn)行重算
對(duì)于窄依賴,由于父RDD的一個(gè)分區(qū)只對(duì)應(yīng)一個(gè)子RDD分區(qū),這樣只需要重算和子RDD分區(qū)對(duì)應(yīng)的父RDD分區(qū)即可,所以這個(gè)重算對(duì)數(shù)據(jù)的利用率是100%的
對(duì)于寬依賴,重算的父RDD分區(qū)對(duì)應(yīng)多個(gè)子RDD分區(qū)的,這樣實(shí)際上父RDD中只有一部分的數(shù)據(jù)是被用于恢復(fù)這個(gè)丟失的子RDD分區(qū)的,另一部分對(duì)應(yīng)子RDD的其他未丟失分區(qū),這就造成了多余的計(jì)算;更一般的,寬依賴中子RDD分區(qū)通常來(lái)自多個(gè)父RDD分區(qū),極端情況下,所有的父RDD分區(qū)都要進(jìn)行重新計(jì)算。
區(qū)分這兩種依賴很有用,首先,窄依賴允許在一個(gè)集群節(jié)點(diǎn)上以流水線的方式計(jì)算所有父分區(qū),
而寬依賴則需要首先計(jì)算好所有父分區(qū)數(shù)據(jù),然后在節(jié)點(diǎn)之間進(jìn)行Shuffle,這與MapReduce類似。
第二窄依賴能夠更有效地進(jìn)行失效節(jié)點(diǎn)的恢復(fù),即只需要重新計(jì)算丟失分區(qū)的父分區(qū),而且不同節(jié)點(diǎn)之間可以并行計(jì)算;而對(duì)于一個(gè)寬依賴的Lineage圖,單個(gè)節(jié)點(diǎn)失效可能導(dǎo)致這個(gè)RDD的所有祖先丟失部分分區(qū),因而需要整體重新計(jì)算。








暫無(wú)數(shù)據(jù)