數(shù)據(jù)開發(fā)中,這些讓你頭疼過嗎?
數(shù)據(jù)發(fā)散
什么是數(shù)據(jù)發(fā)散
在join的過程中,關(guān)聯(lián)鍵出現(xiàn)一對(duì)多,或者多對(duì)多時(shí)候,造出結(jié)果存在重復(fù)。
數(shù)據(jù)發(fā)散癥狀
癥狀
(1)結(jié)果存在重復(fù)。
(2)數(shù)據(jù)量劇增。
(3)可能導(dǎo)致無法使用正常資源處理完成。
排查
(1)出現(xiàn)這種原因就是
A left join B 的時(shí)候,使用主鍵的關(guān)聯(lián)條件中,沒有關(guān)聯(lián)到表B的最小粒度。
(2)查找是否是這種原因
select 關(guān)聯(lián)字段 from table group by 關(guān)聯(lián)字段 having count(關(guān)聯(lián)字段)>1 就可以判定是否有關(guān)聯(lián)字段出現(xiàn)不唯一的發(fā)散情況。
避免或解決
(1)如果右表關(guān)聯(lián)字段有重復(fù)值則要去重,否則數(shù)據(jù)會(huì)發(fā)散。
(2)仔細(xì)寫好SQL,是否存在業(yè)務(wù)邏輯的錯(cuò)誤(關(guān)聯(lián)字段用錯(cuò))。
笛卡兒積
什么是笛卡兒積
笛卡爾積在SQL中的實(shí)現(xiàn)方式既是交叉連接(Cross Join)。所有連接方式都會(huì)先生成臨時(shí)笛卡爾積表,笛卡爾積是關(guān)系代數(shù)里的一個(gè)概念,表示兩個(gè)表中的每一行數(shù)據(jù)任意組合 。
笛卡兒積案例
A表
id | name | city |
---|---|---|
1 | aa | 1001 |
2 | bb | 1002 |
3 | cc | 1003 |
B表
id | city_name |
---|---|
1 | a城 |
2 | b城 |
3 | c城 |
SQL
- SELECT * FROM A,B;
結(jié)果
id | name | city | id | city_name |
---|---|---|---|---|
1 | aa | 1001 | 1 | a城 |
1 | aa | 1001 | 2 | bb |
1 | aa | 1001 | 3 | c城 |
2 | bb | 1002 | 1 | a城 |
2 | bb | 1002 | 2 | bb |
2 | bb | 1002 | 3 | c城 |
3 | cc | 1003 | 1 | a城 |
3 | cc | 1003 | 2 | bb |
3 | cc | 1003 | 3 | c城 |
產(chǎn)生原因
(1)當(dāng)連接沒有on條件是,會(huì)出現(xiàn)笛卡爾積(全部笛卡爾積)。
(2)當(dāng)連接on條件是非唯一字段時(shí),會(huì)出現(xiàn)笛卡爾積(局部笛卡爾積)。
(3)join的兩個(gè)表中都含有空值。
怎么避免或解決
(1)關(guān)聯(lián)范圍在最小粒度的列.
(2)檢查表的關(guān)聯(lián)字段是否有空值。
數(shù)據(jù)傾斜
什么是數(shù)據(jù)傾斜
數(shù)據(jù)傾斜最籠統(tǒng)概念就是數(shù)據(jù)的分布不平衡,有些地方數(shù)據(jù)多,有些地方數(shù)據(jù)少。在計(jì)算過程中有些地方數(shù)據(jù)早早地處理完了,有些地方數(shù)據(jù)遲遲沒有處理完成,造成整個(gè)處理流程遲遲沒有結(jié)束,這就是最直接數(shù)據(jù)傾斜的表現(xiàn)。
數(shù)據(jù)傾斜癥狀
Hive
hive自身的MR引擎:發(fā)現(xiàn)所有的map task全部完成,并且99%的reduce task完成,只剩下一個(gè)或者少數(shù)幾個(gè)reduce task一直在執(zhí)行,這種情況下一般都是發(fā)生了數(shù)據(jù)傾斜。說白了就是Hive的數(shù)據(jù)傾斜本質(zhì)上是MapReduce的數(shù)據(jù)傾斜。
Flink
(1)Flink 任務(wù)出現(xiàn)數(shù)據(jù)傾斜的直觀表現(xiàn)是任務(wù)節(jié)點(diǎn)頻繁出現(xiàn)反壓。
(2)部分節(jié)點(diǎn)出現(xiàn) OOM異常,是因?yàn)榇罅康臄?shù)據(jù)集中在某個(gè)節(jié)點(diǎn)上,導(dǎo)致該節(jié)點(diǎn)內(nèi)存被爆,任務(wù)失敗重啟。
Spark
(1)Executor lost,OOM,Shuffle過程出錯(cuò)。
(2)Driver OOM。
(3)單個(gè)Executor執(zhí)行時(shí)間特別久,整體任務(wù)卡在某個(gè)階段不能結(jié)束。
(4)正常運(yùn)行的任務(wù)突然失敗。
怎么避免或解決
不管再出現(xiàn)分布式計(jì)算框架出現(xiàn)數(shù)據(jù)傾斜問題解決思路如下:很多數(shù)據(jù)傾斜的問題,都可以用和平臺(tái)無關(guān)的方式解決,比如更好的數(shù)據(jù)預(yù)處理,異常值的過濾等。因此,解決數(shù)據(jù)傾斜的重點(diǎn)在于對(duì)數(shù)據(jù)設(shè)計(jì)和業(yè)務(wù)的理解,這兩個(gè)搞清楚了,數(shù)據(jù)傾斜就解決了大部分了。關(guān)注這幾個(gè)方面:
業(yè)務(wù)邏輯方面
(1)數(shù)據(jù)預(yù)處理。
(2)解決熱點(diǎn)數(shù)據(jù):分而治之(第一次打散計(jì)算,第二次再最終聚合計(jì)算)。
程序代碼層面
(1)導(dǎo)致最終只有一個(gè)Reduce任務(wù)的,需要想到用替代的關(guān)鍵字或者算子去提升Reduce任務(wù)數(shù)。
(2)調(diào)參。
熟悉自己手中的工具(框架)
優(yōu)秀的框架已經(jīng)負(fù)重前行給你優(yōu)化了好多不僅要學(xué),更學(xué)會(huì)去用,更要努力去完善拓展框架功能。