Hive基本介紹
- 2019 年 11 月 7 日
- 筆記
4.1 基本介紹:
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
Hive是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化載入(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數據。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的複雜的分析工作。
4.2 和關係資料庫的區別
Hive和關係資料庫還是有很大的不同
- hive和關係資料庫存儲文件的系統不同,hive使用的是hadoop的HDFS(hadoop的分散式文件系統),關係資料庫則是伺服器本地的文件系統;
- hive使用的計算模型是mapreduce,而關係資料庫則是自己設計的計算模型;
- 關係資料庫都是為實時查詢的業務進行設計的,而Hive則是為海量數據做數據挖掘設計的,實時性很差;實時性的區別導致hive的應用場景和關係資料庫有很大的不同;
- Hive很容易擴展自己的存儲能力和計算能力,這個是繼承hadoop的,而關係資料庫在這個方面要比資料庫差很多。
4.3 組件
服務端組件:
Driver組件:該組件包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語句進行解析、編譯優化,生成執行計劃,然後調用底層的mapreduce計算框架。
Metastore組件:元數據服務組件,這個組件存儲hive的元數據,hive的元數據存儲在關係資料庫里,hive支援的關係資料庫有derby、mysql。元數據對於hive十分重要,因此hive支援把metastore服務獨立出來,安裝到遠程的伺服器集群里,從而解耦hive服務和metastore服務,保證hive運行的健壯性。
Thrift服務:thrift是facebook開發的一個軟體框架,它用來進行可擴展且跨語言的服務的開發,hive集成了該服務,能讓不同的程式語言調用hive的介面。
客戶端組件:
CLI:command line interface,命令行介面。
Thrift客戶端:上面的架構圖裡沒有寫上Thrift客戶端,但是hive架構的許多客戶端介面是建立在thrift客戶端之上,包括JDBC和ODBC介面。
WEBGUI:hive客戶端提供了一種通過網頁的方式訪問hive所提供的服務。這個介面對應hive的hwi組件(hive web interface),使用前要啟動hwi服務。
4.4 入門使用
首先創建一個普通的文本文件,裡面只有一行數據,該行也只存儲一個字元串
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’;
4.5 其他
l 關係資料庫里,表的載入模式是在數據載入時候強制確定的(表的載入模式是指資料庫存儲數據的文件格式),如果載入數據時候發現載入的數據不符合模式,關係資料庫則會拒絕載入數據,這個就叫“寫時模式”,寫時模式會在數據載入時候對數據模式進行檢查校驗的操作。Hive在載入數據時候和關係資料庫不同,hive在載入數據時候不會對數據進行檢查,也不會更改被載入的數據文件,而檢查數據格式的操作是在查詢操作時候執行,這種模式叫“讀時模式”。在實際應用中,寫時模式在載入數據時候會對列進行索引,對數據進行壓縮,因此載入數據的速度很慢,但是當數據載入好了,我們去查詢數據的時候,速度很快。但是當我們的數據是非結構化,存儲模式也是未知時候,關係數據操作這種場景就麻煩多了,這時候hive就會發揮它的優勢。
l 關係資料庫一個重要的特點是可以對某一行或某些行的數據進行更新、刪除操作,hive不支援對某個具體行的操作,hive對數據的操作只支援覆蓋原數據和追加數據。Hive也不支援事務和索引。更新、事務和索引都是關係資料庫的特徵,這些hive都不支援,也不打算支援,原因是hive的設計是海量數據進行處理,全數據的掃描時常態,針對某些具體數據進行操作的效率是很差的,對於更新操作,hive是通過查詢將原表的數據進行轉化最後存儲在新表裡,這和傳統資料庫的更新操作有很大不同。
l Hive也可以在hadoop做實時查詢上做一份自己的貢獻,那就是和hbase集成,hbase可以進行快速查詢,但是hbase不支援類SQL的語句,那麼此時hive可以給hbase提供sql語法解析的外殼,可以用類sql語句操作hbase資料庫。