目錄
1. Hive 中內部表和外部表的區別以及使用場景內部表:
2. Hive 有哪些保存元資料的方式
3. Hive 中磁區表和分桶表的區別和使用場景
4. Hive 查詢的時候 on 和 where 的區別
5. Hive 中 inner join、left join 和 right join 的區別
6. Hive 的執行計劃
7. Hive 和 MySQL 的區別,為什么大資料選用 Hive
8. Hive 的調優
9. 資料傾斜的產生原因和解決方案
10. Hive 的自定義有哪些
11. Hive 中 sort by,order by,cluster by,distribute by的作用
12. 簡單描述資料庫中的 null,說出 null 在 Hive 底層如何存盤
1. Hive 中內部表和外部表的區別以及使用場景
內部表:
- 與資料庫中的表在概念上類似
- 每一個內部表在 hive 中都有一個相應的目錄存盤資料
- 所有的內部表資料都保存在這個目錄上
- 洗掉資料時,元資料和資料都會被洗掉
- 應用場景:資料分析的中間表可以使用內部表,方便對表進行管理
外部表:
- 創建時需要使用 external 修飾,指向已經在 HDFS 中存在的資料,可以創建 Partition
- 它和內部表在元資料的組織上是相同的,都是存盤在關系資料庫中
- 外部表只有一個程序,加載資料和創建表同時完成,并不會移動到資料目錄中,只是與外部資料建立一個連接,當洗掉外部表時,僅洗掉連接和元資料,資料并不會被洗掉
- 應用場景:近源層(ODS)資料應采用外部表
總結:內部表資料由 hive 自己管理,而外部表資料由 HDFS 管理
2. Hive 有哪些保存元資料的方式
內嵌模式:
內嵌資料庫 derby,安裝小,基于 java、JDBC 和 SQL 標準
本地模式:
MySQL 資料庫,資料存盤模式可以自己設定,持久化好,查看方便
遠程模式:
用于非 Java 客戶端訪問元資料庫,在服務器端啟動 MetaStoreServer,客戶端利用 Thrift 協議通過 MetaStoreServer 訪問元資料庫,它將 Metastore 分離出來,成為一個獨立的 Hive 服務(Metastore 服務還可以部署多個),這樣的模式可以將資料庫層完全置于防火墻后,客戶就不再需要用戶名和密碼登錄資料庫,避免認證資訊的泄露,
補充:
Thrift是一種介面描述語言和二進制通訊協議,它被用來定義和創建跨語言的服務,它被當作一個遠程程序呼叫(RPC)框架來使用,是由Facebook為“大規模跨語言服務開發”而開發的,
3. Hive 中磁區表和分桶表的區別和使用場景
磁區表:
- 磁區的本質是分檔案夾,檔案夾以磁區名命名,不同磁區的資料存放到不同的檔案夾下
- 查詢時當where指定為磁區名時直接到指定磁區檔案夾掃描資料,效率大幅提高
(1)靜態磁區表:
靜態磁區需要手動指定磁區名
支持 load 和 insert 兩種插入方式
適用于磁區數少,磁區名可以明確的資料
(2)動態磁區表:
根據磁區欄位的實際值,動態進行磁區
是在 SQL 執行的時候進行磁區
需要先將動態磁區設定打開 set.hive.exec.dynamic.partition.mode=nonstrict
只能用 insert 方式
通過普通表選出的欄位包含磁區欄位,磁區欄位放置在最后,多分磁區字段按照磁區順序放置
分桶表:
- 分桶是相對磁區進行更新粒度的劃分
- 分桶將整個資料內容按照某列屬性值的hash值進行磁區,hash值和設定分桶數量取余,對應變好的資料進入同一桶中
- 對兩個都進行桶操作的表并且表中有相同列進行 join 操作時,那么將保存相同列值的同進行join操作就可以,可以大大減少 join 的資料量
- 使取樣(sampling)更高效
備注:動態磁區在實際開發中應用比較廣泛,例如對時間維度進行動態磁區
4. Hive 查詢的時候 on 和 where 的區別
on 在 join 時執行,where 在 join 結束后執行,能用 join and 盡量不要用 where
5. Hive 中 inner join、left join 和 right join 的區別
- inner join:內連接,類似于取交集
- left join:以左邊的表為主表,若關聯欄位在右表中沒有資料,則用 null 填充
- right join: 以右邊的表作為主表,拖關聯欄位在左表中沒有資料,則用 null 填充
6. Hive 的執行計劃
- Antlr 定義 SQL的語法規則,完成 SQL 詞法和語法的決議,將 SQL轉化為抽象語法樹 AST Tree
- 遍歷抽象語法樹,抽象出查詢的基本組成元素 QueryBlock
- 遍歷 QueryBlock,翻譯為執行操作樹 OperatorTree
- 邏輯層優化器對 OperatorTree 進行變化,合并不需要的 ReduceSinkOperator,減少 shuffle 資料量
- 遍歷優化后的 OperatorTree,翻譯為 MapReduce 任務
- 物理層優化器進行 MapReduce 任務的變化,生成最終的執行計劃
7. Hive 和 MySQL 的區別,為什么大資料選用 Hive
- 查詢語言不同: Hive 是 HQL 語言,MySQL 是 SQL 陳述句
- 資料存盤位置不同:Hive 是把資料存盤在 HDFS 上;MySQL 資料是存盤在自己的系統中
- 資料格式:Hive 資料格式可以用戶自定義;MySQL 有自己的系統定義格式
- 延遲性:Hive 延遲性高,不適合 OLTP;MySQL 延遲性低,適合OLTP
- 資料規模:Hive 存盤的資料量超級大(基于 HDFS);MySQL 只是存出一些少量業務資料
- 底層執行原理:Hive 的底層用的是 (Tez,MapReduce、Spark),而 MySQL 是 executor 執行器
8. Hive 的調優
- 本地模式:針對資料量小的查詢
- 并行執行:對于有多個子查詢且子查詢之間不糊干擾的情況下可以設定并行執行
- JVM重用:降低因 JVM 頻繁開啟關閉所產生的消耗
- 嚴格模式:可以有效避免用戶不規范的查詢操作,開啟嚴格模式后可以進制3種型別的查詢
- 對于磁區表,除非 where 陳述句中含有磁區欄位過濾條件來限制范圍,否則不允許執行
- 對于使用了 order by 陳述句的查詢,要求必須使用 limit 陳述句
- 限制笛卡爾積的查詢
- 合理設定 map 和 reduce 的數量
- Fetch 抓取:select * from table_name 時可以考慮開啟fetch抓取模式
- 開啟防止資料傾斜的引數,會生成2個 MR job
- 推測執行:使用 expain查看執行計劃,優化 HQL 陳述句,常見優化有
- in/exist后面有子查詢時,可以用 left semi join
- 盡量使用 = 代替 <>
- 同欄位關聯的表盡量連在一起
- 使用資料壓縮
9. 資料傾斜的產生原因和解決方案
產生原因:
- 業務資料本身的特性:如道路交通的早晚高峰,房地產銷售的淡旺季、電商平臺銷售資料受節假日和活動的影響
- 建表時考慮不周:近源層沒有采用磁區和資料壓縮,dm層沒有輕量聚合
- SQL 查詢導致的資料傾斜:
- 大表 join 小表,小表的 key 值集中,分發到某一個或者幾個 Reduce 上的資料遠高于均值
- 大表 join 大表,但是分桶的判斷欄位0值或空值過多,這些空值都由一個 Reduce 處理
- group by 維度過小,某值的數量過多,處理某值的 Reduce 非常耗時
- count(distinct)某特殊值過多,處理此特殊值的 Reduce 非常耗時
解決方案:
- 優化資料模型:近源層采用磁區和資料壓縮,中間層做輕量聚合
- 調整引數:hive.map.aggr=true,map 端部分聚合,相當于 Combinerhive.groupby.skewindata=true,有資料傾斜時會進行負載均衡,當選項為 true 時,生成的執行計劃有兩個 MR job
- SQL調整:
- 驅動表的選取:選用 join key 分布最均勻的表作為驅動表,做好列裁剪和 filter,減少 join 操作時的資料量
- 小表 join 大表,讓小表先進記憶體,盡量在 map完成 reduce
- 大表 join 大表:把空值的 key 變成一個字串加上亂數,把傾斜的資料分到不同的 Reduce 上,由于 null 關聯不上,處理后并不會影響最終結果
- 使用 count(1)配合 group by 代替 count(distinct)操作
- 特殊情況處理:在業務邏輯優化效果不大的情況下,有些時候可以將傾斜的資料單獨拿出來處理,最后 union 回去
10. Hive 的自定義有哪些
UDF(User-Defined-Function)資料清洗
UDAF(User-Defined Aggregation Function)聚合函式
UDTF(User-Defined Table-Generating Funtion)側視圖
11. Hive 中 sort by,order by,cluster by,distribute by的作用
order by:對查詢的結果做一次全域排序,也就是說所有資料都會進到同一個 Reducer 進行處理,在資料量大的情況下可能不能出結果,所以在嚴格模式下必須配合 limit 使用
sort by:在每個 Reducer 端進行排序,保證了每個 Reducer 內的資料有序
distribute by:控制 map 的輸出在 reducer 是如何劃分的,視窗函式的over從句中常將distribute by 和 sort by 結合使用
cluster by:當 distribute by 和 sort by 欄位相同時,可以使用 cluster by 代替,另外 cluster 指定的列只能是降序
12. 簡單描述資料庫中的 null,說出 null 在 Hive 底層如何存盤
null 與任何值運算的結果都是 null,可以使用 is null,is not null 函式指定其值為 null情況下的取值
null 在hive 底層默認的是用 ‘\n’ 來存盤的,可以通過 alter table test set serdeproperites('serialization.null.format'='a'); 來修改
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/299026.html
標籤:其他
下一篇:MySQL45講之優化器選錯索引
