大資料時代的技術hive:hive介紹
我最近研究了hive的相關技術,有點心得,這裡和大家分享下。
首先我們要知道hive到底是做什麼的。下面這幾段文字很好的描述了hive的特性:
1.hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。
2.Hive是建立在 Hadoop 上的資料倉庫基礎構架。它提供了一系列的工具,可以用來進行資料提取轉化載入(ETL),這是一種可以儲存、查詢和分析儲存在 Hadoop 中的大規模資料的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的使用者查詢資料。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的複雜的分析工作。
要理解hive,必須先理解hadoop和mapreduce,如果有不熟悉的童鞋,可以百度一下。
使用hive的命令列介面,感覺很像操作關係資料庫,但是hive和關係資料庫還是有很大的不同,下面我就比較下hive與關係資料庫的區別,具體如下:
- hive和關係資料庫儲存檔案的系統不同,hive使用的是hadoop的HDFS(hadoop的分散式檔案系統),關係資料庫則是伺服器本地的檔案系統;
- hive使用的計算模型是mapreduce,而關係資料庫則是自己設計的計算模型;
- 關係資料庫都是為實時查詢的業務進行設計的,而hive則是為海量資料做資料探勘設計的,實時性很差;實時性的區別導致hive的應用場景和關係資料庫有很大的不同;
- Hive很容易擴充套件自己的儲存能力和計算能力,這個是繼承hadoop的,而關係資料庫在這個方面要比資料庫差很多。
以上都是從巨集觀的角度比較hive和關係資料庫的區別,hive和關係資料庫的異同還有很多,我在文章的後面會一一描述。
下面我來講講hive的技術架構,大家先看下面的架構圖:
由上圖可知,hadoop和mapreduce是hive架構的根基。Hive架構包括如下元件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、metastore和Driver(Complier、Optimizer和Executor),這些元件我可以分為兩大類:服務端元件和客戶端元件。
首先講講服務端元件:
Driver元件:該元件包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語句進行解析、編譯優化,生成執行計劃,然後呼叫底層的mapreduce計算框架。
Metastore元件:元資料服務元件,這個元件儲存hive的元資料,hive的元資料儲存在關係資料庫裡,hive支援的關係資料庫有derby、mysql。元資料對於hive十分重要,因此hive支援把metastore服務獨立出來,安裝到遠端的伺服器叢集裡,從而解耦hive服務和metastore服務,保證hive執行的健壯性,這個方面的知識,我會在後面的metastore小節裡做詳細的講解。
Thrift服務:thrift是facebook開發的一個軟體框架,它用來進行可擴充套件且跨語言的服務的開發,hive集成了該服務,能讓不同的程式語言呼叫hive的介面。
客戶端元件:
CLI:command line interface,命令列介面。
Thrift客戶端:上面的架構圖裡沒有寫上Thrift客戶端,但是hive架構的許多客戶端介面是建立在thrift客戶端之上,包括JDBC和ODBC介面。
WEBGUI:hive客戶端提供了一種通過網頁的方式訪問hive所提供的服務。這個介面對應hive的hwi元件(hive web interface),使用前要啟動hwi服務。
下面我著重講講metastore元件,具體如下:
Hive的metastore元件是hive元資料集中存放地。Metastore元件包括兩個部分:metastore服務和後臺資料的儲存。後臺資料儲存的介質就是關係資料庫,例如hive預設的嵌入式磁碟資料庫derby,還有mysql資料庫。Metastore服務是建立在後臺數據儲存介質之上,並且可以和hive服務進行互動的服務元件,預設情況下,metastore服務和hive服務是安裝在一起的,執行在同一個程序當中。我也可以把metastore服務從hive服務裡剝離出來,metastore獨立安裝在一個叢集裡,hive遠端呼叫metastore服務,這樣我們可以把元資料這一層放到防火牆之後,客戶端訪問hive服務,就可以連線到元資料這一層,從而提供了更好的管理性和安全保障。使用遠端的metastore服務,可以讓metastore服務和hive服務執行在不同的程序裡,這樣也保證了hive的穩定性,提升了hive服務的效率。
Hive的執行流程如下圖所示:
圖描述的很清晰了,我這裡就不在累述了。
下面我給大家展示一個簡單的例子,看看hive是怎麼操作的。
首先我們建立一個普通的文字檔案,裡面只有一行資料,該行也只儲存一個字串,命令如下:
echo ‘sharpxiajun’ > /home/hadoop/test.txt
|
然後我們建一張hive的表:
hive –e “create table test (value
string );
|
接下來載入資料:
Load data local inpath ‘home/hadoop/test.txt’ overwrite
into table test
|
最後我們查詢下表:
hive –e ‘ select
* from
test’;
|
大家看到了吧,hive十分簡單,很好入門,操作和sql很像,下面我就要深入分析下hive與關係資料庫的區別,這部分可能有些人看的不是很明白,但是很有必要提前提出,以後我的文章裡將進一步講述hive,那時不太明白的童鞋在看看這部分,很多問題就會清晰很多,具體如下:
- 關係資料庫裡,表的載入模式是在資料載入時候強制確定的(表的載入模式是指資料庫儲存資料的檔案格式),如果載入資料時候發現載入的資料不符合模式,關係資料庫則會拒絕載入資料,這個就叫“寫時模式”,寫時模式會在資料載入時候對資料模式進行檢查校驗的操作。Hive在載入資料時候和關係資料庫不同,hive在載入資料時候不會對資料進行檢查,也不會更改被載入的資料檔案,而檢查資料格式的操作是在查詢操作時候執行,這種模式叫“讀時模式”。在實際應用中,寫時模式在載入資料時候會對列進行索引,對資料進行壓縮,因此載入資料的速度很慢,但是當資料載入好了,我們去查詢資料的時候,速度很快。但是當我們的資料是非結構化,儲存模式也是未知時候,關係資料操作這種場景就麻煩多了,這時候hive就會發揮它的優勢。
- 關係資料庫一個重要的特點是可以對某一行或某些行的資料進行更新、刪除操作,hive不支援對某個具體行的操作,hive對資料的操作只支援覆蓋原資料和追加資料。Hive也不支援事務和索引。更新、事務和索引都是關係資料庫的特徵,這些hive都不支援,也不打算支援,原因是hive的設計是海量資料進行處理,全資料的掃描時常態,針對某些具體資料進行操作的效率是很差的,對於更新操作,hive是通過查詢將原表的資料進行轉化最後儲存在新表裡,這和傳統資料庫的更新操作有很大不同。
- Hive也可以在hadoop做實時查詢上做一份自己的貢獻,那就是和hbase整合,hbase可以進行快速查詢,但是hbase不支援類SQL的語句,那麼此時hive可以給hbase提供sql語法解析的外殼,可以用類sql語句操作hbase資料庫。
今天的hive就寫到這裡,關於hive我打算一共寫三篇文章,這是第一篇,下一篇主要講hive支援的資料模型,例如:資料庫(database)、表(table)、分割槽(partition)和桶(bucket),還有hive檔案儲存的格式,還有hive支援的資料型別。第三篇文章就會講到hiveQL的使用、以及結合mapreduce查詢優化的技術和自定義函式,以及我們現在在公司專案裡運用hive的例項。
馬雲在退休的時候說網際網路現在進入了大資料時代,大資料是現在網際網路的趨勢,而hadoop就是大資料時代裡的核心技術,但是hadoop和mapreduce操作專業型太強,所以facebook在這些的基礎上開發了hive框架,畢竟世界上會sql的人比會java的人多的多,hive是可以說是學習hadoop相關技術的一個突破口,哪些自立於投身hadoop技術開發的童鞋們,可以先從hive開始哦。