Apache Hive 是一個基於 Hadoop Haused 構建的開源數據倉庫系統,咱們使用它來查詢和分析存儲在 Hadoop 文件中的大型數據集。此外,經過使用 Hive,咱們能夠在 Hadoop 中處理結構化和半結構化數據。程序員
換句話說,Hive 是一個數據倉庫基礎設施,便於查詢和管理駐留在分佈式存儲系統中的大型數據集。它提供了一種類 SQL 的查詢語言 HiveQL(Hive Query Language)查詢數據的方法。 此外,編譯器在內部將 HiveQL 語句轉換爲 MapReduce、Tez、Spark 等做業。進一步提交給 Hadoop 框架執行。
數據庫
隨着 Hadoop MapReduce 的出現,極大的簡化大數據編程的難度,使得普通程序員也能從事開發大數據編程。但在生產活動中常常要對大數據計算分析是從事商務智能行業(BI)的工程師,他們一般使用 SQL 語言進行大數據統計以及分析,而 Mapreduce 編程是有必定的門檻,若是每次都採用 MapReduce 開發計算分析,這樣成本就過高效率過低,那麼有沒有更簡單的辦法,能夠直接經過 SQL 在大數據平臺下運行進行統計分析?有的,答案便是 Hive。apache
Hive 主要用於數據查詢,統計和分析,提升開發人員的工做效率。Hive 經過內置函數將 SQL 語句生成 DAG(有向無環圖),再讓 Mapreduce 計算處理。從而獲得咱們想要的統計結果。並且在處理具備挑戰性的複雜分析處理和數據格式時,極大的簡化了開發難度。
編程
Hive 可以直接處理咱們輸入的 HiveQL 語句,調用 MapReduce 計算框架完成數據分析操做。下面是它的架構圖,咱們結合架構圖來看看 Hive 到 MapReduce 整個流程。瀏覽器
由上圖可知,HDFS 和 Mapreduce 是 Hive 架構的根基。Hive 架構主要分爲如下幾個組件:Client、Metastore、Thrift Server、Driver,下面是各個組件介紹:架構
Client:用戶接口組件主要包含 CLI(命令行接口)、JDBC 或 ODBC、WEB GUI(以瀏覽器訪問 Hive);框架
Metastore組件:元數據服務組件, 記錄表名、字段名、字段類型、關聯 HDFS 文件路徑等這些數據庫的元數據信息;編程語言
Driver(執行引擎):包括 Complier 、Optimizer 和 Executor,它們的做用是將 HiveQL 語句進行語法分析、語法解析、語法優化,生成執行計劃,而後提交給 Hadoop MapReduce 計算框架處理;分佈式
Thrift Server:Thrift 是 FaceBook 開發的一個軟件框架,它用來進行可擴展且跨語言的服務的開發, 經過該服務使不一樣編程語言調用 Hive 的接口。函數
咱們經過 CLI 向 Hive 提交 SQL 命令,若是 SQL 是建立數據表的 DDL,Hive 會經過 執行引擎 Driver 將數據表元數據信息存儲 Metastore 中,而若是 SQL 是查詢分析數據的 DQL,經過 Complier 、Optimizer 和 Executor 進行語法分析、語法解析、語法優化操做,生成執行計劃生成一個 MapReduce 的做業,提交給 Hadoop MapReduce 計算框架處理。
到此 Hive 的整個流程就結束了,相信你對 Hive 的整個流程已經有基本瞭解。接下來咱們探討一條 SQL 在 MapReduce 是如何統計分析。
4、SQL如何在Mapreduce執行
左邊是數據表,右邊是結果表,這條 SQL 語句對 age 分組求和,獲得右邊的結果表,到底一條簡單的 SQL 在 MapReduce 是如何被計算, MapReduce 編程模型只包含 map 和 reduce 兩個過程,map 是對數據的劃分,reduce 負責對 map 的結果進行彙總。
select id,age,count(1) from student_info group by age
首先看 map 函數的輸入的 key 和 value,輸入主要看 value,value 就是 user_info 表的每一行數據,輸入的 value 做爲map函數輸出的 key,輸出的 value 固定爲 1,好比<<1,17>,1>。 map 函數的輸出通過 shuffle 處理,shuffle 把相同的 key 以及對應的 value 組合成新<key,value集合>,從 user_info 表看出map輸出 2 次<<1,17>,1>,那麼通過 shuffle 處理後則會輸出<<1,17>,<1,1>>,並將輸出做爲 reduce 函數的輸入。
在 reduce 函數會把全部 value 進行相加後輸出結果,<<1,17>,<1,1>>輸出爲<<1,17>,2>。 這就是一條簡單 SQL 在 Mapreduce 執行過程,可能你會有點迷糊,在這裏我畫了一張流程圖,結合流程圖你會更加清楚。
5、Hive 和 RDBMS 之間的區別
說到 Hive 跟 RDBMS(傳統關係型數據庫)相比有哪些區別,不少人可能仍是說不清楚,在這裏我總結一下關於 Hive 和 RDBMS 之間的區別。
一、Hive 支持部分 SQL 語法,跟標準 SQL 有必定區別。
二、傳統的數據庫在寫入數據會嚴格檢驗數據格式,對於這種咱們成爲讀時模式,而 Hive 是在查詢數據時驗證數據,這種驗證咱們稱爲寫時模式,並且因爲每次都是掃描整個表致使高延時;
三、Hive 是在 Hadoop 上運行的,一般而言 Hive 時一次寫入屢次讀取,而 RDBMS 則是屢次讀寫;
四、Hive 視圖是邏輯存在,並且只讀,不接受 LOAD/INSERT/ALTER,而 RDBMS 視圖根據表變化而變化;
五、Hive 支持多表插入而 RDBMS 是不支持,並且 Hive 對子查詢有嚴格要求,有許多子查詢是不支持;
六、早期 Hive 只支持 INSERT OVERWRITE\INTO TABLE 插入數據,從 0.14.0 開始支持 INSERT INTO ... VALUE 語句按行添加數據,另外 UPDATE 和 DELETE 也容許被執行;
七、在 Hive 0.7.0 以後 Hive 是支持索引的,只是它跟 RDBMS 不同,好比它不支持主鍵和外鍵,而是支持在某些列上創建索引,以提升 Hive 表指定列的查詢速度(可是效果差強人意);
其實對於更新、事物和索引,一開始 Hive 是不支持的,由於這樣很是影響性能,不符合當初數據倉庫的設計,不事後來不斷的發展,也不得不妥協,這也致使 Hive 和 RDBMS 在形式上更加相識。
相信看完這些你們已經對它們之間區別有了一些理解,在這裏我還貼出一張表格,你能夠對照表格加深印象。
比較項 | RDBMS | Hive |
---|---|---|
ANSI SQL | 支持 | 不徹底支持 |
更新 | UPDATE\INSERT\DELETE | UPDATE\INSERT\DELETE(0.14.0以後) |
模式 | 讀時模式 | 寫時模式 |
數據保存 | 磁盤 | HDFS |
延時 | 低 | 高 |
多表插入 | 不支持 | 支持 |
子查詢 | 徹底支持 | 支持 From 子句 |
視圖 | Updatable | Read-only |
索引 | 支持 | 支持表列(0.7.0以後) |
可擴展性 | 低 | 高 |
數據規模 | 小 | 大 |
讀寫 | 一次寫入屢次讀取 | 屢次讀寫 |
分析 | OLTP | OLAP |
執行 | Excutor | MapReduced、Spark等 |
小結
在實際生產過程當中,其實咱們不會常常編寫 MapReduce 程序,起初在網站的大數據分析基本是經過 SQL 進的,也所以 Hive 在大數據中扮演着很是重要做用。隨着 Hive 的普及,咱們但願更多的大數據應用場景中使用 SQL 語句進行分析,因而如今愈來愈多的大數據 SQL 引擎被開發出來。在我看來不管是 Cloudera 的 Impala,仍是後來的 Spark ,對大數據中使用 SQL需求越來迫切, 對大數據 SQL 應用場景更多樣化,咱們只須要經過 SQL 語句就能夠輕易獲得咱們想要的結果。最後說一點,在這些 SQL 引擎基本都是支持類 SQL 語言,但並不像數據庫那樣支持那樣標準 SQL,特別是 Hive 等數據倉庫幾乎必然會用到嵌套查詢 SQL,也就是在 where 條件嵌套 select 子查詢,可是幾乎全部的大數據 SQL 引擎都不支持。