中文字幕无码青椒影视_人妻系列无码专区按摩好紧_久久 国产手机aⅴ无码_av人摸人人人澡人人超碰_特级婬片国产在线观看_亚洲自偷自拍熟女另类

免費(fèi)注冊(cè)
大數(shù)據(jù)中的數(shù)據(jù)傾斜及解決辦法

大數(shù)據(jù)中的數(shù)據(jù)傾斜及解決辦法

作者: 速優(yōu)云數(shù)據(jù)平臺(tái)架構(gòu)師
閱讀數(shù):290
更新時(shí)間:2024-02-23 20:34:50
大數(shù)據(jù)中的數(shù)據(jù)傾斜及解決辦法
id="%E4%B8%80%E4%BB%80%E4%B9%88%E6%98%AF%E6%95%B0%E6%8D%AE%E5%80%BE%E6%96%9C" class="code-line" dir="auto" data-line="0">一、什么是數(shù)據(jù)傾斜

數(shù)據(jù)傾斜指mapreduce計(jì)算架構(gòu)或flink等流式計(jì)算平臺(tái)下,在進(jìn)行計(jì)算時(shí),發(fā)生的數(shù)據(jù)操作卡在某一個(gè)子計(jì)算任務(wù)而導(dǎo)致整個(gè)任務(wù)被卡住的現(xiàn)象。例如寫hive SQL計(jì)算指標(biāo)時(shí),發(fā)現(xiàn)數(shù)據(jù)從1%到99%很快,確一直卡在99%很長(zhǎng)一段時(shí)間而無法完成任務(wù)。

實(shí)際上,發(fā)生這樣的原因是,在計(jì)算一條SQL的時(shí)候,某個(gè)任務(wù)被分配的key太多了。從而導(dǎo)致,其他任務(wù)很快完成任務(wù),但是某個(gè)任務(wù)確一直在計(jì)算,造成『一人累死,其他人閑死』的情況。

二、MapReduce原理

什么是map任務(wù)?什么是recude任務(wù)呢?

我們知道hive的底層是通過HDFS將文件數(shù)據(jù)存在磁盤上,數(shù)據(jù)以key、value的形式存儲(chǔ),而map操作相當(dāng)于將把key、value鍵值對(duì)讀取出來,重新組合。然后將整理好的數(shù)據(jù),交給recude,reduce進(jìn)行聚合計(jì)算。

舉個(gè)例子,如下數(shù)據(jù):(HDFS文件存儲(chǔ)數(shù)據(jù)時(shí),存在行存儲(chǔ)和列存儲(chǔ)兩種,下面以列存儲(chǔ)為例)

HDFS中存儲(chǔ)文件的格式如下:

(0,"hive spark hive hbase" ) (21,"hadoop hive spark hive" ) (39,"sqoop flume scala scala" )

map操作將對(duì)HDFS文件進(jìn)行分隔,并將每一行分成一個(gè)的<key,value>值(初始的k值是根據(jù)偏移量來的),然后在將<key,value>值,轉(zhuǎn)成如下的格式,并存入緩存中:

(hive,1),(spark,1),(hive,1),(hbase,1);
(hadoop,1),(hive,1),(spark,1), (hive,1);
(sqoop,1),(flume,1),(scala,1), (scala,1);

map操作將不同分區(qū)中的key值進(jìn)行整合排序,存放到一個(gè)集合當(dāng)中,格式如下:

(hive,[1,1,1,1]),(spark,[1,1]),(hbase,[1]),(hadoop,[1]),(sqoop,[1]),(flume,[1]),(scala,[1,1])

隨后,Reduce任務(wù)先處理多個(gè)Map任務(wù)的輸出結(jié)果,再根據(jù)分區(qū)將其分配到不同的Reduce節(jié)點(diǎn)上(這個(gè)過程就是shuffle);Reduce任務(wù)對(duì)多個(gè)Map的輸出結(jié)果進(jìn)行合并、排序、計(jì)算,生成新的 (k,v)  值,具體如下:

(hive,4),(spark,2), (scala,2) ,(hbase,1),(hadoop,1),(sqoop,1),(flume,1)

Reduce任務(wù)會(huì)將上一步輸出的<k,v>寫到HDFS中,生成文件。

三、數(shù)據(jù)傾斜解決方案

數(shù)據(jù)傾斜一般都發(fā)生在reduce階段。

reduce階段最容易發(fā)生傾斜的操作是join和count distinct

下面列舉幾個(gè)常見的hive數(shù)據(jù)傾斜場(chǎng)景,和其對(duì)應(yīng)解決方案:

3.1 空值數(shù)據(jù)傾斜優(yōu)化

在上報(bào)的日志信息中,通常會(huì)出現(xiàn)信息丟失的情況,如果用上報(bào)缺失的字段去關(guān)聯(lián)相關(guān)字段時(shí)就會(huì)出現(xiàn)數(shù)據(jù)傾斜的問題。

案例:日志中的user_id上報(bào)缺失,如果取其中的user_id和用戶表的user_id進(jìn)行關(guān)聯(lián)的時(shí)候就會(huì)出現(xiàn)數(shù)據(jù)傾斜。

解決辦法: 數(shù)據(jù)傾斜主要原因是join的key值發(fā)生傾斜,key值包含很多空值或是異常值,通常的做法是,對(duì)空值或者異常值賦一個(gè)隨機(jī)的值來分散key。

select * from log a left join user b on case when (a.user_id is null or a.user_id = '-' or user_id='0')
--空值和異常值處理 then concat('sql_hive',rand()) else a.user_id end = b.user_id

3.2 大表和小表的優(yōu)化

在hive SQL的join操作中,mr過程是按照join的key進(jìn)行分發(fā),而在join左邊的表的數(shù)據(jù)會(huì)首先被讀進(jìn)內(nèi)存,如果左邊表的key相對(duì)分散,讀入內(nèi)存的數(shù)據(jù)會(huì)比較小,join任務(wù)就會(huì)執(zhí)行的比較快;如果左邊的key比較集中并且數(shù)據(jù)量比較大時(shí),數(shù)據(jù)傾斜就會(huì)比較嚴(yán)重,執(zhí)行時(shí)間將會(huì)增加。

經(jīng)驗(yàn)總結(jié):為了能夠避免數(shù)據(jù)傾斜現(xiàn)象,通常將數(shù)據(jù)量小的表放在join的左邊,此外,還需要使用map join讓小維度的表先進(jìn)內(nèi)存,在map完成reduce操作。

SQL操作:/*+MAPJOIN(smallTable)*/

Set hive.auto.convert.join=true Set hive.mapjoin.smalltable.filesize=25000000 select /*+MAPJOIN(b)*/ a.key,a.value from a join b on a.key = b.key -- a為大表,b為小表

上面操作主要是將小表全部讀入內(nèi)存中,在map階段大表的每個(gè)map和小表進(jìn)行匹配,節(jié)省了reduce階段的時(shí)間,提高了數(shù)據(jù)執(zhí)行效率。

3.3 大表和大表的join優(yōu)化

  • 情況一:Map階段輸出的key數(shù)量上,導(dǎo)致reduce階段的reduce數(shù)量為1

    案例:日志表中的user_id和用戶表關(guān)聯(lián),user表上有500W+條記錄,把user分發(fā)到所有的map開銷很大,并且map join不支持大表操作。用普通的join操作,數(shù)據(jù)傾斜會(huì)產(chǎn)生。

    解決辦法:這類問題產(chǎn)生的根本原因就是數(shù)據(jù)業(yè)務(wù)特性強(qiáng),兩個(gè)表都是大表。因此我們可以針對(duì)性的削減業(yè)務(wù)過程,比如log表中user_id有上百萬個(gè),但是每天會(huì)員的uv不會(huì)太多,有交易的會(huì)員不會(huì)很多,有點(diǎn)擊的會(huì)員數(shù)不會(huì)很多等,在業(yè)務(wù)過程削減冗余的數(shù)據(jù)量,避免數(shù)據(jù)傾斜的發(fā)生。

    -- 思路:先過濾出需要被使用的唯一的user_id,再計(jì)算相關(guān)指標(biāo) select /*MAPJOIN(b)*/ from log a left join ( select /*MAPJOIN(b)*/ b1.* from (select distinct user_id from log) b join user b1 on b.user_id = b1.user_id ) a1 on a.user_id = a1.user_id;
  • 情況二:Map輸出key分布不均勻,商品信息表的key對(duì)應(yīng)大量的value,導(dǎo)致數(shù)據(jù)傾斜。

    案例:商品信息表a中的信息填充到商品瀏覽日志表b中,使用商品id進(jìn)行關(guān)聯(lián)。但是某些人買商品瀏覽量較大,造成數(shù)據(jù)偏移。

    解決辦法:熱點(diǎn)數(shù)據(jù)和非熱點(diǎn)數(shù)據(jù)拆分處理

    select * from ( select /*MAPJOIN(i)*/ a.id, a.time, a.amount, b.name, b.loc, b.cat from a left join (select * from a where uid in ('1001','1002')) as b -- 熱點(diǎn)子表 on a.uid = b.uid where a.uid in('1001','1002') -- 熱點(diǎn)數(shù)據(jù) ) union all select a.id, a.time, a.amount, b.name, b.loc, b.cat from a left join b on a.uid = b.uid where a.uid is not in('1001','1002') -- 非熱點(diǎn)數(shù)據(jù)

3.4 count(distinct)數(shù)據(jù)傾斜優(yōu)化

場(chǎng)景:在多個(gè)維度的同一個(gè)度量的count distinct

案例:根據(jù)月份和性別,統(tǒng)計(jì)買家的1月份男顧客數(shù),女顧客數(shù)

原始方案:

SELECT seller, COUNT(DISTINCT CASE WHEN month=1 AND sex = 'M' THEN buyer END) M01_BUYER_CNT, COUNT(DISTINCT CASE WHEN month=1 AND sex = 'F' THEN buyer END) M01_FEMALE_BUYER_CNT FROM SHOP_ORDER where log_date = '20220301' group by seller

改造方案:

把DISTINCT用到的buyer,也加到group by統(tǒng)計(jì)上,然后再進(jìn)行業(yè)務(wù)計(jì)算

with t1 as( -- 第一步:group by統(tǒng)計(jì),結(jié)果存到t1中 select buyer, seller, count(case when month=1 and sex = 'M' then buyer end) s_M01_male_buyer_cnt, count(case when month=1 and sex = 'F' then buyer end) s_M01_female_buyer_cnt from SHOP_ORDER where log_date = '20220301' group by seller, buyer ) select -- 聚合目標(biāo)指標(biāo) seller, sum(case when s_M01_male_buyer_cnt>0 then 1 else 0 end) as s_M01_male_buyer_cnt, sum(case when s_M01_female_buyer_cnt>0 then 1 else 0 end) as s_M01_female_buyer_cnt from t1 group by seller

3.5 經(jīng)驗(yàn)總結(jié)

我們平時(shí)編寫時(shí)需要記住以下幾點(diǎn):

  • 使用分區(qū)剪裁、列剪裁,分區(qū)一定要加

  • 少用 COUNT DISTINCT,group by 代替 distinct

  • 是否存在多對(duì)多的關(guān)聯(lián)

  • 連接表時(shí)使用相同的關(guān)鍵詞,這樣只會(huì)產(chǎn)生一個(gè) job

  • 減少每個(gè)階段的數(shù)據(jù)量,只選出需要的,在 join 表前就進(jìn)行過濾

  • 大表放后面

  • 謂詞下推:where 謂詞邏輯都盡可能提前執(zhí)行,減少下游處理的數(shù)據(jù)量

發(fā)表評(píng)論

評(píng)論列表

暫時(shí)沒有評(píng)論,有什么想聊的?

低代碼數(shù)據(jù)平臺(tái)BI大屏定制

低代碼數(shù)據(jù)平臺(tái)BI大屏定制

釋放數(shù)據(jù)潛能,智慧展現(xiàn)新高度。定制低代碼數(shù)據(jù)平臺(tái),打造個(gè)性化BI大屏,助您實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)決策。



熱推產(chǎn)品-全域低代碼平臺(tái)

會(huì)Excel就能開發(fā)軟件

全域低代碼平臺(tái),可視化拖拉拽/導(dǎo)入Excel,就可以開發(fā)小程序、管理系統(tǒng)、物聯(lián)網(wǎng)、ERP、CRM等應(yīng)用

大數(shù)據(jù)中的數(shù)據(jù)傾斜及解決辦法最新資訊

分享關(guān)于大數(shù)據(jù)最新動(dòng)態(tài),數(shù)據(jù)分析模板分享,如何使用低代碼構(gòu)建大數(shù)據(jù)管理平臺(tái)和低代碼平臺(tái)開發(fā)軟件

哪款Mac Markdown筆記軟件最適合你的寫作需求?

一、了解Markdown及Mac平臺(tái)上的筆記軟件選擇 1.1 Markdown基礎(chǔ)知識(shí) 1.1.1 Markdown簡(jiǎn)介 Markdown是一種輕量級(jí)的標(biāo)記語(yǔ)言,由約翰·格魯伯(John Gruber)在2004年創(chuàng)建。它

...
2024-10-17 14:39:26
如何高效利用Markdown在線文檔提升團(tuán)隊(duì)協(xié)作效率?

```html 一、Markdown在線文檔基礎(chǔ)與優(yōu)勢(shì) 1.1 Markdown簡(jiǎn)介 1.1.1 Markdown基本語(yǔ)法速覽 Markdown是一種輕量級(jí)的標(biāo)記語(yǔ)言,旨在使文本內(nèi)容更容易閱讀和編寫,同時(shí)能夠轉(zhuǎn)換

...
2024-10-17 14:39:26
Ai知識(shí)庫(kù)上傳什么內(nèi)容最能提升團(tuán)隊(duì)效率與創(chuàng)新能力?

一、概述:AI知識(shí)庫(kù)上傳內(nèi)容對(duì)團(tuán)隊(duì)效率與創(chuàng)新的影響 1.1 AI知識(shí)庫(kù)的基礎(chǔ)概念與重要性 1.1.1 知識(shí)庫(kù)的定義與分類 知識(shí)庫(kù),簡(jiǎn)而言之,是一個(gè)集中存儲(chǔ)和管理組織內(nèi)外部知識(shí)資

...
2024-10-17 14:39:26

速優(yōu)云

讓監(jiān)測(cè)“簡(jiǎn)單一點(diǎn)”

×

?? 微信聊 -->

銷售溝通:17190186096(微信同號(hào))

售前電話:15050465281

微信聊 -->

速優(yōu)物聯(lián)PerfCloud官方微信