Hive --------- hive 的優化

Z_Data發表於2018-11-12

1、表的優化

在表的優化中第一點:當資料量比較大的時候常用的手段就是拆分比表,大表拆小表,分割槽表,臨時表,外部表

小表和大表join,要把資料量小的表放在join的左邊,先進行快取,這樣減少表join的時候可以減少記憶體的消耗量

 

2、資料傾斜

資料傾斜產生的原因為分割槽之後某一個reduce運算的數量比較小,而某一個reduce的數量比較大的時候,造成兩個reduce處理資料不平等

合理設定map數量

總結:可以影響map數量的因素有哪些?

1、在input資料夾中,每一個檔案就是一個map,input檔案的數量,input檔案的大小

在MR任務中一個切片就是一個map任務

設定切片大小:在hadoop中

FileInputFormat.setMaxInputSplitSize(job, size);
FileInputFormat.setMinInputSplitSize(job, size);

設定reduce的個數:

set mapreduce.job.reduces

根據業務自定義分割槽規則

3、並行執行

並行執行與Java多行程的非同步和同步概念上差不多,在MR執行任務中,存在很多的MR任務可以執行。有些MR任務和下一個MR任務存在著依賴關係,但是有些MR任務沒有依賴關係,例如:存在依賴關係的MR它的輸出就是下一個MR任務的輸入。對於沒有依賴關係的MR任務,就可以使用並行執行,在同一時間執行多個MR任務。這樣在執行的過程中效率就會得到提升

可以通過以下引數進行設定:

set hive.exec.parallel=true  ; // 開啟任務並行執行

設定多少個任務可以同時執行

set hive.exec.parallel.thread.number=8; //預設值為8個任務可以同時執行

4、嚴格執行

Hive中提供有嚴格模式,為了防止一些查詢,出現不好的影響,例如笛卡爾積,在嚴格模式下是不能執行的

<property>
    <name>hive.mapred.mode</name>
    <value>strict</value>
    <description>
      The mode in which the Hive operations are being performed. 
      In strict mode, some risky queries are not allowed to run. They include:
        Cartesian Product.
        No partition being picked up for a query.
        Comparing bigints and strings.
        Comparing bigints and doubles.
     Orderby without limit.
    </description>
  </property>

預設值為非嚴格模式 nonstrict

開啟嚴格模式 :strict

開啟了嚴格模式,會對查詢語句進行一些限制:

1、對於分割槽表,必須存在where語句對分割槽欄位進行條件過濾,否則,不允許執行該查詢

2、對於使用order by 的語句必須使用limit進行限定,由於order by之後所有的資料都會被分到一個reduce中,那樣reduce操作單的資料量太多,可能時間過長卡死。所以為了防止reduce時間過長,在order by的時候必須給定limit減少reduce處理的資料量

3、 限制了笛卡兒積的查詢 .主要在多表join中會出現。笛卡兒積的出現會造成效能極大的消耗

3.5 JVM重用

在hive執行計算任務的時候,會把的執行計劃上傳到yarn叢集中進行提交,執行MR任務。每次進行任務的執行的時候都會開啟一個JVM程式執行的MR任務。如果提交任務頻繁過多就會造成JVM頻繁的開啟和關閉。在JVM開啟和關閉的過程中會造成大量的資源浪費

在處理小檔案的時候,由於map任務較多。所以JVM會頻繁的開啟和關閉。所以對於小檔案的處理優化,主要減少JVM開啟的次數

在 mapred-default.xml配置檔案中有如下引數

<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中臨時設定JVM重用任務的執行數量

set mapreduce.job.jvm.numtasks

3.6 推測執行

由於叢集中的資源分配不均等,或者每個叢集中節點的硬體效能,會導致某個任務執行的時間快或者某個任務執行的時間慢,或者某個任務在執行的時候直接卡死了

為了防止某些任務,在執行過程中,拖慢了整個MR任務的進度。在執行慢的任務節點上開啟相同的任務,如果時間比原來的任務執行的快則直接輸出推測執行的任務

設定開啟推測執行的引數:

<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>

在hadoop中預設開啟推測執行。推測執行不是說一卡死就開啟任務必須執行%5以上才會開啟推測執行

在hive中通過set引數也可以進行設定

set mapreduce.map.speculative=true

預設值為true

推測執行分為map端的推測執行以及reduce端的推測執行

<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>

3.7 執行計劃

Hive中提供的可以檢視Hql語句的執行計劃,在執行計劃中會生成抽象語法樹,在語法樹中會顯示HQL語句之間的依賴關係以及執行過程。通過這些執行的過程和依賴可以對HQL語句進行優化

一般來說都會把複雜語句簡單化處理。例如多表的Join

相關文章