hive迷案之?dāng)?shù)據(jù)異常

hive運(yùn)行一個(gè)查詢(xún)呼股,可能會(huì)由于各種原因失敗,但不應(yīng)該出現(xiàn)執(zhí)行成功画恰,但數(shù)據(jù)結(jié)果不正確彭谁。同樣的sql查詢(xún),同樣的數(shù)據(jù)允扇,卻出現(xiàn)了某一次查詢(xún)缠局,沒(méi)有報(bào)錯(cuò),但數(shù)據(jù)異常考润,且只此一次狭园,再也無(wú)法重現(xiàn)了。經(jīng)過(guò)幾天的排查糊治,終于找到了原因妙啃。

經(jīng)過(guò):
2018-04-02凌晨,數(shù)倉(cāng)同學(xué)收到數(shù)據(jù)質(zhì)量報(bào)警俊戳,某個(gè)字段的唯一性檢查沒(méi)有通過(guò)揖赴。一般情況下,這種問(wèn)題是由臟數(shù)據(jù)引起的抑胎。然而這一次排查發(fā)現(xiàn)上游數(shù)據(jù)沒(méi)有問(wèn)題燥滑,于是數(shù)倉(cāng)同學(xué)嘗試直接通過(guò)hive命令進(jìn)行操作,這次結(jié)果正確了阿逃,能通過(guò)數(shù)據(jù)質(zhì)量檢查铭拧。之后我又重試了很多次,再也無(wú)法重現(xiàn)數(shù)據(jù)錯(cuò)誤的那種情況恃锉。

調(diào)研過(guò)程:
1.排除了數(shù)據(jù)源的數(shù)據(jù)變化搀菩,以及查詢(xún)語(yǔ)句的改動(dòng)。
2.看那一次查詢(xún)的運(yùn)行日志破托,找到其中的job的日志肪跋,與正常情況下的job日志對(duì)比
循著explain出來(lái)的執(zhí)行計(jì)劃往前追溯,找到異常最早出現(xiàn)在stage1的job土砂。對(duì)比如下:




在錯(cuò)誤的case下州既,reduce input records 小于map output records。這里combine 的records為0萝映,且有相同數(shù)據(jù)的查詢(xún)做為對(duì)比吴叶,不會(huì)是因?yàn)槟承﹌ey被過(guò)濾而引起的。所以這里這是一個(gè)異常情況序臂。
看一下執(zhí)行計(jì)劃蚌卤,這是一個(gè)普通的join的job



再看一下這個(gè)job的執(zhí)行情況

maps和reduces各有三次被kill


由于speculation execution 被kill是常見(jiàn)的,但是可見(jiàn)有一個(gè)map 和一個(gè)reduce是由于NodeX:8800 不可用引起的奥秆。

到這里變成了兩個(gè)問(wèn)題:1. NodeX:8800 為什么會(huì)不可用逊彭;2.為什么這個(gè)不可用會(huì)造成數(shù)據(jù)結(jié)果有問(wèn)題

對(duì)于第一個(gè)問(wèn)題,首先找到task的日志中不可用的具體時(shí)間吭练,在00:33左右诫龙,然后查看node manager的日志,但是沒(méi)找到線索鲫咽。又想到我們集群設(shè)置了如果某個(gè)datanode的磁盤(pán)使用率如果大于90%的話(huà)签赃,node manager會(huì)通知resource manager當(dāng)前這個(gè)節(jié)點(diǎn)不可用。查看NodeX的當(dāng)前狀態(tài)分尸,果然當(dāng)前的使用率在87%锦聊,已經(jīng)很接近90%。凌晨同時(shí)加上map和reduce任務(wù)箩绍,超90%也在情理之中孔庭,基本上就是這個(gè)原因了。那么為什么這個(gè)節(jié)點(diǎn)負(fù)載這么高,平時(shí)我們hdfs也會(huì)做均衡圆到。經(jīng)過(guò)排查怎抛,發(fā)現(xiàn)有一個(gè)job已經(jīng)運(yùn)行了3天還沒(méi)跑完焊刹,應(yīng)該是數(shù)據(jù)傾斜了长搀,其有一個(gè)reduce task正是運(yùn)行在NodeX上,kill之后負(fù)載就下來(lái)了束凑。

繼續(xù)看第二個(gè)問(wèn)題挣菲,由于是reduce的input records不對(duì)富稻,首先懷疑reduce階段的問(wèn)題。把四個(gè)成功reduce的日志放到一起白胀,統(tǒng)計(jì)reduce的讀寫(xiě)數(shù)據(jù)量椭赋,并與正確情況對(duì)比』蚋埽可惜對(duì)比兩次正確的執(zhí)行哪怔,發(fā)現(xiàn)其中的讀寫(xiě)數(shù)據(jù)量也會(huì)有少量差異,可能與中間結(jié)果的壓縮有關(guān)廷痘。然后考慮對(duì)比每個(gè)reduce的output records蔓涧,找到具體哪個(gè)reduce出的錯(cuò),然而對(duì)比兩次正確的執(zhí)行笋额,其中每個(gè)reduce 的output records量仍然不同元暴,也就是說(shuō)每次執(zhí)行其分區(qū)結(jié)果并不完全一樣

從這些log中得到信息只有:某一個(gè)reduce讀取的map out put 文件是新的map task生成的兄猩,而其他三個(gè)reduce讀取的是由于NodeX不可用被kill的task生成的茉盏。但是即使如此,也不應(yīng)該有問(wèn)題枢冤,因?yàn)閮蓚€(gè)task生成的map output應(yīng)該是一樣的鸠姨。

到這里沒(méi)線索了,干脆來(lái)理一下當(dāng)時(shí)的場(chǎng)景:
1.這個(gè)job正在執(zhí)行淹真,共19個(gè)map task
2.map task 都正確輸出了output file讶迁,4 個(gè) reduce task 啟動(dòng)了
3.其中三個(gè)reduce task處理的數(shù)據(jù)量較小,已經(jīng)讀取了NodeX上的map task的輸出: attempt_1496659744394_1860537_m_000003_0
4.NodeX由于磁盤(pán)負(fù)載問(wèn)題不可用核蘸,RM通知AM巍糯,AM收到通知后,kill了NodeX上的map task 和reduce task
5.AM啟動(dòng)了新的map task客扎,執(zhí)行結(jié)束后生成output file: attempt_1496659744394_1860537_m_000003_1
6.AM啟動(dòng)了新的reduce task祟峦,讀取attempt_1496659744394_1860537_m_000003_1
其中還有幾個(gè)因?yàn)閟peculation execution被kill的task,以及被map task 搶占的reduce task

在這個(gè)過(guò)程中徙鱼,問(wèn)題只可能出在5宅楞,6步中新建的map和reduce task中,懷疑是新的map和reduce task中的分區(qū)方式不一樣。關(guān)于分區(qū)方式其實(shí)有一個(gè)疑問(wèn)厌衙,就是上文加粗部分距淫,為什么每次執(zhí)行,分區(qū)結(jié)果都是不同的迅箩?把map和reduce的日志級(jí)別改到TRACE溉愁,在日志中尋找關(guān)于分區(qū)的線索,沒(méi)找到饲趋; 又仔細(xì)看了hive的代碼,join的時(shí)候會(huì)以join columns的值生成 partition key撤蟆,然后生成hashcode 奕塑,最后在collect的時(shí)候?qū)ashcode取余進(jìn)行分區(qū),這其中每一步都是deterministic的家肯,固定的輸入最后的分區(qū)結(jié)果一定是一樣的龄砰。問(wèn)題到底出在哪里?

似乎又沒(méi)線索了讨衣,于是把從輸入查詢(xún)語(yǔ)句到執(zhí)行結(jié)束整個(gè)過(guò)程再梳理一遍换棚。分析了查詢(xún)語(yǔ)句之后,終于搞清楚了反镇。查詢(xún)語(yǔ)句中有如下用法:

...
from (select 
         ...
          if(x_id>0,cast(concat(substr(x_id,0,2),'0000') as int),cast(ceiling(rand()*-65535) as bigint)) AS y_id,
          ...
          from db.tbl) a
left join(select id,name from db.tbl2)l on a.y_id=l.id
...

為了解決數(shù)據(jù)傾斜問(wèn)題固蚤,y_id中的一部分?jǐn)?shù)據(jù)是隨機(jī)生成的,而y_id又是join key歹茶,所以一個(gè)split中會(huì)有一部分?jǐn)?shù)據(jù)是隨機(jī)分區(qū)的夕玩。在上述這種不幸的場(chǎng)景下,示意圖如下惊豺,一共4個(gè)reduce task燎孟,三個(gè)從attempt_1496659744394_1860537_m_000003_0獲取分區(qū)數(shù)據(jù),一個(gè)從attempt_1496659744394_1860537_m_000003_1獲取分區(qū)數(shù)據(jù)尸昧,由于部分?jǐn)?shù)據(jù)key的隨機(jī)性揩页,這兩個(gè)map output的文件中的分區(qū)是不一致的。結(jié)果就是有的數(shù)據(jù)會(huì)重復(fù)取烹俗,有的數(shù)據(jù)沒(méi)取到爆侣。



那么怎么解決這個(gè)問(wèn)題呢?幾種辦法
1.改MR框架衷蜓,在這種兩次map的output 中分區(qū)不一致的情況累提,當(dāng)某個(gè)map task被kill,執(zhí)行了新的map task以后磁浇,所以的reduce task都需要重新執(zhí)行斋陪,即使是已經(jīng)成功的reduce task
2.改hive,在hive層確保某個(gè)map task即使被執(zhí)行多次,每次執(zhí)行的分區(qū)結(jié)果都要一致
上述兩種改法代價(jià)都是比較大的无虚,這種有隨機(jī)join key生成的job本身就比較少缔赠,而恰好只有部分reduce task成功的間隙,某個(gè)map task所在的data node不可用的概率也是比較小的友题。
3.workaround:改查詢(xún)語(yǔ)句嗤堰,在生成隨機(jī)的列值之后先插入某個(gè)中間表,然后再取出來(lái)做join度宦,這時(shí)map task的分區(qū)就是確定的了踢匣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市戈抄,隨后出現(xiàn)的幾起案子离唬,更是在濱河造成了極大的恐慌,老刑警劉巖划鸽,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件输莺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡裸诽,警方通過(guò)查閱死者的電腦和手機(jī)嫂用,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丈冬,“玉大人嘱函,你說(shuō)我怎么就攤上這事∫笊撸” “怎么了实夹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粒梦。 經(jīng)常有香客問(wèn)我亮航,道長(zhǎng),這世上最難降的妖魔是什么匀们? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任缴淋,我火速辦了婚禮,結(jié)果婚禮上泄朴,老公的妹妹穿的比我還像新娘重抖。我一直安慰自己,他們只是感情好祖灰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布钟沛。 她就那樣靜靜地躺著,像睡著了一般局扶。 火紅的嫁衣襯著肌膚如雪恨统。 梳的紋絲不亂的頭發(fā)上叁扫,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音畜埋,去河邊找鬼莫绣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悠鞍,可吹牛的內(nèi)容都是我干的对室。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咖祭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掩宜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起心肪,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锭亏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后硬鞍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戴已,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年固该,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糖儡。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伐坏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出握联,到底是詐尸還是另有隱情桦沉,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布金闽,位于F島的核電站纯露,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏代芜。R本人自食惡果不足惜埠褪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挤庇。 院中可真熱鬧钞速,春花似錦、人聲如沸嫡秕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昆咽。三九已至驾凶,卻和暖如春牙甫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狭郑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工腹暖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翰萨。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓脏答,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親亩鬼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子殖告,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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