一、什麼是 apache hive?
apache hive 是乙個基於 hadoop haused 構建的開源資料倉儲系統,我們使用它來查詢和分析儲存在 hadoop 檔案中的大型資料集。此外,通過使用 hive,我們可以在 hadoop 中處理結構化和半結構化資料。
換句話說,hive 是乙個資料倉儲基礎設施,便於查詢和管理駐留在分布式儲存系統中的大型資料集。它提供了一種類 sql 的查詢語言 hiveql(hive query language)查詢資料的方法。 此外,編譯器在內部將 hiveql 語句轉換為 mapreduce、tez、spark 等作業。進一步提交給 hadoop 框架執行。
二、我們為什麼要使用 hive 技術?
隨著 hadoop mapreduce 的出現,極大的簡化大資料程式設計的難度,使得普通程式設計師也能從事開發大資料程式設計。但在生產活動中經常要對大資料計算分析是從事商務智慧型行業(bi)的工程師,他們通常使用 sql 語言進行大資料統計以及分析,而 mapreduce 程式設計是有一定的門檻,如果每次都採用 mapreduce 開發計算分析,這樣成本就太高效率太低,那麼有沒有更簡單的辦法,可以直接通過 sql 在大資料平台下執行進行統計分析?有的,答案即是 hive。
hive 主要用於資料查詢,統計和分析,提高開發人員的工作效率。hive 通過內建函式將 sql 語句生成 dag(有向無環圖),再讓 mapreduce 計算處理。從而得到我們想要的統計結果。而且在處理具有挑戰性的複雜分析處理和資料格式時,極大的簡化了開發難度。
三、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 是如何統計分析。
四、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 組合成新,1>,那麼經過 shuffle 處理後則會輸出<<1,17>,<1,1>>,並將輸出作為 reduce 函式的輸入。
在 reduce 函式會把所有 value 進行相加後輸出結果,<<1,17>,<1,1>>輸出為<<1,17>,2>。 這就是一條簡單 sql 在 mapreduce 執行過程,可能你會有點迷糊,在這裡我畫了一張流程圖,結合流程圖你會更加清楚。
五、hive 和 rdbms 之間的區別
說到 hive 跟 rdbms(傳統關係型資料庫)相比有哪些區別,很多人可能還是說不清楚,在這裡我總結一下關於 hive 和 rdbms 之間的區別。
1、hive 支援部分 sql 語法,跟標準 sql 有一定區別。
2、傳統的資料庫在寫入資料會嚴格檢驗資料格式,對於這種我們成為讀時模式,而 hive 是在查詢資料時驗證資料,這種驗證我們稱為寫時模式,而且由於每次都是掃瞄整個表導致高延時;
3、hive 是在 hadoop 上執行的,通常而言 hive 時一次寫入多次讀取,而 rdbms 則是多次讀寫;
4、hive 檢視是邏輯存在,而且唯讀,不接受 load/insert/alter,而 rdbms 檢視根據表變化而變化;
5、hive 支援多表插入而 rdbms 是不支援,而且 hive 對子查詢有嚴格要求,有許多子查詢是不支援;
6、早期 hive 只支援 insert overwriteinto table 插入資料,從 0.14.0 開始支援 insert into ... value 語句按行新增資料,另外 update 和 delete 也允許被執行;
7、在 hive 0.7.0 之後 hive 是支援索引的,只是它跟 rdbms 不一樣,比如它不支援主鍵和外來鍵,而是支援在某些列上建立索引,以提高 hive 表指定列的查詢速度(但是效果差強人意);
其實對於更新、事物和索引,一開始 hive 是不支援的,因為這樣非常影響效能,不符合當初資料倉儲的設計,不過後來不斷的發展,也不得不妥協,這也導致 hive 和 rdbms 在形式上更加相識。
相信看完這些大家已經對它們之間區別有了一些理解,在這裡我還貼出一張**,你可以對照**加深印象。
比較項 rdbms hive ansi sql 支援 不完全支援 更新 updateinsertdelete updateinsertdelete(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 引擎都不支援。
資料倉儲 Hive 一
英文名稱為data warehouse,可簡寫為dw或dwh。資料倉儲的目的是構建面向分析的整合化資料環境,為企業提供決策支援 decision support 資料倉儲是存資料的,企業的各種資料往裡面存,主要目的是為了分析有效資料,後續會基於它產出供分析挖掘的資料,或者資料應用需要的資料,如企業的...
資料倉儲Hive簡單了解(一)
資料倉儲 dw或dwh 是乙個面向主題的 整合的 隨時間變化的,但資訊本身相對穩定的資料集合。資料倉儲三個特點 選擇題 資料庫和資料倉儲的主要區別 資料處理兩大型別 資料倉儲結構 資料儲存及管理 是整個資料倉儲的核心,決定了對外部資料的表現形式,針對系統現有的資料,進行抽取 清理並有效整合,再按照主...
Hive資料倉儲設計的四個層次設計
資料倉儲 資料倉儲全面接收源系統資料,etl程序對資料進行規範化 驗證 清洗,並最終裝載進入資料集市,通過資料集市支援系統進行資料查詢 分析,整個資料倉儲包含四大層次。etl extractiontransformation loading 負責將分散的 異構資料來源中的資料抽取到臨時中間層後進行清...