1. hive文件格式
hive支持的存儲格式:
hive支持的存儲格式包括TextFile、SequenceFile、RCFile、Avro Files、ORC Files、Parquet。
TextFile:
Hive默認格式,數據不做壓縮,磁碟開銷大,數據解析開銷大。
可結合Gzip、Bzip2、Snappy等使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對數據進行切分,從而無法對數據進行並行操作。
SequenceFile:
SequenceFile是Hadoop API 提供的一種二進制文件,它將數據以的形式序列化到文件中。這種二進制文件內部使用Hadoop 的標準的Writable 介面實現序列化和反序列化。它與Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 繼承自Hadoop API 的SequenceFile,不過它的key為空,使用value 存放實際的值, 這樣是為了避免MR 在運行map 階段的排序過程。
SequenceFile的文件結構圖:
Header通用頭文件格式:
SEQ 3BYTE
Nun 1byte數字
keyClassName
ValueClassName
compression (boolean)指明了在文件中是否啟用壓縮
blockCompression (boolean,指明是否是block壓縮)
compression codec
Metadata 文件元數據
Sync 頭文件結束標志
Block-Compressed SequenceFile格式
RCFile
RCFile是Hive推出的一種專門面向列的數據格式。 它遵循「先按列劃分,再垂直劃分」的設計理念。當查詢過程中,針對它並不關心的列時,它會在IO上跳過這些列。需要說明的是,RCFile在map階段從 遠端拷貝仍然是拷貝整個數據塊,並且拷貝到本地目錄後RCFile並不是真正直接跳過不需要的列,並跳到需要讀取的列, 而是通過掃描每一個row group的頭部定義來實現的,但是在整個HDFS Block 級別的頭部並沒有定義每個列從哪個row group起始到哪個row group結束。所以在讀取所有列的情況下,RCFile的性能反而沒有SequenceFile高。
2. 大數據開發工程師Hive(Hive如何進行優化)
1數據存儲及壓縮優化
針對hive中表的存儲格式通常有textfile和orc,壓縮格式一般使用snappy。相比於 textfile格式存儲,orc佔有更少的存儲。因為hive底層使用MR計算架構,數據流是hdfs到磁碟再到hdfs,而且會有很多次IO讀寫操作,所以使用orc數據格式和snappy壓縮策略可以降低IO讀寫,還能降低網路傳輸量,這樣在一定程度上可以節省存儲空間,還能提升hql的執行效率;
2 Hive Job優化
①調節Jvm參數,重用Jvm;
②合理設置Map個數;
③合理設置Rece個數;
3 Sql語法優化
① 建表優化 :
1) Hive創建表的時候,可以建分區表,分桶表;
2) Hive創建表的時候,可以指定數據存儲格式:TextFile、SequenceFile、RCfile 、ORCfile;
② 查詢時優化 :
1) 列裁剪,在查詢時只讀取需要的列,避免全列掃描,不要使用select * from table;
2) 分區裁剪:在查詢時只讀取需要分區的數據,避免全表掃描;
3) 開啟謂詞下推:set hive.optimize.ppd = true,默認是true:
a. 將Sql語句中的where謂詞邏輯都盡可能提前執行,減少下游處理的數據量;
4) 大哪陵表join小表:
a. 開啟MapJoin:set hive.auto.convert.join=true:
b. MapJoin是將Join雙方比較小的那個表直接分發到各個Map進程的內存畝弊中,在 Map進程中進行Join操作, 這樣就不用進行Rece步驟 ,從而提高了速度( 大表left join小表才有效 ,小表left join大表會失效);
5) 大表join大表:
a. SMB Join :Sort Merge Bucket Join(數據不僅分桶了,而且每個桶數據是排好序了);
b. 開啟SMB Join之後,底層是根據兩個表join欄位進行分桶存儲,這樣迅緩族的話,兩張表就變為了基於桶之間join關聯查詢,而不是基於整張表的join,減少了笛卡爾積;
6) 少用in,用left semi join替代in:
a. 原始寫法:select a.id, a.name from a where a.id in (select b.id from b);
b. 用join改寫:select a.id, a.name from a join b on a.id = b.id;
c. left semi join改寫:select a.id, a.name from a left semi join b on a.id = b.id;
7) 用union all代替union,因為union all不需要去重,也不需要排序,效率高於union;
(每天1小題,進步1點點)