1. 程式人生 > 實用技巧 >hive的調優經驗

hive的調優經驗

1.hive本身對union這樣的命令進行了優化

2.hdfs資料本地化率對hive效能產生影響

在資料大小一定的情況下,500個128M的檔案和2個30G的檔案 跑hive任務,效能是有差異的,兩者最大的區別在於,後者在讀取檔案時,需要跨網路傳輸,而前者為本地讀寫。資料本地化率問題。

3.不同資料格式對效能的提升

  hive提供text,sequenceFile,RCFile,ORC,Parquest等格式。

  sequenceFile是一個二進位制key/value對結構的平面檔案,廣泛應用於MapReduce中。

  Parquet時一種列式儲存格式,相容多種資料引擎,MapReduce和Spark。

  ORC時對RCFile的一種優化,主流選擇之一。

4.分割槽表和分桶表對效能的提升

 分割槽表:

總結:分割槽表的意思,其實想明白了就很簡單。就是在系統上建立資料夾,把分類資料放在不同資料夾下面,加快查詢速度。

關鍵點1:partitioned by (dt String,country string); 建立表格時,指明瞭這是一個分割槽表。將建立雙層目錄,第一次目錄的名字和第二層目錄名字規則

PARTITIONED BY子句中定義列,是表中正式的列,成為分割槽列。但是資料檔案中並沒有這些值,僅代表目錄。

關鍵點2: partition (dt='2001-01-01',country='GB'); 上傳資料時,把資料分別上傳到不同分割槽中。也就是分別放在不同的子目錄下。

理解分割槽就是資料夾分而治之,查詢的時候可以當作列名來顯示查詢的範圍。

 

 動態分割槽表: 

關閉嚴格分割槽模式
動態分割槽模式時是嚴格模式,也就是至少有一個靜態分割槽。
set hive.exec.dynamic.partition.mode=nonstrict    //分割槽模式,預設nostrict
set hive.exec.dynamic.partition=true            //開啟動態分割槽,預設true
set hive.exec.max.dynamic.partitions=1000        //最大動態分割槽數,預設1000

為什麼要使用動態分割槽呢,我們舉個例子,假如中國有50個省,每個省有50個市,每個市都有100個區,那我們都要使用靜態分割槽要使用多久才能搞完。所有我們要使用動態分割槽。

動態分割槽預設是沒有開啟。開啟後預設是以嚴格模式執行的,在這種模式下需要至少一個分割槽欄位是靜態的。
這有助於阻止因設計錯誤導致導致查詢差生大量的分割槽。列如:使用者可能錯誤使用時間戳作為分割槽表字段。然後導致每秒都對應一個分割槽!這樣我們也可以採用相應的措施:

分桶表:

每一個表或者分割槽,Hive可以進一步組織成桶。也就是說,桶為細粒度的資料範圍劃分。

分桶規則:對分桶欄位值進行雜湊,雜湊值除以桶的個數求餘,餘數決定了該條記錄在哪個桶中,也就是餘數相同的在一個桶中。分桶不會改變原有表和原有分割槽目錄的組織方式。只是更改了資料在檔案中的分佈。

優點:1、提高join查詢效率 2、提高抽樣效率

可以用 desc formatted [表名] 來檢視目錄組織方式