1. 程式人生 > >hive 三 排序和優化

hive 三 排序和優化

排序:

order by:

全域性排序,執行一個reduce任務

sort by:

在一個reduce任務中的資料是有序的,但是總體資料看是無序的。如果只是執行一個reduce任務和order by是一樣的。

通過set   mapreduce.job.reduces=num  設定reduce任務的數量。資料的分到不同的reduce預設使用hash演算法。

distribute by:

分割槽排序,指定以什麼欄位進行分割槽排序,結合sort by使用。select * from testA distribute by field1 sort by field2.

需要注意的是distribute by需要在sort by之前,這是因為需要先指定分割槽。

cluster by:

當distribute by和sort by選擇的欄位是一樣的時候,直接使用cluster by效果是一樣的。

hive資料壓縮:推薦使用snappy  資料儲存推薦使用orc(列式儲存)  在建立表時可以指定儲存格式和壓縮方式

STORED AS orc tabproperties(" orc.compress"="SNAPPY")

hive優化:

1.FetchTask  取消某些MR

修改配置檔案 hive-site.xml:

<property>
    <name>hive.fetch.task.conversion</name>
    <value>more</value>
  </property>

2.表拆分(子表)

3.分割槽表,外部表 結合使用 多級分割槽 (month,day,hour)

4.資料格式(orc),資料壓縮(snappy)

5.sql優化  先filter後join

Reduce Join:

表join發生在Reduce階段 通常是兩個較大表join   每個表的資料都是從檔案中讀取的

Map Join:

表join發生在Map階段 通常是一大一小的表join  大表資料從檔案中讀取,小表資料從記憶體中讀取   通過DistributedCache 類將小表資料快取到各個節點中

SMB Join:Sort-Merge-Bucket 在大表join時進行優化

在建立表時以jion欄位進行分割槽排序,將排序完成的資料劃分到不同的Bucket(分割槽)中。大表join的時候就會根據對應的Bucket進行join,減少查詢對錶的次數。 官網

6.資料傾斜:group by ,distinct

hive執行計劃:

顯示執行計劃:explain extended select XXX

hive在job中沒有依賴關係時,可以設定並行執行:

最多可以並行執行多少個作業:hive.exec.parallel.thread.number  一般在10~20    

是否並行執行作業:   hive.exec.parallel  預設是false

JVM重用:就是在一個JVM中啟動多個MR   mapreduce.job.jvm.numtasks    不要超過9個

設定Map數目: hive.merge.size.per.task  通過設定map讀取最大檔案的值來控制map的數量

設定Reduce數目:mapreduce.job.reduces 

通過資料測試每個reduce完成的時間,修改reduce數量。將所有reduce完成任務的時間控制在一定範圍內。

推測執行:ApplicationMaster 會通過任務完成的時間來判斷是否啟動該任務的副本任務,當一個任務完成後,會將這個任務的副本任務都kill 。這樣會消耗效能 將mapreduce.map.speculative  ,hive.mapred.reduce.task.speculative.execution  ,

mapreduce.reduce.speculative 都設定為false  預設為true

動態分割槽

開啟動態分割槽 hive.exec.dynamic.partition=true  預設是false   更多配置