hive大數(shù)據(jù)教程 hive數(shù)據(jù)傾斜解決辦法?
hive數(shù)據(jù)傾斜解決辦法?數(shù)據(jù)向下的原因:在進(jìn)行shuffle的時(shí)候,要將各個(gè)節(jié)點(diǎn)上相同的key拉取到某個(gè)節(jié)點(diǎn)上的一個(gè)task來進(jìn)行處理,諸如按照key并且聚合或join等操作。此時(shí)假如某個(gè)key對(duì)應(yīng)
hive數(shù)據(jù)傾斜解決辦法?
數(shù)據(jù)向下的原因:在進(jìn)行shuffle的時(shí)候,要將各個(gè)節(jié)點(diǎn)上相同的key拉取到某個(gè)節(jié)點(diǎn)上的一個(gè)task來進(jìn)行處理,諸如按照key并且聚合或join等操作。此時(shí)假如某個(gè)key對(duì)應(yīng)的數(shù)據(jù)量而且大的話,都會(huì)不可能發(fā)生數(shù)據(jù)向下。諸如大部分key不對(duì)應(yīng)10條數(shù)據(jù),只不過個(gè)別key卻不對(duì)應(yīng)了100萬條數(shù)據(jù),那就大部分task肯定就只會(huì)分配到10條數(shù)據(jù),接著1秒鐘就不運(yùn)行完了;但是其它task可能先分配到了100萬數(shù)據(jù),要正常運(yùn)行一兩個(gè)小時(shí)。
解決方案:
第一點(diǎn):真接過濾處理掉那些過多下沉的Key。這種方法很簡單的,呢既然你傾斜,那我你不你就好了。比如,共有有100萬個(gè)key。只有2個(gè)key,是數(shù)據(jù)量提升到10萬的。其他所有的key,按的數(shù)量都是幾十,那樣join后會(huì)紊亂向外傾斜。此時(shí)此刻,自己是可以去取舍,如果沒有業(yè)務(wù)和需求這個(gè)可以明白和給予的話,在從hive表查詢?cè)磾?shù)據(jù)的時(shí)候,真接在sql中用where條件,過濾掉某幾個(gè)key。這樣這幾個(gè)原來有大量數(shù)據(jù),會(huì)導(dǎo)致數(shù)據(jù)向外傾斜的key,被過濾后掉之后,那么在的spark作業(yè)中,自然就不會(huì)再一次發(fā)生數(shù)據(jù)傾斜了。
第二點(diǎn):HiveETL做處理
通過HiveETL作好對(duì)數(shù)據(jù)聽從key參與聚合,也可以是預(yù)先和其他表并且join,接著在Spark作業(yè)中是對(duì)的數(shù)據(jù)源就不是原來的Hive表了,只是預(yù)處理后的Hive表。此時(shí)由于數(shù)據(jù)已經(jīng)預(yù)先參與過聚合或join操作了,這樣的話在Spark作業(yè)中也就不不需要可以使用原先的shuffle類算子負(fù)責(zé)執(zhí)行這類能操作了。Hive ETL中通過group by或是join等shuffle操作時(shí),我還是會(huì)直接出現(xiàn)數(shù)據(jù)傾斜,造成Hive ETL的速度很慢。我們只不過是把數(shù)據(jù)偏轉(zhuǎn)的發(fā)生晚幾天到了HiveETL中。
第三點(diǎn):能提高shuffle的操作分頭并進(jìn)度在對(duì)RDD不能執(zhí)行shuffle算子時(shí),給shuffle算子傳去一個(gè)參數(shù),比如reducebykey(1000),該參數(shù)就系統(tǒng)設(shè)置了這個(gè)shuffle算子執(zhí)行時(shí)shufflereadtask的數(shù)量。對(duì)此SparkSQL中的shuffle類語句,.例如group by、join等。
如何查看hive的元數(shù)據(jù)存儲(chǔ)位置?
可以不在hive的配置文件中欄里點(diǎn),hive在安裝好前要配置元數(shù)據(jù)的存儲(chǔ)