一汹押、什么是 Apache Hive夕凝?
Apache Hive 是一個基于 Hadoop Haused 構(gòu)建的開源數(shù)據(jù)倉庫系統(tǒng)亡脑,我們使用它來查詢和分析存儲在 Hadoop 文件中的大型數(shù)據(jù)集。此外往扔,通過使用 Hive旋膳,我們可以在 Hadoop 中處理結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)澎语。
換句話說,Hive 是一個數(shù)據(jù)倉庫基礎(chǔ)設(shè)施验懊,便于查詢和管理駐留在分布式存儲系統(tǒng)中的大型數(shù)據(jù)集擅羞。它提供了一種類 SQL 的查詢語言 HiveQL(Hive Query Language)查詢數(shù)據(jù)的方法。 此外义图,編譯器在內(nèi)部將 HiveQL 語句轉(zhuǎn)換為 MapReduce减俏、Tez、Spark 等作業(yè)碱工。進(jìn)一步提交給 Hadoop 框架執(zhí)行娃承。
二奏夫、我們?yōu)槭裁匆褂?Hive 技術(shù)?
隨著 Hadoop MapReduce 的出現(xiàn)历筝,極大的簡化大數(shù)據(jù)編程的難度酗昼,使得普通程序員也能從事開發(fā)大數(shù)據(jù)編程。但在生產(chǎn)活動中經(jīng)常要對大數(shù)據(jù)計算分析是從事商務(wù)智能行業(yè)(BI)的工程師梳猪,他們通常使用 SQL 語言進(jìn)行大數(shù)據(jù)統(tǒng)計以及分析麻削,而 Mapreduce 編程是有一定的門檻,如果每次都采用 MapReduce 開發(fā)計算分析春弥,這樣成本就太高效率太低呛哟,那么有沒有更簡單的辦法,可以直接通過 SQL 在大數(shù)據(jù)平臺下運(yùn)行進(jìn)行統(tǒng)計分析匿沛?有的扫责,答案即是 Hive。
Hive 主要用于數(shù)據(jù)查詢逃呼,統(tǒng)計和分析鳖孤,提高開發(fā)人員的工作效率。Hive 通過內(nèi)置函數(shù)將 SQL 語句生成 DAG(有向無環(huán)圖)蜘渣,再讓 Mapreduce 計算處理淌铐。從而得到我們想要的統(tǒng)計結(jié)果肺然。而且在處理具有挑戰(zhàn)性的復(fù)雜分析處理和數(shù)據(jù)格式時蔫缸,極大的簡化了開發(fā)難度。
三际起、Hive 架構(gòu)
Hive 能夠直接處理我們輸入的 HiveQL 語句拾碌,調(diào)用 MapReduce 計算框架完成數(shù)據(jù)分析操作。下面是它的架構(gòu)圖街望,我們結(jié)合架構(gòu)圖來看看 Hive 到 MapReduce 整個流程校翔。
由上圖可知,HDFS 和 Mapreduce 是 Hive 架構(gòu)的根基灾前。Hive 架構(gòu)主要分為以下幾個組件:Client防症、Metastore、Thrift Server哎甲、Driver蔫敲,下面是各個組件介紹:
Client:用戶接口組件主要包含 CLI(命令行接口)、JDBC 或 ODBC炭玫、WEB GUI(以瀏覽器訪問 Hive)奈嘿;
Metastore組件:元數(shù)據(jù)服務(wù)組件, 記錄表名吞加、字段名裙犹、字段類型尽狠、關(guān)聯(lián) HDFS 文件路徑等這些數(shù)據(jù)庫的元數(shù)據(jù)信息;
Driver(執(zhí)行引擎):包括 Complier 叶圃、Optimizer 和 Executor袄膏,它們的作用是將 HiveQL 語句進(jìn)行語法分析、語法解析掺冠、語法優(yōu)化哩陕,生成執(zhí)行計劃,然后提交給 Hadoop MapReduce 計算框架處理赫舒;
Thrift Server:Thrift 是 FaceBook 開發(fā)的一個軟件框架悍及,它用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā), 通過該服務(wù)使不同編程語言調(diào)用 Hive 的接口接癌。
我們通過 CLI 向 Hive 提交 SQL 命令心赶,如果 SQL 是創(chuàng)建數(shù)據(jù)表的 DDL,Hive 會通過 執(zhí)行引擎 Driver 將數(shù)據(jù)表元數(shù)據(jù)信息存儲 Metastore 中缺猛,而如果 SQL 是查詢分析數(shù)據(jù)的 DQL缨叫,通過 Complier 、Optimizer 和 Executor 進(jìn)行語法分析荔燎、語法解析耻姥、語法優(yōu)化操作,生成執(zhí)行計劃生成一個 MapReduce 的作業(yè)有咨,提交給 Hadoop MapReduce 計算框架處理琐簇。
到此 Hive 的整個流程就結(jié)束了,相信你對 Hive 的整個流程已經(jīng)有基本了解座享。接下來我們探討一條 SQL 在 MapReduce 是如何統(tǒng)計分析婉商。
四、SQL如何在Mapreduce執(zhí)行
左邊是數(shù)據(jù)表渣叛,右邊是結(jié)果表丈秩,這條 SQL 語句對 age 分組求和,得到右邊的結(jié)果表淳衙,到底一條簡單的 SQL 在 MapReduce 是如何被計算蘑秽, MapReduce 編程模型只包含 map 和 reduce 兩個過程,map 是對數(shù)據(jù)的劃分箫攀,reduce 負(fù)責(zé)對 map 的結(jié)果進(jìn)行匯總肠牲。
select id,age,count(1) from student_info group by age
首先看 map 函數(shù)的輸入的 key 和 value,輸入主要看 value匠童,value 就是 user_info 表的每一行數(shù)據(jù)埂材,輸入的 value 作為map函數(shù)輸出的 key,輸出的 value 固定為 1汤求,比如<<1,17>,1>俏险。 map 函數(shù)的輸出經(jīng)過 shuffle 處理严拒,shuffle 把相同的 key 以及對應(yīng)的 value 組合成新<key,value集合>,從 user_info 表看出map輸出 2 次<<1,17>,1>竖独,那么經(jīng)過 shuffle 處理后則會輸出<<1,17>,<1,1>>裤唠,并將輸出作為 reduce 函數(shù)的輸入。
在 reduce 函數(shù)會把所有 value 進(jìn)行相加后輸出結(jié)果莹痢,<<1,17>,<1,1>>輸出為<<1,17>,2>种蘸。 這就是一條簡單 SQL 在 Mapreduce 執(zhí)行過程,可能你會有點(diǎn)迷糊竞膳,在這里我畫了一張流程圖航瞭,結(jié)合流程圖你會更加清楚。
五坦辟、Hive 和 RDBMS 之間的區(qū)別
說到 Hive 跟 RDBMS(傳統(tǒng)關(guān)系型數(shù)據(jù)庫)相比有哪些區(qū)別刊侯,很多人可能還是說不清楚,在這里我總結(jié)一下關(guān)于 Hive 和 RDBMS 之間的區(qū)別锉走。
1滨彻、Hive 支持部分 SQL 語法,跟標(biāo)準(zhǔn) SQL 有一定區(qū)別挪蹭。
2亭饵、傳統(tǒng)的數(shù)據(jù)庫在寫入數(shù)據(jù)會嚴(yán)格檢驗數(shù)據(jù)格式,對于這種我們成為讀時模式梁厉,而 Hive 是在查詢數(shù)據(jù)時驗證數(shù)據(jù)辜羊,這種驗證我們稱為寫時模式,而且由于每次都是掃描整個表導(dǎo)致高延時懂算;
3只冻、Hive 是在 Hadoop 上運(yùn)行的庇麦,通常而言 Hive 時一次寫入多次讀取计技,而 RDBMS 則是多次讀寫;
4山橄、Hive 視圖是邏輯存在垮媒,而且只讀,不接受 LOAD/INSERT/ALTER航棱,而 RDBMS 視圖根據(jù)表變化而變化睡雇;
5、Hive 支持多表插入而 RDBMS 是不支持饮醇,而且 Hive 對子查詢有嚴(yán)格要求它抱,有許多子查詢是不支持;
6朴艰、早期 Hive 只支持 INSERT OVERWRITE\INTO TABLE 插入數(shù)據(jù)观蓄,從 0.14.0 開始支持 INSERT INTO ... VALUE 語句按行添加數(shù)據(jù)混移,另外 UPDATE 和 DELETE 也允許被執(zhí)行;
7侮穿、在 Hive 0.7.0 之后 Hive 是支持索引的歌径,只是它跟 RDBMS 不一樣,比如它不支持主鍵和外鍵亲茅,而是支持在某些列上建立索引回铛,以提高 Hive 表指定列的查詢速度(但是效果差強(qiáng)人意);
其實(shí)對于更新克锣、事物和索引茵肃,一開始 Hive 是不支持的,因為這樣非常影響性能袭祟,不符合當(dāng)初數(shù)據(jù)倉庫的設(shè)計免姿,不過后來不斷的發(fā)展,也不得不妥協(xié)榕酒,這也導(dǎo)致 Hive 和 RDBMS 在形式上更加相識胚膊。
相信看完這些大家已經(jīng)對它們之間區(qū)別有了一些理解,在這里我還貼出一張表格想鹰,你可以對照表格加深印象紊婉。
比較項 | RDBMS | Hive |
---|---|---|
ANSI SQL | 支持 | 不完全支持 |
更新 | UPDATE\INSERT\DELETE | UPDATE\INSERT\DELETE(0.14.0之后) |
模式 | 讀時模式 | 寫時模式 |
數(shù)據(jù)保存 | 磁盤 | HDFS |
延時 | 低 | 高 |
多表插入 | 不支持 | 支持 |
子查詢 | 完全支持 | 支持 From 子句 |
視圖 | Updatable | Read-only |
索引 | 支持 | 支持表列(0.7.0之后) |
可擴(kuò)展性 | 低 | 高 |
數(shù)據(jù)規(guī)模 | 小 | 大 |
讀寫 | 一次寫入多次讀取 | 多次讀寫 |
分析 | OLTP | OLAP |
執(zhí)行 | Excutor | MapReduced、Spark等 |
小結(jié)
在實(shí)際生產(chǎn)過程中辑舷,其實(shí)我們不會經(jīng)常編寫 MapReduce 程序喻犁,起初在網(wǎng)站的大數(shù)據(jù)分析基本是通過 SQL 進(jìn)的,也因此 Hive 在大數(shù)據(jù)中扮演著非常重要作用何缓。隨著 Hive 的普及肢础,我們希望更多的大數(shù)據(jù)應(yīng)用場景中使用 SQL 語句進(jìn)行分析,于是現(xiàn)在越來越多的大數(shù)據(jù) SQL 引擎被開發(fā)出來碌廓。在我看來無論是 Cloudera 的 Impala传轰,還是后來的 Spark ,對大數(shù)據(jù)中使用 SQL需求越來迫切谷婆, 對大數(shù)據(jù) SQL 應(yīng)用場景更多樣化慨蛙,我們只需要通過 SQL 語句就可以輕易得到我們想要的結(jié)果。最后說一點(diǎn)纪挎,在這些 SQL 引擎基本都是支持類 SQL 語言期贫,但并不像數(shù)據(jù)庫那樣支持那樣標(biāo)準(zhǔn) SQL,特別是 Hive 等數(shù)據(jù)倉庫幾乎必然會用到嵌套查詢 SQL异袄,也就是在 where 條件嵌套 select 子查詢通砍,但是幾乎所有的大數(shù)據(jù) SQL 引擎都不支持。