Hive性能調(diào)優(yōu)實(shí)戰(zhàn)讀書筆記

1拗盒、感受Hive調(diào)優(yōu)多樣性

(1)SQL書寫方式
舉的是multi-insert的例子
(2)文件塊大小
輸入文件劃分與Map數(shù)量
(3)數(shù)據(jù)格式
SequenceFile 二進(jìn)制key/value結(jié)構(gòu)平面分揀
Parquet列式數(shù)據(jù)存儲(chǔ)格式
ORC優(yōu)化RCFile存儲(chǔ)怠噪,主流選擇
(4)表設(shè)計(jì)
分區(qū)烟号、分桶

2、hive優(yōu)化瓶頸

(1)磁盤——優(yōu)化存儲(chǔ)
(2)IO——優(yōu)化執(zhí)行過程
(3)內(nèi)存——優(yōu)化作業(yè)調(diào)度

3吹缔、調(diào)優(yōu)的原則

需求
架構(gòu)

4啤誊、調(diào)優(yōu)一般性過程

(1)選擇性能評(píng)估及各自目標(biāo)
(2)分析系統(tǒng)組件和服務(wù)定義性能目標(biāo)
(3)明確當(dāng)前環(huán)境下各個(gè)組件性能
(4)分析定位性能瓶頸
(5)優(yōu)化產(chǎn)生性能瓶頸的程序或系統(tǒng)
(6)性能監(jiān)控和告警

5、Hive元數(shù)據(jù)

(1)數(shù)據(jù)庫元數(shù)據(jù)
(2)表相關(guān)元數(shù)據(jù)--表名仁烹、表基本統(tǒng)計(jì)信息、授權(quán)情況
(3)分區(qū)相關(guān)元數(shù)據(jù)--分區(qū)信息咧虎、分區(qū)統(tǒng)計(jì)信息晃危、分區(qū)授權(quán)信息
(4)文件存儲(chǔ)相關(guān)元數(shù)據(jù)--HDFS路徑地址、輸入格式老客、輸出格式、分桶震叮、字段名稱胧砰、類型等1
(5)其他--鎖信息、權(quán)限相關(guān)信息

6苇瓣、常見HDFS優(yōu)化

(1) Hive作用生成的小文件
2尉间、合理的HDFS文件塊大小
3、增加namenode的java堆
4击罪、在集群進(jìn)行擴(kuò)容和縮容時(shí)哲嘲,調(diào)整namenode服務(wù)處理程序計(jì)數(shù)和處理程序計(jì)數(shù)
5、寫入大文件媳禁,嘗試啟用寫入后清理緩存
6眠副、多隨機(jī)讀、一次性讀取大數(shù)據(jù)文件竣稽,啟用讀取后清理緩存
7囱怕、集群?jiǎn)螜C(jī)性能高可增加處理程序計(jì)數(shù)
8、HDFS讀取數(shù)據(jù)時(shí)會(huì)開啟HDFS快速讀取

7毫别、MR過程

image.png

Map端
(1) Map啟動(dòng)耗時(shí) 控制map數(shù)量 mapred.map.tasks marped.min.split.size
(2) Mapper啟動(dòng)向量化操作娃弓,批量處理數(shù)據(jù)
(3) map join自動(dòng)優(yōu)化
(4) hive.mapjoin.smalltable.filesize大小表join 小表小于該值則開啟mapjoin自動(dòng)優(yōu)化
(5) hive.map.aggr 是否開啟map端聚合
(6) hive.map.aggr.hash.percentmemory 開啟map任務(wù)聚合,聚合使用的hash表可達(dá)到mapper內(nèi)存的多少
(7) hive.mapjoin.optimize.hashtabel.wbsize 優(yōu)化的hash表使用的是一種鏈塊內(nèi)存,該值是一個(gè)塊的大小
(8) hive.vectorized.execution.mapjoin.naive.enabled 是否使用原生的向量化執(zhí)行模式執(zhí)行mapjoin

Reduce端
(1) Reducer數(shù)量 mapred.reduce.tasks
(2) hive.exec.reducers.bytes.per.reduce 每個(gè)reducer處理的數(shù)據(jù)量
(3) hive.exec.reducers.max 一個(gè)作業(yè)運(yùn)行的最大reducers數(shù)
(4) hive.multigroupby.singlereducer 如果分組聚合的字段是一樣岛宦,則可以設(shè)置為一個(gè)reducer解決
(5) hive.mapred.reduce.tasks.speculative.execution 如果按相同的key再次聚合台丛,可開啟
(6) hive.vectorized.execution.reduce.enabled 表示是否啟用reducer端的向量化模式,mapreduce模型不支持reduce端的向量化模式

Shuffle
為什么不直接推給reducer砾肺,因?yàn)閞educer異常結(jié)束時(shí)挽霉,可以從hdfs拉取正常的數(shù)據(jù)防嗡。保證HDFS能在廉價(jià)服務(wù)器穩(wěn)定的傳遞數(shù)據(jù)
Map結(jié)束后的排序是為了reduce拉取不要頻繁地搜索磁盤

Combiner
開啟了之后,執(zhí)行計(jì)劃里會(huì)多一個(gè)Group by Operator
hive.groupby.mapaggr.checkinterval:默認(rèn)值100000炼吴,啟用combiner會(huì)嘗試去這個(gè)配置對(duì)應(yīng)的數(shù)據(jù)量進(jìn)行聚合
hive.map.aggr.hash.percentmemory:默認(rèn)值0.5本鸣,標(biāo)識(shí)進(jìn)行mapper端聚合占用的最大內(nèi)存
hive.map.aggr.hash.force.flush.memory.threhold:默認(rèn)值為0.9 如果聚合時(shí)Hash表占用內(nèi)存超過0.9,開始刷磁盤硅蹦,默認(rèn)512MB

小文件
hive.merge.mapfile參數(shù) 合并只有map任務(wù)作業(yè)的輸出文件
hive.merge.mapdfiles 合并MapReduce作業(yè)最終的輸出文件
hive.merge.smallfiles.avgsize,默認(rèn)16M荣德,當(dāng)輸出文件小于該值,啟用合并
hive.merge.size.per.task 默認(rèn)256M 每個(gè)任務(wù)合并后文件的大小

其他配置
hive.optimize.countdistinct: 當(dāng)進(jìn)行去重技術(shù)時(shí),作業(yè)會(huì)分為兩個(gè)來進(jìn)行處理
hive.exec.parallel:是否開啟作業(yè)并行
hive.exec.parallel.thread.num:默認(rèn)值是8蜗侈,最多可以并行的作業(yè)數(shù)量
hive.exec.mode.local.auto:是否開啟本地執(zhí)行模式
hive.optimize.correlation:默認(rèn)false搀暑,相關(guān)性優(yōu)化,可以減少重復(fù)性shuffle署咽,比如join和group by都涉及的key

8、Hive執(zhí)行過程

explain dependency
可以查看內(nèi)外部表生音、分區(qū)等信息宁否,排查由分區(qū)造成的錯(cuò)誤
還可以看出連接時(shí)取分區(qū)的情況,比如內(nèi)連接on后面的過濾條件并不會(huì)進(jìn)行分區(qū)的選擇
左外連接 on 后面的 右表過濾條件生效 左表全掃

Map端如果有combiner就會(huì)有g(shù)roup by operator

窗口函數(shù)
Map table scan - reduce output operator
reduce TPF operator操作窗口函數(shù)

連接
在tablescan - filter - reduce output
join operator
left semi join
在子表會(huì)多一個(gè)group by operator 數(shù)據(jù)去重缀遍,減少輸出量

9慕匠、Hive數(shù)據(jù)處理模式

(1)過濾
where在map端進(jìn)行過濾,減少數(shù)據(jù)傳輸
having發(fā)生在reduce端域醇,在reduce operator 和 group by operator之后台谊,分組聚合時(shí)進(jìn)行過濾
distinct操作在reduce端,將進(jìn)行分組聚合譬挚,hive也有可能使用hash表去重
分桶過濾锅铅,按照相同值進(jìn)行分桶
(2)聚合
count(*) count(1)性能更優(yōu),
collect_list不可計(jì)算中間結(jié)果减宣,map也會(huì)匯總一部分盐须,需要注意會(huì)不會(huì)傾斜
(3)連接
map join 先啟動(dòng)一個(gè)小作業(yè),讀取小表數(shù)據(jù)蚪腋,內(nèi)存構(gòu)建hash表丰歌,然后寫入本地磁盤,將hash表上傳到hdfs并添加到分布式緩存中屉凯,再啟動(dòng)一個(gè)任務(wù)讀取b表數(shù)據(jù)立帖,連接時(shí)就通過讀取hash內(nèi)容進(jìn)行連接
hive.mapjoin.followby.gby.localtask.max.memory.usage:默認(rèn)0.55,如果mapjoin后面還有g(shù)roup by那就只有55%內(nèi)存給哈希表緩存數(shù)據(jù)

桶連接悠砚、smb join(排序桶連接) map形式

傾斜連接晓勇,一種方式是指定傾斜健,將指定的數(shù)據(jù)分割成單獨(dú)的數(shù)據(jù)文件或目錄,這樣可以加快數(shù)據(jù)過濾從而提升運(yùn)行速度绑咱。傾斜鍵數(shù)值會(huì)被單獨(dú)處理绰筛。
hive.optimize.skewjoin 默認(rèn)值weifalse
hive.skewjoin.key 默認(rèn)值100000,如果鍵行數(shù)多于這個(gè)數(shù)描融,那么就會(huì)作為傾斜鍵處理
hive.skewjoin.mapjoin.map.tasks 傾斜鍵連接做mapjoin的map任務(wù)個(gè)數(shù)

Calcite是一個(gè)基于成本優(yōu)化器的SQL執(zhí)行查詢執(zhí)行框架
CBO會(huì)根據(jù)表的元信息自動(dòng)地進(jìn)行表連接順序排序铝噩,bushy tee連接改變了左深數(shù)連接模式

10、Yarn日志

(1)RM UI
Cluster下面
Applications 查看作業(yè)概況
Scheduler 查看Yarn調(diào)度器
Tools下面
Configuration 查看xml配置
Local logs 查看日志
(2)RM日志
metrics 作業(yè)個(gè)數(shù)窿克、等待執(zhí)行/運(yùn)行的作業(yè)個(gè)數(shù)骏庸、預(yù)留內(nèi)存等
cluster node metrics 查看節(jié)點(diǎn)健康情況
cluster overview 查看集群信息、RM啟動(dòng)時(shí)間等
(3)集群節(jié)點(diǎn)概況
cluster下的node 幾家年叮、節(jié)點(diǎn)狀態(tài)具被、節(jié)點(diǎn)已用內(nèi)存、可用內(nèi)存只损、心跳報(bào)告路徑一姿、HTTP接口
單機(jī)HTTP地址,可查看node詳細(xì)信息
list of applications可以看到節(jié)點(diǎn)正在運(yùn)行的作業(yè)相關(guān)信息
(4)隊(duì)列調(diào)度情況
子隊(duì)列情況跃惫、隊(duì)列使用資源情況
(5)問題排查
集群作業(yè)情況:重點(diǎn)管制accept叮叹、running、finish爆存、failed衬横、killed,了解作業(yè)啟動(dòng)终蒂、運(yùn)行、持續(xù)等元數(shù)據(jù)遥诉,可以為作業(yè)建立畫像
作業(yè)運(yùn)行情況:tracking UI 查看map時(shí)間拇泣、shuffle時(shí)間、merge時(shí)間矮锈、reduce時(shí)間
作業(yè)計(jì)數(shù)器:
HDFS 一個(gè)作業(yè)寫HDFS次數(shù)霉翔、數(shù)量
FILE 寫本地文件次數(shù)、數(shù)據(jù)量
MR框架計(jì)數(shù)器 MAP REDUCE數(shù)量苞笨,輸出的記錄數(shù)债朵、數(shù)據(jù)量
HIVE計(jì)數(shù)器 任務(wù)結(jié)束后創(chuàng)建的文件數(shù)、反序列化錯(cuò)誤數(shù) 輸出記錄數(shù) 中間結(jié)果記錄數(shù)
SHUFFLE錯(cuò)誤技術(shù) IO異常數(shù)量 MAPREDUCE異常數(shù)量
FILE INPUT/OUTPUT FORMAT COUNTERS map讀和reduce寫輸出的value值數(shù)據(jù)量

11瀑凝、數(shù)據(jù)存儲(chǔ)

(1)ORC格式


圖片.png

ORC文件由三部分組成:條帶(實(shí)際存儲(chǔ)位置)序芦、文件腳注(strip信息)、postscript(壓縮信息)
strip也分為三部分:index data(保存了所在條帶的統(tǒng)計(jì)信息粤咪,數(shù)據(jù)的位置索引信息)谚中、row data(數(shù)據(jù)存儲(chǔ)的地方)、strip footer(數(shù)據(jù)保存的文件目錄)
ORC為文件提供了三個(gè)級(jí)別的索引:
文件級(jí)別,記錄文件中所有stripe位置信息宪塔,存儲(chǔ)的每列數(shù)據(jù)統(tǒng)計(jì)信息
條帶級(jí)別磁奖,記錄索引記錄每個(gè)stripe所存儲(chǔ)數(shù)據(jù)的統(tǒng)計(jì)信息
行組組別,在stripe中某筐,沒1w行構(gòu)成一個(gè)行組比搭,記錄行組中存儲(chǔ)數(shù)據(jù)的信息
(2)parquet


圖片.png

也會(huì)記錄元數(shù)據(jù),包括表級(jí)別的元數(shù)據(jù)南誊、列塊的元數(shù)據(jù)信息身诺、頁頭的元數(shù)據(jù)信息

ORC在數(shù)據(jù)大區(qū)時(shí)進(jìn)行了優(yōu)化,增強(qiáng)了數(shù)據(jù)讀取效率

12弟疆、各種監(jiān)控

(1)Hive數(shù)據(jù)庫監(jiān)控
analyze table 表名 compute statistics
analyze table 表名 compute statistics for columns
analyze table 表名 partition(分區(qū)列) compute statistics
......

監(jiān)控文件存儲(chǔ)的平均大小戚长,較大的文件塊可能讀取數(shù)據(jù)時(shí)發(fā)生傾斜
監(jiān)控分區(qū)存儲(chǔ)大小
監(jiān)控大表不分區(qū)的表
監(jiān)控分區(qū)列不均勻的數(shù)據(jù)
監(jiān)控存儲(chǔ)格式非ORC Parquet
監(jiān)控使用索引的表,索引對(duì)hive效率不高怠苔,因?yàn)槊看斡袛?shù)據(jù)時(shí)需要及時(shí)更新索引同廉,相當(dāng)于重建新表
查詢表字段空值率以及字段重復(fù)占比
監(jiān)控分區(qū)字段空值率
監(jiān)控hive表分區(qū)數(shù)
(2)監(jiān)控集群的狀態(tài)
獲取集群的狀態(tài)
獲取集群任務(wù)整體狀態(tài)
獲取提交到集群所有任務(wù)的運(yùn)行信息
獲取當(dāng)前資源調(diào)度分配信息

13、問題排查

(1)大小文件問題


圖片.png

如果一個(gè)可分割大文件唄多個(gè)map讀取柑司,會(huì)喪失任務(wù)執(zhí)行本地化迫肖,需要跨服務(wù)其讀取存儲(chǔ)在不同服務(wù)器的文件
(2)reduce數(shù)據(jù)傾斜
對(duì)比reduce任務(wù)耗時(shí)即可發(fā)現(xiàn)
(3)緩慢shuffle
elapsed time shuffle

14、數(shù)據(jù)傾斜

導(dǎo)致數(shù)據(jù)傾斜的常見原因包括:讀取大文件攒驰、需要處理大量相同鍵的數(shù)據(jù)
(1)不可拆分大文件引發(fā)的數(shù)據(jù)傾斜
不可分割的壓縮格式:GZIP蟆湖,如果該壓縮文件很大,map就要花費(fèi)很多時(shí)間進(jìn)行讀取玻粪,盡量采用bzip和zip等支持分割的壓縮算法
(2)NULL值或熱點(diǎn)值
隨機(jī)數(shù)填充打散
(3)多維聚合引發(fā)數(shù)據(jù)膨脹
rollup cube等隅津,如果map端聚合得不好,map端輸出得數(shù)據(jù)量將會(huì)很大
hive.new.job.grouping.set.cardinality可對(duì)任務(wù)進(jìn)行拆解
(4)中間結(jié)果無法削減
例如collect_list劲室,同時(shí)key又有傾斜
解決這類問題最直接得方式時(shí)調(diào)整reduce執(zhí)行得內(nèi)存大小
(5)兩個(gè)hive數(shù)據(jù)表連接發(fā)生數(shù)據(jù)傾斜
hive處理方式時(shí)啟用兩個(gè)作業(yè)伦仍,一個(gè)作業(yè)處理沒有傾斜得數(shù)據(jù),第二個(gè)作業(yè)將傾斜得數(shù)據(jù)存到分布式緩存中很洋,分發(fā)到各個(gè)map任務(wù)所在的節(jié)點(diǎn)充蓝,進(jìn)行mapjoin。

15喉磁、Hive知識(shí)體系

圖片.png
圖片.png

未被external修飾的是內(nèi)部表(managed table)谓苟,被external修飾的為外部表(external table);
區(qū)別:
內(nèi)部表數(shù)據(jù)由Hive自身管理协怒,外部表數(shù)據(jù)由HDFS管理涝焙;
分區(qū)表、桶排序表孕暇、傾斜表纱皆、臨時(shí)表湾趾、事務(wù)表

圖片.png

序列化 (Serialization)是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^程。在序列化期間派草,對(duì)象將其當(dāng)前狀態(tài)寫入到臨時(shí)或持久性存儲(chǔ)區(qū)搀缠。以后,可以通過從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài)近迁,重新創(chuàng)建該對(duì)象艺普。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鉴竭,隨后出現(xiàn)的幾起案子歧譬,更是在濱河造成了極大的恐慌,老刑警劉巖搏存,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑰步,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡璧眠,警方通過查閱死者的電腦和手機(jī)缩焦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來责静,“玉大人袁滥,你說我怎么就攤上這事≡煮Γ” “怎么了题翻?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腰鬼。 經(jīng)常有香客問我嵌赠,道長,這世上最難降的妖魔是什么熄赡? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任猾普,我火速辦了婚禮,結(jié)果婚禮上本谜,老公的妹妹穿的比我還像新娘。我一直安慰自己偎窘,他們只是感情好乌助,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陌知,像睡著了一般他托。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仆葡,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天赏参,我揣著相機(jī)與錄音志笼,去河邊找鬼。 笑死把篓,一個(gè)胖子當(dāng)著我的面吹牛纫溃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播韧掩,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼紊浩,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了疗锐?” 一聲冷哼從身側(cè)響起坊谁,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滑臊,沒想到半個(gè)月后口芍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雇卷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年鬓椭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聋庵。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膘融,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祭玉,到底是詐尸還是另有隱情氧映,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布脱货,位于F島的核電站岛都,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏振峻。R本人自食惡果不足惜臼疫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扣孟。 院中可真熱鬧烫堤,春花似錦、人聲如沸凤价。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽利诺。三九已至富蓄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慢逾,已是汗流浹背立倍。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工灭红, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人口注。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓变擒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疆导。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赁项,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354