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 更多配置