廣州哪家做網(wǎng)站還可以百度上怎么做推廣
hive出現(xiàn)的原因
Hive 出現(xiàn)的原因主要有以下幾個:
- 傳統(tǒng)數(shù)據(jù)倉庫無法處理大規(guī)模數(shù)據(jù):傳統(tǒng)的數(shù)據(jù)倉庫通常采用關(guān)系型數(shù)據(jù)庫作為底層存儲,這種數(shù)據(jù)庫在處理大規(guī)模數(shù)據(jù)時效率較低。
- MapReduce 難以使用:MapReduce 是一種分布式計算框架,它可以用于處理大規(guī)模數(shù)據(jù),但 MapReduce 的編程模型比較復雜,難以使用。
- 需要一種統(tǒng)一的查詢接口:傳統(tǒng)的數(shù)據(jù)倉庫和 MapReduce 都提供了數(shù)據(jù)查詢的接口,但這些接口相互獨立,難以統(tǒng)一管理。
為了解決這些問題,Facebook 在 2008 年開發(fā)了 Hive,Hive 是一種基于 Hadoop 的分布式數(shù)據(jù)倉庫管理系統(tǒng),它提供了一種 SQL 語法來訪問存儲在 Hadoop 分布式文件系統(tǒng) (HDFS) 中的數(shù)據(jù)。Hive 的出現(xiàn),解決了傳統(tǒng)數(shù)據(jù)倉庫無法處理大規(guī)模數(shù)據(jù)的問題,也簡化了 MapReduce 的使用,并提供了一種統(tǒng)一的查詢接口。
Hive 的出現(xiàn),對大數(shù)據(jù)處理產(chǎn)生了重大影響,它使大數(shù)據(jù)處理變得更加簡單、高效、可擴展。
hive執(zhí)行過程
- 編寫 Hive SQL 程序:首先,需要編寫 Hive SQL 程序,這個程序可以通過 Hive CLI、Hive WebUI 等工具進行編寫。Hive SQL 程序可以包含各種數(shù)據(jù)查詢語句,例如 select、insert、update、delete 等。
- 提交 Hive SQL 程序:編寫完成后,需要將 Hive SQL 程序提交到 Hive 服務(wù)器。Hive 服務(wù)器會根據(jù) Hive SQL 程序的語法和邏輯進行解析,并生成 MapReduce 任務(wù)。
- 執(zhí)行 MapReduce 任務(wù):MapReduce 任務(wù)會將 Hive SQL 程序中的查詢語句轉(zhuǎn)換為 Map 和 Reduce 任務(wù)。Map 任務(wù)會將數(shù)據(jù)分割成小塊,并將數(shù)據(jù)進行預(yù)處理。Reduce 任務(wù)會將 Map 任務(wù)的輸出結(jié)果進行合并和聚合。
- 生成查詢結(jié)果:MapReduce 任務(wù)完成后,Hive 服務(wù)器會將查詢結(jié)果生成到 HDFS 中。
- 從 HDFS 中取數(shù):最后,可以通過 Hive CLI、Hive WebUI 等工具從 HDFS 中取出查詢結(jié)果。
具體來說,Hive SQL 程序的執(zhí)行過程如下:
- SqlParser 將 Hive SQL 程序解析為 AST(抽象語法樹)
- SemanticAnalyzer 對 AST 進行語義分析
- Optimizer 對 AST 進行優(yōu)化
- Planner 生成執(zhí)行計劃
- Driver 將執(zhí)行計劃發(fā)送到 MapReduce 框架
- MapReduce 框架啟動 Map 和 Reduce 任務(wù)
- Map 和 Reduce 任務(wù)生成查詢結(jié)果
- Hive 服務(wù)器將查詢結(jié)果寫入 HDFS
- 用戶從 HDFS 中取出查詢結(jié)果
這個過程可以分為兩個階段:
- Hive SQL 解析和執(zhí)行階段:這個階段是 Hive SQL 程序執(zhí)行的核心階段,包括 Hive SQL 程序的解析、優(yōu)化、計劃、執(zhí)行等過程。
- HDFS 寫入和讀取階段:這個階段是將查詢結(jié)果寫入 HDFS 以及從 HDFS 中取出查詢結(jié)果的過程。
需要注意的是,Hive SQL 程序的執(zhí)行過程可以根據(jù) Hive 服務(wù)器的配置進行調(diào)整。例如,可以通過配置 Hive 的參數(shù)來控制 MapReduce 任務(wù)的數(shù)量和并行度。
hive服務(wù)器包含哪些部分
HiveServer2
HiveServer2 是 Hive 的服務(wù)器端,它負責接收用戶的 Hive SQL 請求,并將這些請求轉(zhuǎn)換為 MapReduce 任務(wù)
HiveServer2 的轉(zhuǎn)換步驟如下:
- 解析階段:HiveServer2 會使用 ANTLR 解析器來解析 Hive SQL 請求,生成抽象語法樹 (AST)。AST 是 Hive SQL 請求的結(jié)構(gòu)化表示,它包含了 Hive SQL 請求的語法信息。
- 語義分析階段:HiveServer2 會使用 SemanticAnalyzer 來對 AST 進行語義分析,檢查 Hive SQL 請求的語義是否正確。語義分析會檢查 Hive SQL 請求中的變量、常量、表達式等是否正確,以及 Hive SQL 請求是否符合 Hive 的語義規(guī)則。
- 優(yōu)化階段:HiveServer2 會使用 Optimizer 來對 AST 進行優(yōu)化,提高 Hive SQL 請求的執(zhí)行效率。優(yōu)化會根據(jù) Hive SQL 請求的語義和數(shù)據(jù)分布情況,生成最優(yōu)的執(zhí)行計劃。
- 生成執(zhí)行計劃階段:HiveServer2 會使用 Planner 來生成執(zhí)行計劃。執(zhí)行計劃是 Hive SQL 請求的執(zhí)行指南,它包含了 MapReduce 任務(wù)的數(shù)量、分區(qū)、輸入輸出等信息。
- 執(zhí)行階段:HiveServer2 會將執(zhí)行計劃發(fā)送到 MapReduce 框架,由 MapReduce 框架執(zhí)行 Hive SQL 請求。MapReduce 框架會將 Hive SQL 請求拆分為多個 Map 和 Reduce 任務(wù),并在多個節(jié)點上并行執(zhí)行。
Hive Metastore
Hive Metastore 是 Hive 的元數(shù)據(jù)存儲,它存儲了 Hive 數(shù)據(jù)庫、表、列、分區(qū)等元數(shù)據(jù)信息
Hive Metastore 使用 MySQL 存儲元數(shù)據(jù),提供以下優(yōu)點:
可擴展性:MySQL 是一個可擴展的數(shù)據(jù)庫,可以支持大量的并發(fā)連接。
可靠性:MySQL 支持 ACID 事務(wù),保證了數(shù)據(jù)的一致性和完整性。
性能:MySQL 是一個高性能的數(shù)據(jù)庫,可以滿足 Hive 的性能需求。
性能優(yōu)化
要盡可能減少生成的 MapReduce 任務(wù)量,在編寫 HiveSQL 時應(yīng)該注意以下幾點:
- 盡量使用 join 而不是 union。 union 操作會導致兩個表的數(shù)據(jù)分別作為 MapReduce 任務(wù)的輸入,而 join 操作只會生成一個 MapReduce 任務(wù)。
- 盡量使用 where 子句來過濾數(shù)據(jù)。 where 子句可以過濾掉不需要的數(shù)據(jù),減少 MapReduce 任務(wù)處理的數(shù)據(jù)量。
- **盡量使用分區(qū)表。**分區(qū)表可以將數(shù)據(jù)分布到多個文件中,減少 MapReduce 任務(wù)之間的數(shù)據(jù) shuffle 量。
- 使用 coalesce 函數(shù)合并小文件。 coalesce 函數(shù)可以將多個小文件合并為一個大文件,減少 MapReduce 任務(wù)之間的數(shù)據(jù) shuffle 量。
- 使用 mapjoin 操作。 mapjoin 操作可以將 Map 任務(wù)和 Reduce 任務(wù)合并為一個任務(wù),減少 MapReduce 任務(wù)的數(shù)量。
以下是一些具體的示例:
- 使用 join 而不是 union:
# 使用 union,生成兩個 MapReduce 任務(wù)
select * from table1 union all select * from table2;# 使用 join,生成一個 MapReduce 任務(wù)
select * from table1 join table2 on table1.id = table2.id;
- 使用 where 子句來過濾數(shù)據(jù):
# 不使用 where 子句,生成一個 MapReduce 任務(wù)
select * from table1;# 使用 where 子句,生成一個 MapReduce 任務(wù)
select * from table1 where id = 1;
- 使用分區(qū)表:
# 使用不分區(qū)表,生成一個 MapReduce 任務(wù)
select * from table1;# 使用分區(qū)表,生成多個 MapReduce 任務(wù)
select * from table1 partition(d1, d2, d3);
- 使用 coalesce 函數(shù)合并小文件:
# 不使用 coalesce 函數(shù),生成多個 MapReduce 任務(wù)
select * from table1;# 使用 coalesce 函數(shù),生成一個 MapReduce 任務(wù)
select * from table1 coalesce(1000);
- 使用 mapjoin 操作:
# 不使用 mapjoin 操作,生成兩個 MapReduce 任務(wù)
select * from table1 join table2 on table1.id = table2.id;# 使用 mapjoin 操作,生成一個 MapReduce 任務(wù)
select * from table1 mapjoin table2 on table1.id = table2.id;
總結(jié)
也就是說,hive sql通過將sql轉(zhuǎn)換成map reduce任務(wù),使得開發(fā)人員可以通過編寫sql來替代寫map reduce代碼,由于sql是通用的,很多數(shù)據(jù)分析人員都有此技術(shù)棧,相對寫map reduce代碼要容易上手很多。對于同樣一個取數(shù)需求,hive sql編寫方式的不同,會導致Map Reduce任務(wù)的創(chuàng)建量不同,所以盡可能編寫少的Map Reduce的任務(wù)的SQL也是性能優(yōu)化需要關(guān)注的點。