當(dāng)我們?cè)诓僮鞅磉M(jìn)行join時(shí),如何盡可能的避免shuffle過程升敲?
(1)設(shè)置分?jǐn)?shù)函數(shù)和分?jǐn)?shù)數(shù)一樣
兩個(gè)RDD進(jìn)行join操作前,對(duì)其分別執(zhí)行了paritionBy 算子操作,并執(zhí)行力分區(qū)函數(shù)和分區(qū)數(shù):分區(qū)函數(shù)使用了HashPartition绒净,分區(qū)數(shù)分別為1和2催训。
分區(qū)函數(shù)一樣洽议、分區(qū)數(shù)不一樣
上圖中可以看到,兩個(gè)RDD發(fā)生join 是個(gè)寬依賴漫拭,是發(fā)生shuffle了的绞铃;那如何避免shuffle呢?
讓join操作變成窄依賴便不會(huì)產(chǎn)生shuffle了嫂侍,需要讓兩個(gè)RDD的分區(qū)函數(shù)和分區(qū)一樣即刻實(shí)現(xiàn)窄依賴的效果〖晕耄看下圖就可以簡單了解到挑宠。
分區(qū)函數(shù)、分區(qū)數(shù)一樣
(2)使用map-side join 替換掉join
這個(gè)場景有點(diǎn)局限了颓影,其中一個(gè)表不能過大各淀,因?yàn)樾枰M(jìn)行廣播,如果太大诡挂,那么廣播到executor端碎浇,會(huì)占用的內(nèi)存過大。