一、關於Hive
1.1 什麼是Hive
Hive是構建在Hadoop之上的數據倉庫軟件。它提供類似sql的查詢語句HiveQL對數據進行分析處理,Hive將HiveQL語句轉換成一系列MapReduce作業並執行。
目前,Hive除了支持MapReduce計算引擎,還支持Spark和Tez這兩種分佈式計算引擎,常用於離線批處理。
http://hive.apache.org/
1.2 什麼是數據倉庫
數據倉庫(Data Warehouse),是一個面向主題、集成的、隨時間變化的,但信息本身相對穩定的數據集合,用於對管理決策過程的支持。
https://www.jianshu.com/p/0b6414f92442
1.3 Hive的特點
- 可通過類SQL來分析大數據,避免了寫MapReduce程序來分析數據;
- 數據存儲在HDFS上,Hive本身不提供數據的存儲功能;
- Hive將數據映射成數據庫和一張張表,庫和表的元數據信息一般存在關係型數據庫上(如MySQL);
- 數據存儲方面:可以存儲很大的數據集,對數據完整性、格式要求並不嚴格;
- 數據處理方面:不適用於實時計算的場景,適用於離線分析。
二、Hive的體系結構
Hive的元數據:包括表的名字、列、分區、屬性(內/外部表)以及表數據所在目錄等。將元數據存儲在數據庫中(metastore),支持mysql、derby、oracle等數據庫。
解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後由MapReduce調用生成。
三、Hive重要概念
3.1 外部表和內部表
內部表(managed table)
- 默認創建的是內部表,即 create table xxx (xx xxx),存儲位置在 hive.metastore.warehouse.dir 設置,默認位置爲 /user/hive/warehouse
- 導入數據的時候是將文件剪切到指定位置,即原有路徑下文件將不再存在
- 刪除表時,數據和元數據都將被刪除
外部表(external table)
- 外部表可以在外部系統上,只要有訪問權限即可
- 外部表導入文件時不移動文件,僅僅是添加一個metadata
- 刪除外部表時元數據不會被刪除
- 分辨外部表、內部表可以用 DESCRIBE FORMATTED table_name 命令查看
- 創建外部表命令添加一個external即可,即 create external table xxx (xxx)
- 外部表指向的數據發生變化時會自動更新,不用特殊處理
3.2 分區表和桶表
分區(partioned)
- 有時數據是有組織的,比如按時間/類型等分類,而查詢數據的時候也經常只關心部分數據,比方說 我只想查詢2017年8月8日,此時可以創建分區,查詢具體某一天數據時,不需要掃描全部目錄,所以會明顯優化性能
- 一個Hive表在HDFS上是有一個對應的目錄來存儲數據,普通表的數據直接存儲在這個目錄下,而分區表數據存儲時,是再劃分子目錄來存儲的
- 使用 partioned by (xxx) 來創建表的分區
分桶(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進行查詢時,可以快速確定數據存在於哪個桶中,而只遍歷一個桶可以提高查詢效率
3.3 Hive文件格式
Hive文件存儲格式包括以下幾類:
- TEXTFILE
- SEQUENCEFILE
- RCFILE
- ORCFILE( 0.11以後出現)
其中,TEXTFILE爲默認格式,導入數據時會直接將數據文件copy到hdfs上不進行處理;
其他三種格式的表不能直接從本地文件導入數據,數據要先導入到 TEXTFILE 格式的表中,然後再從表中用 insert 導入 SequenceFile,RCFile,ORCFile 表中。
3.4 列式存儲和行式存儲
Hive文件存儲格式包括以下幾類:
先來看一張表的存儲格式:
行式存儲:
優點:
- 相關數據保存在一起,較符合面向對象的思維,一行數據就是一條記錄
- 便於進行insert/update操作
缺點:
- 如果查詢只涉及某幾個列,他會把整行數據都讀取處理,不能跳過不必要的列讀取,在數據量較大時影響性能
- 每行中,列的數據類型不一致,導致不容易獲得一個較高的壓縮比,即空間利用率不高
- 不是所有的列都適合作爲索引
列式存儲:
優點:
- 查詢時,只有涉及到的列纔會被查詢,不需遍歷所有的列
- 壓縮率較高,節省存儲空間及計算內存
- 任何列均可作爲索引
缺點:
- insert/update 較麻煩
- 不適合小量數據的掃描提取
四、Hive寫入數據方式
- 從本地文件系統中導入數據到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 '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
五、Hive與關係型數據庫對比
HQL | SQL | |
---|---|---|
數據存儲 | HDFS、Hbase | Local FS |
數據格式 | 用戶自定義 | 系統決定 |
數據更新 | 不支持(將之前的數據覆蓋) | 支持 |
索引 | 有(0.8版之後增加) | 有 |
執行 | MapReduce | Executor |
執行延遲 | 高 | 低 |
可擴展性 | 高(UDF、UDAF、UDTF) | 低 |
數據規模 | 大(數據量大於TB) | 小 |
數據檢查 | 讀時模式 | 寫時模式 |
Hive在0.8之後增加的索引爲位圖索引,而傳統SQL有複雜的索引。
UDF(User-Defined-Function) 一進一出;
UDAF(User- Defined Aggregation Funcation) 聚集函數,多進一出;
UDTF(User-Defined Table-Generating Functions) 一進多出,如lateral view explore()。
六、Hive優化
1、在大數據場景下不擔心數據體量問題,需要注意的是數據傾斜。而避免數據傾斜,關鍵在於找到可能導致數據傾斜的函數,在數據量較大時,需慎用 count(distinct) 等;
2、設置合理的map reduce 的task數量。
參考資料:
https://zhuanlan.zhihu.com/p/46210633
https://zhuanlan.zhihu.com/p/82859179
https://zhuanlan.zhihu.com/p/46210633
https://www.jianshu.com/p/b3e618c8af86
偏技術:
https://blog.csdn.net/youyou1543724847/article/details/83446908