Spark Join 源碼剖析①

一滔吠、Join 邏輯計(jì)劃生成

和 Join 相關(guān)的邏輯層的優(yōu)化規(guī)則主要包含以下幾種:

ReorderJoin

EliminateOuterJoin

????DPP 動態(tài)分區(qū)裁剪

以及

????PushDownPredicates

中和 Join 相關(guān)的 predicate pushDown

二纲菌、Join 物理計(jì)劃生成和選取

2.1、基本概念

在 Spark SQL 中疮绷,參與 Join 操作的兩張表分別被稱為流式表(StreamTable)和構(gòu)件表(BuildTable)翰舌,不同表的角色在 Spark SQL 中會通過一定的策略進(jìn)行設(shè)定。通常來講冬骚,系統(tǒng)會將大表設(shè)置為 StreamTable椅贱,小表設(shè)置為 BuildTable。流式表的迭代器為 streamIter只冻,構(gòu)建表的迭代器為 buildIter庇麦。遍歷 streamIter 的每一條記錄,然后在 buildIter 中查找匹配的記錄喜德。這個(gè)查找過程稱為 build 過程山橄。每次 build 操作的結(jié)果為一條 JoinedRow(A, B),其中 A 來自 streamedIter住诸,B 來自 buildIter驾胆。

再例如涣澡,在 BroadcastHashJoin 中需要決定廣播哪個(gè)數(shù)據(jù)表。這里的 BuildSide 可以簡單理解為 “構(gòu)建的一邊”丧诺。

在 Spark 中入桂,BuildSide 作為一個(gè)抽象類,包含 BuildLeft 和 BuildRight 兩個(gè)子類驳阎,一般在構(gòu)造 Join 的執(zhí)行算子時(shí)抗愁,都會傳入一個(gè) BuildSide 的構(gòu)造參數(shù)。在 JoinSelection 中通過 canBuildRightcanBuildLeft 判斷一個(gè) Join 類型能否 “構(gòu)建” 右表和左表呵晚。

2.2蜘腌、物理計(jì)劃選取順序

Join 物理執(zhí)行計(jì)劃的選取在 JoinSelection 中進(jìn)行,其主要邏輯如下:

如果是一個(gè)等值 join(equi-join)且包含 join hint饵隙,我們依次查看 join hint:

  1. broadcast hint:如果 join 類型支持撮珠,使用 broadcast hash join。如果 left 和 right 都有 broadcast hint金矛,選擇 size 較小的一側(cè)(基于統(tǒng)計(jì)數(shù)據(jù))進(jìn)行 broadcast
  2. sort merge hint:如果 join keys 是可排序的芯急,使用 sort merge join。
  3. shuffle hash hint:如果 join 類型支持驶俊,如果 left 和 right 都設(shè)置了 shuffle hash hints娶耍,選擇 size 較小的一側(cè)作為 build side
  4. shuffle replicate NL hint:如果 join type 為 inner like,使用 cartesian product join(笛卡爾積)

JoinSelection 通過 ExtractEquiJoinKeys 來判斷是否為等值 Join 并提取相關(guān)信息:


如果沒有指定 hint 或 hint 不適用饼酿,Join 選擇順序如下:

  1. 嘗試選用 broadcast hash join:如果 join 類型支持榕酒,且 join 的一側(cè) size 足夠小能夠 broadcast。如果都足夠小故俐,選擇更小的一側(cè)進(jìn)行 broadcast(基于統(tǒng)計(jì)數(shù)據(jù))
  2. 嘗試選用 shuffle hash join:如果 join 類型支持想鹰,且 join 的一側(cè) size 足夠小能夠構(gòu)建 local hash map,且該側(cè) size 顯著小于另一側(cè)药版,且 spark.sql.join.preferSortMergeJoin 為 false
  3. 嘗試選用 sort merge join:如果 join keys 是可排序的
  4. 嘗試選用笛卡爾積:如果是 inner like join
  5. 嘗試選用 broadcast nested loop join:最后的兜底手段杖挣,可能會 OOM,如果這里 OOM 了刚陡,也沒辦法了

2.3、等值 Join 情況

注①:

createJoinWithoutHint 如下:

2.4株汉、非等值 Join 情況

三筐乳、Join 物理計(jì)劃執(zhí)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市乔妈,隨后出現(xiàn)的幾起案子蝙云,更是在濱河造成了極大的恐慌,老刑警劉巖路召,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勃刨,死亡現(xiàn)場離奇詭異波材,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)身隐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門廷区,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贾铝,你說我怎么就攤上這事隙轻。” “怎么了垢揩?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵玖绿,是天一觀的道長。 經(jīng)常有香客問我叁巨,道長斑匪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任锋勺,我火速辦了婚禮蚀瘸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宙刘。我一直安慰自己苍姜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布悬包。 她就那樣靜靜地躺著衙猪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪布近。 梳的紋絲不亂的頭發(fā)上垫释,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音撑瞧,去河邊找鬼棵譬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛预伺,可吹牛的內(nèi)容都是我干的订咸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼酬诀,長吁一口氣:“原來是場噩夢啊……” “哼脏嚷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞒御,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤父叙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趾唱,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涌乳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甜癞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夕晓。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖带欢,靈堂內(nèi)的尸體忽然破棺而出运授,到底是詐尸還是另有隱情,我是刑警寧澤乔煞,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布吁朦,位于F島的核電站,受9級特大地震影響渡贾,放射性物質(zhì)發(fā)生泄漏逗宜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一空骚、第九天 我趴在偏房一處隱蔽的房頂上張望纺讲。 院中可真熱鬧,春花似錦囤屹、人聲如沸熬甚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乡括。三九已至,卻和暖如春智厌,著一層夾襖步出監(jiān)牢的瞬間诲泌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工铣鹏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敷扫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓诚卸,卻偏偏與公主長得像葵第,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子合溺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容