<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Hive企業(yè)級性能優(yōu)化(建議收藏)

          共 7203字,需瀏覽 15分鐘

           ·

          2021-04-14 11:55

          點擊上方 "大數(shù)據(jù)肌肉猿"關(guān)注, 星標一起成長

          后臺回復(fù)【加群】,進入高質(zhì)量學(xué)習(xí)交流群

          2021年大數(shù)據(jù)肌肉猿公眾號獎勵制度

          Hive作為大數(shù)據(jù)平臺舉足輕重的框架,以其穩(wěn)定性和簡單易用性也成為當(dāng)前構(gòu)建企業(yè)級數(shù)據(jù)倉庫時使用最多的框架之一。

          但是如果我們只局限于會使用Hive,而不考慮性能問題,就難搭建出一個完美的數(shù)倉,所以Hive性能調(diào)優(yōu)是我們大數(shù)據(jù)從業(yè)者必須掌握的技能。本文將給大家講解Hive性能調(diào)優(yōu)的一些方法及技巧。

          Hive性能問題排查方式

          當(dāng)我們發(fā)現(xiàn)一條SQL語句執(zhí)行時間過長或者不合理時,我們就要考慮對SQL進行優(yōu)化,優(yōu)化首先得進行問題排查,那么我們可以通過哪些方式進行排查呢。

          經(jīng)常使用關(guān)系型數(shù)據(jù)庫的同學(xué)可能知道關(guān)系型數(shù)據(jù)庫的優(yōu)化的訣竅-看執(zhí)行計劃。如Oracle數(shù)據(jù)庫,它有多種類型的執(zhí)行計劃,通過多種執(zhí)行計劃的配合使用,可以看到根據(jù)統(tǒng)計信息推演的執(zhí)行計劃,即Oracle推斷出來的未真正運行的執(zhí)行計劃;能夠觀察到從數(shù)據(jù)讀取到最終呈現(xiàn)的主要過程和中間的量化數(shù)據(jù)。可以說,在Oracle開發(fā)領(lǐng)域,掌握合適的環(huán)節(jié),選用不同的執(zhí)行計劃,SQL調(diào)優(yōu)就不是一件難事。

          Hive中也有執(zhí)行計劃,但是Hive的執(zhí)行計劃都是預(yù)測的,這點不像Oracle和SQL Server有真實的計劃,可以看到每個階段的處理數(shù)據(jù)、消耗的資源和處理的時間等量化數(shù)據(jù)。Hive提供的執(zhí)行計劃沒有這些數(shù)據(jù),這意味著雖然Hive的使用者知道整個SQL的執(zhí)行邏輯,但是各階段耗用的資源狀況和整個SQL的執(zhí)行瓶頸在哪里是不清楚的

          想要知道HiveSQL所有階段的運行信息,可以查看YARN提供的日志。查看日志的鏈接,可以在每個作業(yè)執(zhí)行后,在控制臺打印的信息中找到。如下圖所示:

          Hive提供的執(zhí)行計劃目前可以查看的信息有以下幾種

          1. 查看執(zhí)行計劃的基本信息,即explain;
          2. 查看執(zhí)行計劃的擴展信息,即explain extended;
          3. 查看SQL數(shù)據(jù)輸入依賴的信息,即explain dependency;
          4. 查看SQL操作相關(guān)權(quán)限的信息,即explain authorization;
          5. 查看SQL的向量化描述信息,即explain vectorization。

          在查詢語句的SQL前面加上關(guān)鍵字explain是查看執(zhí)行計劃的基本方法。用explain打開的執(zhí)行計劃包含以下兩部分:

          • 作業(yè)的依賴關(guān)系圖,即STAGE DEPENDENCIES;
          • 每個作業(yè)的詳細信息,即STAGE PLANS。

          Hive中的explain執(zhí)行計劃詳解可看我之前寫的這篇文章Hive底層原理:explain執(zhí)行計劃詳解

          注:使用explain查看執(zhí)行計劃是Hive性能調(diào)優(yōu)中非常重要的一種方式,請務(wù)必掌握!

          總結(jié):Hive對SQL語句性能問題排查的方式

          1. 使用explain查看執(zhí)行計劃;
          2. 查看YARN提供的日志。

          Hive性能調(diào)優(yōu)的方式

          為什么都說性能優(yōu)化這項工作是比較難的,因為一項技術(shù)的優(yōu)化,必然是一項綜合性的工作,它是多門技術(shù)的結(jié)合。我們?nèi)绻痪窒抻谝环N技術(shù),那么肯定做不好優(yōu)化的。

          下面將從多個完全不同的角度來介紹Hive優(yōu)化的多樣性,我們先來一起感受下。

          1. SQL語句優(yōu)化

          SQL語句優(yōu)化涉及到的內(nèi)容太多,因篇幅有限,不能一一介紹到,所以就拿幾個典型舉例,讓大家學(xué)到這種思想,以后遇到類似調(diào)優(yōu)問題可以往這幾個方面多思考下。

          1. union all


          insert into table stu partition(tp) 
          select s_age,max(s_birth) stat,'max' tp 
          from stu_ori
          group by s_age

          union all

          insert into table stu partition(tp) 
          select s_age,min(s_birth) stat,'min' tp 
          from stu_ori
          group by s_age;

          我們簡單分析上面的SQL語句,就是將每個年齡段的最大和最小的生日獲取出來放到同一張表中,union all 前后的兩個語句都是對同一張表按照s_age進行分組,然后分別取最大值和最小值。

          上面的SQL對同一張表相同字段進行兩次分組,這顯然造成了極大浪費,我們能不能改造下呢,當(dāng)然是可以的,為大家介紹一個語法: from ... insert into ... ,這個語法將from前置,作用就是使用一張表,可以進行多次插入操作:

          --開啟動態(tài)分區(qū) 
          set hive.exec.dynamic.partition=true
          set hive.exec.dynamic.partition.mode=nonstrict; 

          from stu_ori 

          insert into table stu partition(tp) 
          select s_age,max(s_birth) stat,'max' tp 
          group by s_age

          insert into table stu partition(tp) 
          select s_age,min(s_birth) stat,'min' tp 
          group by s_age;

          上面的SQL就可以對stu_ori表的s_age字段分組一次而進行兩次不同的插入操作。

          這個例子告訴我們一定要多了解SQL語句,如果我們不知道這種語法,一定不會想到這種方式的

          2. distinct

          先看一個SQL,去重計數(shù):

          select count(1
          from
            select s_age 
            from stu 
            group by s_age 
          ) b;

          這是簡單統(tǒng)計年齡的枚舉值個數(shù),為什么不用distinct?

          select count(distinct s_age) 
          from stu;

          有人說因為在數(shù)據(jù)量特別大的情況下使用第一種方式(group by)能夠有效避免Reduce端的數(shù)據(jù)傾斜,但事實如此嗎?

          我們先不管數(shù)據(jù)量特別大這個問題,就當(dāng)前的業(yè)務(wù)和環(huán)境下使用distinct一定會比上面那種子查詢的方式效率高。原因有以下幾點:

          1. 上面進行去重的字段是年齡字段,要知道年齡的枚舉值是非常有限的,就算計算1歲到100歲之間的年齡,s_age的最大枚舉值才100,如果轉(zhuǎn)化成MapReduce來解釋的話,在Map階段,每個Map會對s_age去重。由于s_age枚舉值有限,因而每個Map得到的s_age也有限,最終得到reduce的數(shù)據(jù)量也就是map數(shù)量*s_age枚舉值的個數(shù)。這個數(shù)量是很小的。

          2. distinct的命令會在內(nèi)存中構(gòu)建一個hashtable,查找去重的時間復(fù)雜度是O(1);group by在不同版本間變動比較大,有的版本會用構(gòu)建hashtable的形式去重,有的版本會通過排序的方式, 排序最優(yōu)時間復(fù)雜度無法到O(1)。另外,第一種方式(group by)去重會轉(zhuǎn)化為兩個任務(wù),會消耗更多的磁盤網(wǎng)絡(luò)I/O資源。

          3. 最新的Hive 3.0中新增了 count(distinct) 優(yōu)化,通過配置 hive.optimize.countdistinct,即使真的出現(xiàn)數(shù)據(jù)傾斜也可以自動優(yōu)化,自動改變SQL執(zhí)行的邏輯。

          4. 第二種方式(distinct)比第一種方式(group by)代碼簡潔,表達的意思簡單明了,如果沒有特殊的問題,代碼簡潔就是優(yōu)!

          這個例子告訴我們,有時候我們不要過度優(yōu)化,調(diào)優(yōu)講究適時調(diào)優(yōu),過早進行調(diào)優(yōu)有可能做的是無用功甚至產(chǎn)生負效應(yīng),在調(diào)優(yōu)上投入的工作成本和回報不成正比。調(diào)優(yōu)需要遵循一定的原則

          2. 數(shù)據(jù)格式優(yōu)化

          Hive提供了多種數(shù)據(jù)存儲組織格式,不同格式對程序的運行效率也會有極大的影響。

          Hive提供的格式有TEXT、SequenceFile、RCFile、ORC和Parquet等。

          SequenceFile是一個二進制key/value對結(jié)構(gòu)的平面文件,在早期的Hadoop平臺上被廣泛用于MapReduce輸出/輸出格式,以及作為數(shù)據(jù)存儲格式。

          Parquet是一種列式數(shù)據(jù)存儲格式,可以兼容多種計算引擎,如MapRedcue和Spark等,對多層嵌套的數(shù)據(jù)結(jié)構(gòu)提供了良好的性能支持,是目前Hive生產(chǎn)環(huán)境中數(shù)據(jù)存儲的主流選擇之一。

          ORC優(yōu)化是對RCFile的一種優(yōu)化,它提供了一種高效的方式來存儲Hive數(shù)據(jù),同時也能夠提高Hive的讀取、寫入和處理數(shù)據(jù)的性能,能夠兼容多種計算引擎。事實上,在實際的生產(chǎn)環(huán)境中,ORC已經(jīng)成為了Hive在數(shù)據(jù)存儲上的主流選擇之一。

          我們執(zhí)行同樣的SQL語句及同樣的數(shù)據(jù),只是數(shù)據(jù)存儲格式不同,得到如下執(zhí)行時長:

          數(shù)據(jù)格式CPU時間用戶等待耗時
          TextFile33分171秒
          SequenceFile38分162秒
          Parquet2分22秒50秒
          ORC1分52秒56秒

          注:CPU時間:表示運行程序所占用服務(wù)器CPU資源的時間。
          用戶等待耗時:記錄的是用戶從提交作業(yè)到返回結(jié)果期間用戶等待的所有時間。

          查詢TextFile類型的數(shù)據(jù)表耗時33分鐘, 查詢ORC類型的表耗時1分52秒,時間得以極大縮短,可見不同的數(shù)據(jù)存儲格式也能給HiveSQL性能帶來極大的影響。

          3. 小文件過多優(yōu)化

          小文件如果過多,對 hive 來說,在進行查詢時,每個小文件都會當(dāng)成一個塊,啟動一個Map任務(wù)來完成,而一個Map任務(wù)啟動和初始化的時間遠遠大于邏輯處理的時間,就會造成很大的資源浪費。而且,同時可執(zhí)行的Map數(shù)量是受限的。

          所以我們有必要對小文件過多進行優(yōu)化,關(guān)于小文件過多的解決的辦法,我之前專門寫了一篇文章講解,具體可查看:解決hive小文件過多問題

          4. 并行執(zhí)行優(yōu)化

          Hive會將一個查詢轉(zhuǎn)化成一個或者多個階段。這樣的階段可以是MapReduce階段、抽樣階段、合并階段、limit階段。或者Hive執(zhí)行過程中可能需要的其他階段。默認情況下,Hive一次只會執(zhí)行一個階段。不過,某個特定的job可能包含眾多的階段,而這些階段可能并非完全互相依賴的,也就是說有些階段是可以并行執(zhí)行的,這樣可能使得整個job的執(zhí)行時間縮短。如果有更多的階段可以并行執(zhí)行,那么job可能就越快完成。

          通過設(shè)置參數(shù)hive.exec.parallel值為true,就可以開啟并發(fā)執(zhí)行。在共享集群中,需要注意下,如果job中并行階段增多,那么集群利用率就會增加。

          set hive.exec.parallel=true; //打開任務(wù)并行執(zhí)行
          set hive.exec.parallel.thread.number=16; //同一個sql允許最大并行度,默認為8。

          當(dāng)然得是在系統(tǒng)資源比較空閑的時候才有優(yōu)勢,否則沒資源,并行也起不來。

          5. JVM優(yōu)化

          JVM重用是Hadoop調(diào)優(yōu)參數(shù)的內(nèi)容,其對Hive的性能具有非常大的影響,特別是對于很難避免小文件的場景或task特別多的場景,這類場景大多數(shù)執(zhí)行時間都很短。

          Hadoop的默認配置通常是使用派生JVM來執(zhí)行map和Reduce任務(wù)的。這時JVM的啟動過程可能會造成相當(dāng)大的開銷,尤其是執(zhí)行的job包含有成百上千task任務(wù)的情況。JVM重用可以使得JVM實例在同一個job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中進行配置。通常在10-20之間,具體多少需要根據(jù)具體業(yè)務(wù)場景測試得出。

          <property>
            <name>mapreduce.job.jvm.numtasks</name>
            <value>10</value>
            <description>How many tasks to run per jvm. If set to -1, there is
            no limit. 
            </description>
          </property>

          我們也可以在hive中設(shè)置

          set  mapred.job.reuse.jvm.num.tasks=10; //這個設(shè)置來設(shè)置我們的jvm重用

          這個功能的缺點是,開啟JVM重用將一直占用使用到的task插槽,以便進行重用,直到任務(wù)完成后才能釋放。如果某個“不平衡的”job中有某幾個reduce task執(zhí)行的時間要比其他Reduce task消耗的時間多的多的話,那么保留的插槽就會一直空閑著卻無法被其他的job使用,直到所有的task都結(jié)束了才會釋放。

          6. 推測執(zhí)行優(yōu)化

          在分布式集群環(huán)境下,因為程序bug(包括Hadoop本身的bug),負載不均衡或者資源分布不均等原因,會造成同一個作業(yè)的多個任務(wù)之間運行速度不一致,有些任務(wù)的運行速度可能明顯慢于其他任務(wù)(比如一個作業(yè)的某個任務(wù)進度只有50%,而其他所有任務(wù)已經(jīng)運行完畢),則這些任務(wù)會拖慢作業(yè)的整體執(zhí)行進度。為了避免這種情況發(fā)生,Hadoop采用了推測執(zhí)行(Speculative Execution)機制,它根據(jù)一定的法則推測出“拖后腿”的任務(wù),并為這樣的任務(wù)啟動一個備份任務(wù),讓該任務(wù)與原始任務(wù)同時處理同一份數(shù)據(jù),并最終選用最先成功運行完成任務(wù)的計算結(jié)果作為最終結(jié)果。

          設(shè)置開啟推測執(zhí)行參數(shù):Hadoop的mapred-site.xml文件中進行配置:

          <property>
            <name>mapreduce.map.speculative</name>
            <value>true</value>
            <description>If true, then multiple instances of some map tasks 
                         may be executed in parallel.</description>
          </property>

          <property>
            <name>mapreduce.reduce.speculative</name>
            <value>true</value>
            <description>If true, then multiple instances of some reduce tasks 
                         may be executed in parallel.</description>
          </property>

          hive本身也提供了配置項來控制reduce-side的推測執(zhí)行:

          set hive.mapred.reduce.tasks.speculative.execution=true

          關(guān)于調(diào)優(yōu)這些推測執(zhí)行變量,還很難給一個具體的建議。如果用戶因為輸入數(shù)據(jù)量很大而需要執(zhí)行長時間的map或者reduce task的話,那么啟動推測執(zhí)行造成的浪費是非常巨大的。


          最后

          代碼優(yōu)化原則:

          • 理透需求原則,這是優(yōu)化的根本;
          • 把握數(shù)據(jù)全鏈路原則,這是優(yōu)化的脈絡(luò);
          • 堅持代碼的簡潔原則,這讓優(yōu)化更加簡單;
          • 沒有瓶頸時談?wù)搩?yōu)化,這是自尋煩惱。

          --end--


          掃描下方二維碼
          添加好友,備注【交流
          可私聊交流,也可進資源豐富學(xué)習(xí)群


          更文不易,點個“在看”支持一下??

          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  嫩苞又嫩又紧AV无码 | 中文字幕国产综合 | 女人一级毛片内射 | 一级黄色片大全 | 成人黄色在线观看视频 |