Hive 介紹與核心知識點
Hive
Hive簡介
Facebook為了解決海量日誌資料的分析而開發了Hive,後來開源給了Apache軟體基金會。
官網定義:
The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL.
Hive是一種用類SQL語句來協助讀寫、管理那些儲存在分散式儲存系統上大資料集的資料倉庫軟體。
Hive的幾個特點
-
資料是儲存在HDFS上的,Hive本身並不提供資料的儲存功能
-
Hive是將資料對映成資料庫和一張張的表,庫和表的元資料資訊一般存在關係型資料庫上(比如MySQL)。
-
資料儲存方面:它能夠儲存很大的資料集,並且對資料完整性、格式要求並不嚴格。
-
資料處理方面:因為Hive語句最終會生成MapReduce任務去計算,所以不適用於實時計算的場景,它適用於離線分析。
Hive架構

image.png
Hive的底層儲存
Hive的資料是儲存在HDFS上的。Hive中的庫和表可以看作是對HDFS上資料做的一個對映。所以Hive必須是執行在一個Hadoop叢集上的。
Hive語句的執行過程
Hive中的執行器,是將最終要執行的MapReduce程式放到YARN上以一系列Job的方式去執行。
Hive的元資料儲存
Hive的元資料是一般是儲存在MySQL這種關係型資料庫上的,Hive和MySQL之間通過MetaStore服務互動。
Hive重要概念
外部表和內部表
內部表(managed table)
- 預設建立的是內部表(managed table),儲存位置在
hive.metastore.warehouse.dir
設定,預設位置是/user/hive/warehouse
。 - 匯入資料的時候是將檔案剪下(移動)到指定位置,即原有路徑下檔案不再存在
- 刪除表的時候,資料和元資料都將被刪除
- 預設建立的就是內部表
create table xxx (xx xxx)
外部表(external table)
DESCRIBE FORMATTED table_name create external table xxx (xxx)
分割槽表和桶表
分割槽(partioned)
partioned by (xxx)
[圖片上傳失敗...(image-15cd1e-1539162972641)]
分桶(clustered)
- 分桶是相對分割槽進行更細粒度的劃分。分桶將整個資料內容安裝某列屬性值得hash值進行區分,按照取模結果對資料分桶。如取模結果相同的資料記錄存放到一個檔案。
- 桶表也是一種用於優化查詢而設計的表型別。建立通表時,指定桶的個數、分桶的依據欄位,hive就可以自動將資料分桶儲存。查詢時只需要遍歷一個桶裡的資料,或者遍歷部分桶,這樣就提高了查詢效率。
具體說明分桶
- clustered by (user_id) sorted by(leads_id) into 10 buckets
-
clustered by是指根據user_id的值進行雜湊後模除分桶個數,根據得到的結果,確定這行資料分入哪個桶中,這樣的分法,可以確保相同user_id的資料放入同一個桶中。
-
sorted by 是指定桶中的資料以哪個欄位進行排序,排序的好處是,在join操作時能獲得很高的效率。
-
into 10 buckets是指定一共分10個桶。
-
在HDFS上儲存時,一個桶存入一個檔案中,這樣根據user_id進行查詢時,可以快速確定資料存在於哪個桶中,而只遍歷一個桶可以提供查詢效率。
-
Hive檔案格式
hive檔案儲存格式包括以下幾類:
- TEXTFILE
- SEQUENCEFILE
- RCFILE
- ORCFILE(0.11以後出現)
其中TEXTFILE為預設格式,建表時不指定預設為這個格式,匯入資料時會直接把資料檔案拷貝到hdfs上不進行處理;SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接從本地檔案匯入資料,資料要先匯入到textfile格式的表中, 然後再從表中用insert匯入SequenceFile,RCFile,ORCFile表中。
列式儲存和行式儲存
首先我們看一下一張表的儲存格式

image.png
行式儲存

image.png
列式儲存

image.png
列式儲存和行式儲存的比較
行式儲存
優點:
- 相關的資料是儲存在一起,比較符合面向物件的思維,因為一行資料就是一條記錄
- 這種儲存格式比較方便進行INSERT/UPDATE操作
缺點:
- 如果查詢只涉及某幾個列,它會把整行資料都讀取出來,不能跳過不必要的列讀取。當然資料比較少,一般沒啥問題,如果資料量比較大就比較影響效能
- 由於每一行中,列的資料型別不一致,導致不容易獲得一個極高的壓縮比,也就是空間利用率不高
- 不是所有的列都適合作為索引
列式儲存
優點:
- 查詢時,只有涉及到的列才會被查詢,不會把所有列都查詢出來,即可以跳過不必要的列查詢
- 高效的壓縮率,不僅節省儲存空間也節省計算記憶體和CPU
- 任何列都可以作為索引
缺點:
- INSERT/UPDATE很麻煩或者不方便
- 不適合掃描小量的資料
TEXTFILE
預設格式,資料不做壓縮,磁碟開銷大,資料解析開銷大。
可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對資料進行切分,從而無法對資料進行並行操作。
SEQUENCEFILE
SequenceFile是Hadoop API提供的一種二進位制檔案支援,其具有使用方便、可分割、可壓縮的特點。
SequenceFile支援三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮。
RCFILE
RCFILE是一種行列儲存相結合的儲存方式。首先,其將資料按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block。其次,塊資料列式儲存,有利於資料壓縮和快速的列存取。
- RCFile保證同一的資料位於同一節點,因此元組重構代價較低(需要將分散的資料重新組織,比如一列資料散落在不同叢集,查詢的時候,需要將各個節點的資料重新組織;但是如果資料都在一個機器上,那就沒有必要重新組織)
- RCFile通過列進行資料壓縮,因為同一列都是相同的資料型別,所以壓縮比比較好
- RCFile可以跳過不必要的列讀取
從以上幾點也可以看出它是兼顧了行式和列式儲存的部分優點。
ORC File
ORCFile儲存格式,就是Optimized RC File的縮寫。意指優化的RCFile儲存格式。
ORC File 和 RC File比較
- 每一個任務只輸出單個檔案,這樣可以減少NameNode的負載
- 支援各種複雜的資料型別,比如datetime,decimal,以及複雜的struct,List,map等
- 在檔案中儲存了輕量級的索引資料
- 基於資料型別的塊模式壓縮:比如Integer型別使用RLE(RunLength Encoding)演算法,而字串使用字典編碼(DictionaryEncoding)
- 使用單獨的RecordReader並行讀相同的檔案
- 無需掃描標記就能分割檔案
- 繫結讀寫所需要的記憶體
- 元資料儲存使用PB,允許新增和刪除欄位
Hive ROW FORMAT
Serde是 Serializer/Deserializer的簡寫。hive使用Serde進行行物件的序列與反序列化。
你可以建立表時使用使用者自定義的Serde或者native Serde,如果 ROW FORMAT沒有指定或者指定了 ROW FORMAT DELIMITED就會使用native Serde。
hive已經實現了許多自定義的Serde,之前我們在介紹stored時也涉及到:
- Avro (Hive 0.9.1 and later)
- ORC (Hive 0.11 and later)
- RegEx
- Thrift
- Parquet (Hive 0.13 and later)
- CSV (Hive 0.14 and later)
- JsonSerDe (Hive 0.12 and later)
Hive寫入資料的方式
和我們熟悉的關係型資料庫不一樣,Hive現在還不支援在insert語句裡面直接給出一組記錄的文字形式,也就是說,Hive並不支援INSERT INTO …. VALUES形式的語句。
從本地檔案系統中匯入資料到Hive表
load data local inpath 'xxx.txt' into table xxx;
從HDFS上匯入資料到Hive表
load data inpath '/home/xxx/add.txt' into table xxx
alter table db.access_log add partition (dt='18-09-18') location ' ofollow,noindex">hdfs://ns/hive/warehouse/access_log/dt=18-09-18' ;
從別的表中查詢出相應的資料並匯入到Hive表中
insert overwrite table db.log_v2 partition(dt='18-09-26') select uid,model,key,value,time from db.log where dt='18-09-26';
在建立表的時候通過從別的表中查詢出相應的記錄並插入到所建立的表中
create table test4 as select id, name, tel from xxx;
歡迎關注高廣超的簡書部落格 與 收藏文章 !
個人介紹:
高廣超:多年一線網際網路研發與架構設計經驗,擅長設計與落地高可用、高效能、可擴充套件的網際網路架構。目前從事大資料相關研發與架構工作。
本文首發在高廣超的簡書部落格 轉載請註明!