一個數據倉庫時代開始--Hive


1、什麼是 Apache Hive?

Apache Hive 是一個基於 Hadoop Haused 構建的開源數據倉庫系統,咱們使用它來查詢和分析存儲在 Hadoop 文件中的大型數據集。此外,經過使用 Hive,咱們能夠在 Hadoop 中處理結構化和半結構化數據。程序員

換句話說,Hive 是一個數據倉庫基礎設施,便於查詢和管理駐留在分佈式存儲系統中的大型數據集。它提供了一種類 SQL 的查詢語言 HiveQL(Hive Query Language)查詢數據的方法。 此外,編譯器在內部將 HiveQL 語句轉換爲 MapReduce、Tez、Spark 等做業。進一步提交給 Hadoop 框架執行。

數據庫

2、咱們爲何要使用 Hive 技術?

隨着 Hadoop MapReduce 的出現,極大的簡化大數據編程的難度,使得普通程序員也能從事開發大數據編程。但在生產活動中常常要對大數據計算分析是從事商務智能行業(BI)的工程師,他們一般使用 SQL 語言進行大數據統計以及分析,而 Mapreduce 編程是有必定的門檻,若是每次都採用 MapReduce 開發計算分析,這樣成本就過高效率過低,那麼有沒有更簡單的辦法,能夠直接經過 SQL 在大數據平臺下運行進行統計分析?有的,答案便是 Hive。apache

Hive 主要用於數據查詢,統計和分析,提升開發人員的工做效率。Hive 經過內置函數將 SQL 語句生成 DAG(有向無環圖),再讓 Mapreduce 計算處理。從而獲得咱們想要的統計結果。並且在處理具備挑戰性的複雜分析處理和數據格式時,極大的簡化了開發難度。

編程

3、Hive 架構

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 引擎都不支持。

相關文章
相關標籤/搜索