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