在大數據技術生態當中,Hive調優是實際運行當中常常面臨的問題,企業級的數據平臺,隨著數據規模的不斷增長,要想更高效率地運行下去,就需要根據實際情況來進行優化。今天的大數據開發分享,我們就主要來講講,Hive調優的幾種思路。Hive擁有較多在特定情況下優化的特性,如何利用好相關特性,是Hive性能調優的關鍵。
一、本地模式當一個MapReduce任務的數據量和計算任務很小的時候,在MapReduce框架中Map任務和Reduce任務的啟動過程佔用了任務執行的大部分時間,真正的邏輯處理其實佔用時間很少,但是給用戶的感受就是:很小的任務,同樣執行較長的時間。那麼在0.7版本之後,Hive引入了本地模式,那麼對於小任務的執行,Hive客戶端不再需要到Yarn上申請Map任務和Reduce任務,只需要在本地進行Map和Reduce的執行,大大的加快了小任務的執行時間,通常可以把分鐘級別任務的執行時間降低秒級。參數設置:
實際測試中,使用本地模式之後,對於小表的計算查詢能從34秒減少到2秒。二、並行模式Hive的Parallel特性使得某些任務中的stage子任務以並行執行模式同時執行,相對於一直串行執行stage任務來說有效地提升資源利用率。Parallel特性主要針對如下幾種情況:多個數據表關聯插入多個目標表UNION ALL參數設置:
實際測試中,選用TDC-DS中的Q11,從對比結果看,在使用Parallel特性之後,由原來的743秒減少到600秒,在並行任務數據量較大,集群資源較充足,計算較複雜的情況下,任務執行效率提升會更加明顯。三、嚴格模式Hive提供一個嚴格模式,可以防止用戶執行那些可能產生意想不到的影響查詢。參數設置:
通過設置hive.mapred.mode的值為strict,開啟嚴格模式可以禁止3種類型的查詢:(1)對於分區表,要求必須限定分區欄位,換句話說就是不允許掃描所有的分區,這是因為通常所有分區的數據量都比較大,這樣可以避免消耗大量資源。(2)對於使用order by的查詢,要求必須使用limit語句,因為order by為了執行排序過程會將所有的結果數據分發到同一個reducer中進行處理,這樣可以避免reducer執行過長的時間。(3)限制笛卡爾積查詢,要求兩張表join時必須有on語句。四、Uber模式Uber模式準確的說並不是Hive的優化特性,是Yarn上針對MR小作業的優化機制,如果job任務足夠小,則直接讓任務串行的在MRAppMaster完成,這樣整個Application只會使用一個Container(JVM重用功能),相對於分配多個Container來說執行效率要高很多。參數設置:
僅僅滿足以上四個參數還不行,因為作業是在AM所在的Container中運行,Uber任務執行還應滿足如下條件:(1)Map內存設置(mapreduce.map.memory.mb)和Reduce內存設置(mapreduce.reduce.memory.mb)必須小於等於AM所在容器內存大小設置(yarn.app.mapreduce.am.resource.mb)。(2)Map配置的vcores(mapreduce.map.cpu.vcores)個數和Reduce配置的vcores(mapreduce.reduce.cpu.vcores)個數也必須小於等於AM所在容器vcores個數的設置(yarn.app.mapreduce.am.resource.cpu-vcores)。關於大數據開發,Hive調優的幾種思路,以上就為大家做了詳細的介紹了。Hive的優化,對於提升運行效率是非常重要的,要做好Hive調優,需要結合實際場景去綜合考量。