背景:我在建設(shè)DW層的時(shí)候,創(chuàng)建了一個(gè)hudi寬表,此hudi寬表的數(shù)據(jù)來(lái)源于STL層的兩個(gè)全量表的關(guān)聯(lián)(1.手術(shù)及操作記錄表,2.住院開(kāi)單醫(yī)囑明細(xì)表),手術(shù)及操作記錄表的數(shù)據(jù)量在460萬(wàn)條數(shù)據(jù),住院開(kāi)單醫(yī)囑明細(xì)表的數(shù)據(jù)量在6億條數(shù)據(jù)。
這兩個(gè)表在以醫(yī)療機(jī)構(gòu)代碼和就診流水號(hào)join關(guān)聯(lián)的時(shí)候會(huì)導(dǎo)致笛卡爾積,所以我得探查一下數(shù)據(jù)發(fā)散的問(wèn)題,發(fā)現(xiàn)關(guān)聯(lián)后的總數(shù)據(jù)量在3億條數(shù)據(jù),關(guān)聯(lián)上的住院開(kāi)單醫(yī)囑明細(xì)表的數(shù)據(jù)在1億條,數(shù)據(jù)并不很發(fā)散。
但是如果將此批數(shù)據(jù)只寫(xiě)一個(gè)spark腳本,一次性導(dǎo)入到hudi表中有可能會(huì)導(dǎo)致數(shù)據(jù)傾斜的問(wèn)題,所以我們采取按分片導(dǎo)入的方法,首先去探查每個(gè)醫(yī)療機(jī)構(gòu)對(duì)應(yīng)的數(shù)據(jù)量大小,導(dǎo)入數(shù)據(jù)的時(shí)候用where條件過(guò)濾,將數(shù)據(jù)量大的醫(yī)療機(jī)構(gòu)單獨(dú)導(dǎo)入,將數(shù)據(jù)量小的醫(yī)療機(jī)構(gòu)一起導(dǎo)入,編寫(xiě)多個(gè)腳本,創(chuàng)建一個(gè)dolphinschedule工作流,編寫(xiě)多個(gè)spark腳本,分批實(shí)現(xiàn)Hudi表的數(shù)據(jù)初始化,以防止數(shù)據(jù)傾斜的產(chǎn)生。
每個(gè)Spark腳本任務(wù)的配置如下:
deployed-mode:client
driver-cores:2
driver-memory:6G
executor-number:60
executor-memory:6G
executor-cores:2
將編寫(xiě)好的4個(gè)spark腳本,導(dǎo)入到新建的dolphinschduler工作流中,在凌晨3點(diǎn)(這個(gè)時(shí)候集群的資源比較充足)定時(shí)調(diào)度初始化腳本,第一個(gè)spark腳本的數(shù)據(jù)量在一億條左右,第二個(gè)spark腳本也是一億一千萬(wàn)左右,第四個(gè)腳本是七百萬(wàn)左右數(shù)據(jù)量,第三個(gè)spark腳本本來(lái)是八千萬(wàn)左右數(shù)據(jù)量,但是由于我復(fù)制腳本的時(shí)候錯(cuò)了,把第二個(gè)腳本又復(fù)制了一遍到第三個(gè)spark腳本上,所以導(dǎo)致第三個(gè)腳本的數(shù)據(jù)量還是一億一千萬(wàn),運(yùn)行到第三個(gè)腳本報(bào)錯(cuò),錯(cuò)誤日志如下。
錯(cuò)誤日志:
Caused by:org.apache.spark.SparkException:
Job abort due to stage failure:ShuffleMapSatge 27(flatMapToPair at SparkHoodieBloomIndexHelper.java:109) has failed the maximum allowable number of times:4.
Most recent failure reason:org.apache.spark.shuffle.FetchFailedException:The relative remote executor(Id:78),which maintains the block data to fetch is dead.
大概意思是:保持獲取block塊數(shù)據(jù)的相對(duì)較遠(yuǎn)的executor死掉了
錯(cuò)誤日志,如下圖:原因:
資源不足導(dǎo)致executor沒(méi)有心跳,driver就判定其丟失,就去連其他的executor,但其他的因?yàn)榕渲枚家粯樱砸策B不上。重試n次后,就會(huì)報(bào)錯(cuò)。
解決:
找一個(gè)集群資源相對(duì)空閑的時(shí)間,去運(yùn)行第三個(gè)和第四個(gè)Spark腳本。
參考文章:
https://blog.csdn.net/qq_34224565/article/details/126280337