大數據“復活”記
1076
2025-03-31
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 是基于 Hadoop 的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供完整的 sql 查詢功能,可以將 sql語句轉換為MapReduce 任務進行運行。其優點是學習成本低,可以通過類 SQL 語句快速實現簡單的 MapReduce 統計,不必開發專門的 MapReduce 應用,十分適合數據倉庫的統計分析,但是 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) fromtable。
8. Hive 有哪些方式保存元數據,各有哪些特點?
Hive 支持三種不同的元存儲服務器,分別為:內嵌式元存儲服務器、本地元存儲服務器、遠程元存儲服務器,每種存儲方式使用不同的配置參數。內嵌式元存儲主要用于單元測試,在該模式下每次只有一個進程可以連接到元存儲,Derby 是內嵌式元存儲的默認數據庫。在本地模式下,每個 Hive 客戶端都會打開到數據存儲的連接并在該連接上請求 SQL 查詢。在遠程模式下,所有的 Hive 客戶端都將打開一個到元數據服務器的連接,該服務器依次查詢元數據,元數據服務器和客戶端之間使用 Thrift 協議通信。
9.Hive 內部表和外部表的區別?
創建表時:創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑,不對數據的位置做任何改變。刪除表時:在刪除表的時候,內部表的元數據和數據會被一起刪除, 而外部表只刪除元數據,不刪除數據。這樣外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據。
10.Hive 中的壓縮格式 TextFile、SequenceFile、RCfile
ORCfile各有什么區別?
1、TextFile
默認格式,存儲方式為行存儲,數據不做壓縮,磁盤開銷大,數據解析開銷****大??山Y合 Gzip、Bzip2 使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,壓縮后的文件不支持 split,Hive 不會對數據進行切分,從而無法對數據進行并行操作。并且在反序列化過程中,必須逐個字符判斷是不是分隔符和行結束符,因此反序列化開銷會比 SequenceFile 高幾十倍。
2、SequenceFile
SequenceFile 是 Hadoop API 提供的一種二進制文件支持,存儲方式為行存儲,其具有使用方便、可分割、可壓縮的特點。
SequenceFile 支持三種壓縮選擇:NONE,RECORD,BLOCK。Record 壓縮率低,一般建議使用 BLOCK 壓縮。優勢是文件和 hadoop api 中的 MapFile 是相互兼容的
3、RCFile
存儲方式:數據按行分塊,每塊按列存儲。結合了行存儲和列存儲的優點:首先,RCFile 保證同一行的數據位于同一節點,因此元組重構的開銷很低;其次,像列存儲一樣,RCFile 能夠利用列維度的數據壓縮,并且能跳過不必要的列讀?。?/p>
4、ORCFile
存儲方式:數據按行分塊 每塊按照列存儲。
壓縮快、快速列存取。
效率比 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 任務個數相同。桶表專門用于抽樣查詢,是很專業性的,不是日常用來存儲數據的表,需要抽樣查詢時,才創建和使用桶表。
Hive 大數據
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。