Hive面試題整理(一)
1、Hive表關聯查詢,如何解決數據傾斜的問題?(☆☆☆☆☆)
1)傾斜原因:map輸出數據按key Hash的分配到reduce中,由於key分佈不均勻、業務數據本身的特、建表時考慮不周、等原因造成的reduce 上的數據量差異過大。
(1)key分佈不均勻;
(2)業務數據本身的特性;
(3)建表時考慮不周;
(4)某些SQL語句本身就有數據傾斜;
如何避免:對於key為空產生的數據傾斜,可以對其賦予一個隨機值。
2)解決方案
(1)參數調節:
hive.map.aggr = true
hive.groupby.skewindata=true
有數據傾斜的時候進行負載均衡,當選項設定位true,生成的查詢計劃會有兩個MR Job。第一個MR Job中,Map的輸出結果集合會隨機分佈到Reduce中,每個Reduce做部分聚合操作,並輸出結果,這樣處理的結果是相同的Group By Key有可能被分發到不同的Reduce中,從而達到負載均衡的目的;第二個MR Job再根據預處理的數據結果按照Group By Key 分佈到 Reduce 中(這個過程可以保證相同的 Group By Key 被分佈到同一個Reduce中),最後完成最終的聚合操作。
(2)SQL 語句調節:
① 選用join key分佈最均勻的表作為驅動表。做好列裁剪和filter操作,以達到兩表做join 的時候,數據量相對變小的效果。
② 大小表Join:
使用map join讓小的維度表(1000 條以下的記錄條數)先進內存。在map端完成reduce。
③ 大表Join大表:
把空值的key變成一個字符串加上隨機數,把傾斜的數據分到不同的reduce上,由於null 值關聯不上,處理後並不影響最終結果。
④ count distinct大量相同特殊值:
count distinct 時,將值為空的情況單獨處理,如果是計算count distinct,可以不用處理,直接過濾,在最後結果中加1。如果還有其他計算,需要進行group by,可以先將值為空的記錄單獨處理,再和其他計算結果進行union。
2、Hive的HSQL轉換為MapReduce的過程?(☆☆☆☆☆)
HiveSQL ->AST(抽象語法樹) -> QB(查詢塊) ->OperatorTree(操作樹)->優化後的操作樹->mapreduce任務樹->優化後的mapreduce任務樹
過程描述如下:
SQL Parser:Antlr定義SQL的語法規則,完成SQL詞法,語法解析,將SQL轉化為抽象語法樹AST Tree;
Semantic Analyzer:遍歷AST Tree,抽象出查詢的基本組成單元QueryBlock;
Logical plan:遍歷QueryBlock,翻譯為執行操作樹OperatorTree;
Logical plan optimizer: 邏輯層優化器進行OperatorTree變換,合併不必要的ReduceSinkOperator,減少shuffle數據量;
Physical plan:遍歷OperatorTree,翻譯為MapReduce任務;
Logical plan optimizer:物理層優化器進行MapReduce任務的變換,生成最終的執行計劃。
3、Hive底層與數據庫交互原理?(☆☆☆☆☆)
由於Hive的元數據可能要面臨不斷地更新、修改和讀取操作,所以它顯然不適合使用Hadoop文件系統進行存儲。目前Hive將元數據存儲在RDBMS中,比如存儲在MySQL、Derby中。元數據信息包括:存在的表、表的列、權限和更多的其他信息。
4、Hive的兩張表關聯,使用MapReduce怎麼實現?(☆☆☆☆☆)
如果其中有一張表為小表,直接使用map端join的方式(map端加載小表)進行聚合。
如果兩張都是大表,那麼採用聯合key,聯合key的第一個組成部分是join on中的公共字段,第二部分是一個flag,0代表表A,1代表表B,由此讓Reduce區分客戶信息和訂單信息;在Mapper中同時處理兩張表的信息,將join on公共字段相同的數據劃分到同一個分區中,進而傳遞到一個Reduce中,然後在Reduce中實現聚合。
5、請談一下Hive的特點,Hive和RDBMS有什麼異同?
hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析,但是Hive不支持實時查詢。
Hive與關係型數據庫的區別:
6、請說明hive中 Sort By,Order By,Cluster By,Distrbute By各代表什麼意思?
order by:會對輸入做全局排序,因此只有一個reducer(多個reducer無法保證全局有序)。只有一個reducer,會導致當輸入規模較大時,需要較長的計算時間。
sort by:不是全局排序,其在數據進入reducer前完成排序。
distribute by:按照指定的字段對數據進行劃分輸出到不同的reduce中。
cluster by:除了具有 distribute by 的功能外還兼具 sort by 的功能。
7、寫出hive中split、coalesce及collect_list函數的用法(可舉例)?
split將字符串轉化為數組,即:split(‘a,b,c,d’ , ‘,’) ==> [“a”,”b”,”c”,”d”]。
coalesce(T v1, T v2, …) 返回參數中的第一個非空值;如果所有值都為 NULL,那麼返回NULL。
collect_list列出該字段所有的值,不去重 => select collect_list(id) from table。
8、Hive有哪些方式保存元數據,各有哪些特點?
Hive支持三種不同的元存儲服務器,分別為:內嵌式元存儲服務器、本地元存儲服務器、遠程元存儲服務器,每種存儲方式使用不同的配置參數。
內嵌式元存儲主要用於單元測試,在該模式下每次只有一個進程可以連接到元存儲,Derby是內嵌式元存儲的默認數據庫。
在本地模式下,每個Hive客戶端都會打開到數據存儲的連接並在該連接上請求SQL查詢。
在遠程模式下,所有的Hive客戶端都將打開一個到元數據服務器的連接,該服務器依次查詢元數據,元數據服務器和客戶端之間使用Thrift協議通信。
9、Hive內部表和外部表的區別?
創建表時:創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑,不對數據的位置做任何改變。
刪除表時:在刪除表的時候,內部表的元數據和數據會被一起刪除, 而外部表只刪除元數據,不刪除數據。這樣外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據。
10、Hive 中的壓縮格式TextFile、SequenceFile、RCfile 、ORCfile各有什麼區別?
1、TextFile
默認格式,存儲方式為行存儲,數據不做壓縮,磁盤開銷大,數據解析開銷大。可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,壓縮後的文件不支持split,Hive不會對數據進行切分,從而無法對數據進行並行操作。並且在反序列化過程中,必須逐個字符判斷是不是分隔符和行結束符,因此反序列化開銷會比SequenceFile高几十倍。
2、SequenceFile
SequenceFile是Hadoop API提供的一種二進制文件支持,存儲方式為行存儲,其具有使用方便、可分割、可壓縮的特點。
SequenceFile支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮。
優勢是文件和hadoop api中的MapFile是相互兼容的
3、RCFile
存儲方式:數據按行分塊,每塊按列存儲。結合了行存儲和列存儲的優點:
首先,RCFile 保證同一行的數據位於同一節點,因此元組重構的開銷很低;
其次,像列存儲一樣,RCFile 能夠利用列維度的數據壓縮,並且能跳過不必要的列讀取;
4、ORCFile
存儲方式:數據按行分塊 每塊按照列存儲。
壓縮快、快速列存取。
效率比rcfile高,是rcfile的改良版本。
總結:相比TEXTFILE和SEQUENCEFILE,RCFILE由於列式存儲方式,數據加載時性能消耗較大,但是具有較好的壓縮比和查詢響應。
數據倉庫的特點是一次寫入、多次讀取,因此,整體來看,RCFILE相比其餘兩種格式具有較明顯的優勢。
11、所有的Hive任務都會有MapReduce的執行嗎?
不是,從Hive0.10.0版本開始,對於簡單的不需要聚合的類似SELECT from LIMIT n語句,不需要起MapReduce job,直接通過Fetch task獲取數據。
12、Hive的函數:UDF、UDAF、UDTF的區別?
UDF:單行進入,單行輸出
UDAF:多行進入,單行輸出
UDTF:單行輸入,多行輸出
13、說說對Hive桶表的理解?
桶表是對數據進行哈希取值,然後放到不同文件中存儲。
數據加載到桶表時,會對字段取hash值,然後與桶的數量取模。把數據放到對應的文件中。物理上,每個桶就是表(或分區)目錄里的一個文件,一個作業產生的桶(輸出文件)和reduce任務個數相同。
桶表專門用於抽樣查詢,是很專業性的,不是日常用來存儲數據的表,需要抽樣查詢時,才創建和使用桶表。