Hive-數據傾斜優化

數據傾斜的原因

1)key分布不均勻,本質上就是業務數據有可能會存在傾斜

2)某些SQL語句本身就有數據傾斜?????????????

關鍵詞

情形

后果

Join

A、其中一個表較小,但是key集中;

B、兩張表都是大表,key不均

分發到某一個或幾個Reduce上的數據遠高于平均值

group by

group by 維度過小,某值的數量過多

處理某值的reduce非常耗時

Count(distinct )

某值的數量過多,多次distinct

處理某值的reduce非常耗時,造成數據膨脹

數據產生傾斜的原理:

數據傾斜問題,通常是指參與計算的數據分布不均,即某個key或者某些key的數據量遠超其他key,導致在shuffle階段,大量相同key的數據被發往同一個Reduce,進而導致該Reduce所需的時間遠超其他Reduce,成為整個任務的瓶頸。

數據傾斜的表現

?任務進度長時間維持在99%(或100%),查看任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因為其處理的數據量和其他reduce差異過大。

?單一reduce的記錄數與平均記錄數差異過大,通常可能達到3倍甚至更多。 最長時長遠大于平均時長。

處理數據傾斜

?group by 產生傾斜的問題

前面文章已經提過開啟map端聚合,對于開啟map端聚合后,數據會現在Map端完成部分聚合工作。這樣一來即便原始數據是傾斜的,經過Map端的初步聚合后,發往Reduce的數據也就不再傾斜了。最佳狀態下,Map-端聚合能完全屏蔽數據傾斜問題。group by 產生傾斜的問題。

但是并不是所有map端聚合都能完全屏蔽,我們用到結合另外另外一個參數一起使用,開啟負載均衡。

開啟map聚合:

set hive.map.aggr=true; (默認是?true

開啟map端combiner,減少reduce 拉取的數據量。

set hive.groupby.skewindata=true; (默認是?false

原理是生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分布到 Reduce 中,每個 Reduce 做部分聚合操作,并輸出結果,這樣處理的結果是相同的 Group By Key 有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group By Key 分布到 Reduce 中(這個過程可以保證相同的 Group By Key 被分布到同一個 Reduce 中),最后完成最終的聚合操作。

實例

explain

select province_id???????

????????,count(*) as cnt

???from ds_hive.ch12_order_detail_orc t1

???group by province_id

;

第一種情況(關閉map聚合和負載均衡),會將3857w數據全部傳到reduce階段進行group by聚合,執行時間60.8s

后臺日志說明,map-reduce數據轉移處理了8000w條,效率低

第二種(開啟map聚合和關閉負載均衡)執行時間26s

后臺日志說明,map-reduce數據轉移處理了340條,效率高

第三種(開啟map聚合和負載均衡)執行時間45s

job1:Map 的輸出結果集合會隨機分布到 Reduce 中,每個 Reduce 做部分聚合操作,并輸出結果

job2:將job1預處理后的數據再進行group by,完成聚合

后臺日志說明,job1的map-reduce數據轉移處理了340條,但沒有完成最終分組聚合,而是將多個reduce數據傳給job2的map-reduce進行處理,一定程度上增加了資源的消耗和處理,所以效率比map聚合的一次mr效率低

Join導致的數據傾斜

前文提到過,未經優化的join操作,默認是使用common join算法,也就是通過一個MapReduce Job完成計算。Map端負責讀取join操作所需表的數據,并按照關聯字段進行分區,通過Shuffle,將其發送到Reduce端,相同key的數據在Reduce端完成最終的Join操作。

如果關聯字段的值分布不均,就可能導致大量相同的key進入同一Reduce,從而導致數據傾斜問題。

由join導致的數據傾斜問題,有如下三種解決方案:

map join

使用map join算法,join操作僅在map端就能完成,沒有shuffle操作,沒有reduce階段,自然不會產生reduce端的數據傾斜。該方案適用于大表join小表時發生數據傾斜的場景。

相關參數如下:

--啟動Map Join自動轉換

set hive.auto.convert.join=true;

--一個Common Join operator轉為Map Join operator的判斷條件,若該Common Join相關的表中,存在n-1張表的大小總和<=該值,則生成一個Map Join計劃,此時可能存在多種n-1張表的組合均滿足該條件,則hive會為每種滿足條件的組合均生成一個Map Join計劃,同時還會保留原有的Common Join計劃作為后備(back up)計劃,實際運行時,優先執行Map Join計劃,若不能執行成功,則啟動Common Join后備計劃。

set hive.mapjoin.smalltable.filesize=250000;

--開啟無條件轉Map Join

set hive.auto.convert.join.noconditionaltask=true;

--無條件轉Map Join時的小表之和閾值,若一個Common Join operator相關的表中,存在n-1張表的大小總和<=該值,此時hive便不會再為每種n-1張表的組合均生成Map Join計劃,同時也不會保留Common Join作為后備計劃。而是只生成一個最優的Map Join計劃。

set hive.auto.convert.join.noconditionaltask.size=10000000;

hive (default)>

create table ds_hive.ch12_order_detail_qingxie_join1

as

????SELECT t1.id

???????????,t2.province_name

??????from ds_hive.ch12_order_detail_orc t1

?left join ds_hive.ch12_province_info_orc? t2

????????on t1.province_id=t2.id

;

province_id字段是存在傾斜的,若不經過優化,執行日志顯示一直卡在99-100直接,單一任務執行了2m35s,這倆種表現都能說明出現了數據傾斜問題,最終執行時間188s

開啟mapjoin的自動轉換后,可以看出只有map階段而沒有reduce階段,最終執行時間為26s,相較188s,速度大大增快

skew join

并不是所有的join都能滿足mapjoin,這里我們又出現一種優化方案,那就是skew,skew join的原理是,為傾斜的大key單獨啟動一個map join任務進行計算,其余key進行正常的common join。但是他只能只能某種特定的innerjoin優化,原理圖如下:

相關參數如下:

--啟用skew join優化

set hive.optimize.skewjoin=true;

--觸發skew join的閾值,若某個key的行數超過該參數值,則觸發

set hive.skewjoin.key=1000000;

這種方案對參與join的源表大小沒有要求,但是對兩表中傾斜的key的數據量有要求,要求一張表中的傾斜key的數據量比較小(方便走mapjoin)。

set hive.auto.convert.join=true;

set hive.optimize.skewjoin=true;

explain

create table ds_hive.ch12_order_detail_qingxie_join1

as

????SELECT t1.id

???????????,t2.province_name

??????from ds_hive.ch12_order_detail_orc t1

???????join ds_hive.ch12_province_info_orc? t2

????????on t1.province_id=t2.id

;

調整SQL語句

若參與join的兩表均為大表,其中一張表的數據是傾斜的,此時也可通過以下方式對SQL語句進行相應的調整。

1)如果是空值關聯造成的傾斜,把空值的key變成一隨機數(隨機值類型需要跟key的類型一致),把傾斜的數據分到不同的reduce上,由于null值關聯不上,處理后并不影響最終結果。注意:join的字段類型一定要一致,否則數據不會分到不同的reduce上。

2)如果熱點詞,可以考慮分批處理,最后union all在一起。

?count distinct 數據傾斜

我們可以修改對應的sql來進行優化,?count+group by?或者sum+group by的方案來優化,在第一階段選出全部的非重復的字段id,在第二階段再對這些已消重的id進行計數

其他優化

分區表,分桶表,文件存儲格式,壓縮方式,模型設計等方面的優化,等日后學習到了再行更新

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72880.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

番外篇 - Docker的使用

一、Docker的介紹 Docker 是一個開源的應用容器引擎&#xff0c;基于 Go 語言 并遵從Apache2.0協議開源。 Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中&#xff0c;然后發布到任何流行的 Linux 機器上&#xff0c;也可以實現虛擬化。 容器是完…

深度學習與普通神經網絡有何區別?

深度學習與普通神經網絡的主要區別體現在以下幾個方面&#xff1a; 一、結構復雜度 普通神經網絡&#xff1a;通常指淺層結構&#xff0c;層數較少&#xff0c;一般為2-3層&#xff0c;包括輸入層、一個或多個隱藏層、輸出層。深度學習&#xff1a;強調通過5層以上的深度架構…

RuleOS:區塊鏈開發的“新引擎”,點燃Web3創新之火

RuleOS&#xff1a;區塊鏈開發的“新引擎”&#xff0c;點燃Web3創新之火 在區塊鏈技術的浪潮中&#xff0c;RuleOS宛如一臺強勁的“新引擎”&#xff0c;為個人和企業開發去中心化應用&#xff08;DApp&#xff09;注入了前所未有的動力。它以獨特的設計理念和強大的功能特性&…

c# MimeEntity修改郵件附件名稱

在C#中&#xff0c;當你使用如MimeKit庫來處理電子郵件時&#xff0c;你可以通過修改MimeEntity的ContentDisposition屬性來更改郵件附件的名稱。以下是如何做到這一點的步驟&#xff1a; 1. 添加MimeKit引用 首先&#xff0c;確保你的項目中已經添加了MimeKit庫。如果你使用…

Windows編譯環境搭建(MSYS2\MinGW\cmake)

我的音視頻/流媒體開源項目(github) 一、基礎環境搭建 1.1 MSYS2\MinGW 參考&#xff1a;1. 基于MSYS2的Mingw-w64 GCC搭建Windows下C開發環境_msys2使用mingw64編譯 在Widndows系統上&#xff0c;使用gcc工具鏈&#xff08;g&#xff09;進行C程序開發&#xff1f;可以的&a…

TikTok美國戰略升級:聚焦美食旅行,本地化服務如何重塑市場格局

平臺深耕本土內容生態&#xff0c;餐飲旅游創作者迎流量紅利&#xff0c;算法推薦機制激發地域經濟新活力 過去一年&#xff0c;TikTok在美國市場的動作頻頻引發行業關注。從早期以娛樂、舞蹈為主的全球化內容&#xff0c;到如今將資源向美食、旅行兩大垂類傾斜&#xff0c;這…

Unity Dots環境配置

文章目錄 前言環境配置1.新建Unity 工程2.安裝Entities包2.安裝EntitiesGraphics包3.安裝URP渲染管線 Dots窗口 前言 DOTS&#xff08;Data-Oriented Technology Stack&#xff09;是Unity推出的一種用于開發高性能游戲和應用的數據導向技術棧&#xff0c;包含三大核心組件&am…

manus對比ChatGPT-Deep reaserch進行研究類學術相關數據分析!誰更勝一籌?

沒有賬號&#xff0c;只能挑選一個案例 一夜之間被這個用全英文介紹全華班出品的新爆款國產AI產品的小胖刷頻。白天還沒有切換語言的選項&#xff0c;晚上就加上了。簡單看了看團隊夠成&#xff0c;使用很長實踐的Monica創始人也在其中。逐漸可以理解&#xff0c;重心放在海外產…

Python項目-基于Django的在線教育平臺開發

1. 項目概述 在線教育平臺已成為現代教育的重要組成部分&#xff0c;特別是在后疫情時代&#xff0c;遠程學習的需求顯著增加。本文將詳細介紹如何使用Python的Django框架開發一個功能完善的在線教育平臺&#xff0c;包括系統設計、核心功能實現以及部署上線等關鍵環節。 本項…

【自學筆記】Numpy基礎知識點總覽-持續更新

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 Numpy基礎知識點總覽目錄1. 簡介Numpy是什么為什么使用Numpy 2. 數組對象&#xff08;ndarray&#xff09;創建數組數組的屬性數組的形狀操作 3. 數組的基本操作數組…

Kubernetes中的 iptables 規則介紹

#作者&#xff1a;鄧偉 文章目錄 一、Kubernetes 網絡模型概述二、iptables 基礎知識三、Kubernetes 中的 iptables 應用四、查看和調試 iptables 規則五、總結 在 Kubernetes 集群中&#xff0c;iptables 是一個核心組件&#xff0c; 用于實現服務發現和網絡策略。iptables 通…

.NET Core全屏截圖,C#全屏截圖

.NET Core全屏截圖&#xff0c;C#全屏截圖 使用框架&#xff1a; WPF.NET 8 using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; using System.W…

Java直通車系列15【Spring MVC】(ModelAndView 使用)

目錄 1. ModelAndView 概述 2. ModelAndView 的主要屬性和方法 主要屬性 主要方法 3. 場景示例 示例 1&#xff1a;簡單的 ModelAndView 使用 示例 2&#xff1a;使用 ModelAndView 處理列表數據 示例 3&#xff1a;使用 ModelAndView 處理異常情況 1. ModelAndView 概…

視頻圖像刷新到HTTP的原理

上一篇博客已經說了cgi拿到了共享內存的程序還需要處理的才能夠真正刷新到網頁里面去 HTTP協議介紹 HTTP中文名稱是超文本傳輸協議&#xff0c;它是一個簡單的請求.響應協議&#xff0c;HTTP協議它運行在TCP上面&#xff0c;它是互聯網數據通信的基礎。 幾乎所有的網頁請求和互…

2024四川大學計算機考研復試上機真題

2024四川大學計算機考研復試上機真題 2024四川大學計算機考研復試機試真題 歷年四川大學計算機考研復試機試真題 在線評測&#xff1a;https://app2098.acapp.acwing.com.cn/ 分數求和 題目描述 有一分數序列&#xff1a; 2/1 3/2 5/3 8/5 13/8 21/13… 求出這個數列的前 …

Python評估網絡脆弱性

一、網絡安全 &#xff08;1&#xff09;網絡安全的定義 網絡安全是指計算機網絡系統中的硬件、數據、程序等不會因為無意或惡意的原因而遭到破壞、篡改、泄露&#xff0c;防止非授權的使用或訪問&#xff0c;系統能夠保持服務的連續性&#xff0c;以及能夠可靠的運行。網絡安…

Java后端高頻面經——Spring、SpringBoot、MyBatis

Spring定義一個Bean有哪些方法&#xff1f;依賴注入有哪些方法&#xff1f; &#xff08;1&#xff09;定義Bean的方法 注解定義Bean&#xff0c;Component 用于標記一個類作為Spring的bean。當一個類被Component注解標記時&#xff0c;Spring會將其實例化為一個bean&#xff0…

Qt 實現繪圖板(支持橡皮擦與 Ctrl+Z 撤銷功能)[特殊字符]

作業&#xff1a; 1&#xff1a;實現繪圖的時候&#xff0c;顏色的隨時調整 2&#xff1a;追加橡皮擦功能 3&#xff1a;配合鍵盤事件&#xff0c;實現功能 當鍵盤按 ctrlz的時候&#xff0c;撤銷最后一次繪圖 頭文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidge…

計算機網絡(1) 網絡通信基礎,協議介紹,通信框架

網絡結構模式 C/S-----客戶端和服務器 B/S -----瀏覽器服務器 MAC地址 每一個網卡都擁有獨一無二的48位串行號&#xff0c;也即MAC地址&#xff0c;也叫做物理地址、硬件地址或者是局域網地址 MAC地址表示為12個16進制數 如00-16-EA-AE-3C-40 &#xff08;每一個數可以用四個…

HOW - React 如何在在瀏覽器繪制之前同步執行 - useLayoutEffect

目錄 useEffect vs useLayoutEffectuseEffectuseLayoutEffect主要區別總結選擇建議注意事項 useLayoutEffect 使用示例測量 DOM 元素的尺寸和位置示例&#xff1a;自適應彈出框定位 同步更新樣式以避免閃爍示例&#xff1a;根據內容動態調整容器高度 圖像或 Canvas 繪制前的準備…