Hadoop Hive介紹
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。相對於用java程式碼編寫mapreduce來說,Hive的優勢明顯:快速開發,人員成本低,可擴充套件性(自由擴充套件叢集規模),延展性(支援自定義函式)。
Hive定義
Hive是建立在 Hadoop 上的資料倉庫基礎構架。它提供了一系列的工具,可以用來進行資料提取轉化載入(ETL),這是一種可以儲存、查詢和分析儲存在 Hadoop 中的大規模資料的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的使用者查詢資料。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的複雜的分析工作。
Hive 沒有專門的資料格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允許使用者指定資料格式。
應用場景
Hive 構建在基於靜態批處理的Hadoop 之上,Hadoop 通常都有較高的延遲並且在作業提交和排程的時候需要大量的開銷。因此,Hive 並不能夠在大規模資料集上實現低延遲快速的查詢,例如,Hive 在幾百MB 的資料集上執行查詢一般有分鐘級的時間延遲。因此,
Hive 並不適合那些需要低延遲的應用,例如,聯機事務處理(OLTP)。Hive 查詢操作過程嚴格遵守Hadoop MapReduce 的作業執行模型,Hive 將使用者的HiveQL 語句通過直譯器轉換為MapReduce 作業提交到Hadoop 叢集上,Hadoop 監控作業執行過程,然後返回作業執行結果給使用者。Hive 並非為聯機事務處理而設計,Hive 並不提供實時的查詢和基於行級的資料更新操作。Hive 的最佳使用場合是大資料集的批處理作業,例如,網路日誌分析。
設計特徵
Hive 是一種底層封裝了Hadoop 的資料倉庫處理工具,使用類SQL 的HiveQL 語言實現資料查詢,所有Hive 的資料都儲存在Hadoop 相容的檔案系統(例如,Amazon S3、HDFS)中。Hive 在載入資料過程中不會對資料進行任何的修改,只是將資料移動到HDFS 中Hive 設定的目錄下,因此,Hive 不支援對資料的改寫和新增,所有的資料都是在載入的時候確定的。Hive 的設計特點如下。
● 支援索引,加快資料查詢。
● 不同的儲存型別,例如,純文字檔案、HBase 中的檔案。
● 將元資料儲存在關係資料庫中,大大減少了在查詢過程中執行語義檢查的時間。
● 可以直接使用儲存在Hadoop 檔案系統中的資料。
● 內建大量使用者函式UDF 來操作時間、字串和其他的資料探勘工具,支援使用者擴充套件UDF 函式來完成內建函式無法實現的操作。
● 類SQL 的查詢方式,將SQL 查詢轉換為MapReduce 的job 在Hadoop叢集上執行。
Hive體系結構
使用者介面
使用者介面主要有三個:CLI,Client 和 WUI。其中最常用的是 CLI,CLI啟動的時候,會同時啟動一個 Hive 副本。Client 是 Hive 的客戶端,使用者連線至 Hive Server。在啟動 Client 模式的時候,需要指出 Hive Server 所在節點,並且在該節點啟動 Hive Server。 WUI 是通過瀏覽器訪問 Hive。
元資料儲存
Hive將元資料儲存在資料庫中,如 mysql、derby。Hive 中的元資料包括表的名字,表的列和分割槽及其屬性,表的屬性(是否為外部表等),表的資料所在目錄等。
直譯器、編譯器、優化器、執行器
直譯器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃儲存在 HDFS 中,並在隨後由 MapReduce 呼叫執行。
Hadoop
Hive 的資料儲存在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select * from tbl 不會生成 MapReduce 任務)。
資料儲存
首先,Hive 沒有專門的資料儲存格式,也沒有為資料建立索引,使用者可以非常自由的組織 Hive 中的表,只需要在建立表的時候告訴 Hive 資料中的列分隔符和行分隔符,Hive 就可以解析資料。其次,Hive 中所有的資料都儲存在 HDFS 中,Hive 中包含以下資料模型:表(Table),外部表(External Table),分割槽(Partition),桶(Bucket)。
Hive 中的 Table 和資料庫中的 Table 在概念上是類似的,每一個 Table 在 Hive 中都有一個相應的目錄儲存資料。例如,一個表 pvs,它在 HDFS 中的路徑為:/wh/pvs,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的資料倉庫的目錄,所有的 Table 資料(不包括 External Table)都儲存在這個目錄中。
Partition 對應於資料庫中的 Partition 列的密集索引,但是 Hive 中 Partition 的組織方式和資料庫中的很不相同。在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,所有的 Partition 的資料都儲存在對應的目錄中。例如:pvs 表中包含 ds 和 city 兩個 Partition,則對應於 ds = 20090801, ctry = US 的 HDFS 子目錄為:/wh/pvs/ds=20090801/ctry=US;對應於 ds = 20090801, ctry = CA 的 HDFS 子目錄為;/wh/pvs/ds=20090801/ctry=CA
Buckets 對指定列計算 hash,根據 hash 值切分資料,目的是為了並行,每一個 Bucket 對應一個檔案。將 user 列分散至 32 個 bucket,首先對 user 列的值計算 hash,對應 hash 值為 0 的 HDFS 目錄為:/wh/pvs/ds=20090801/ctry=US/part-00000;hash 值為 20 的 HDFS 目錄為:/wh/pvs/ds=20090801/ctry=US/part-00020
External Table 指向已經在 HDFS 中存在的資料,可以建立 Partition。它和 Table 在元資料的組織上是相同的,而實際資料的儲存則有較大的差異。
□Table 的建立過程和資料載入過程(這兩個過程可以在同一個語句中完成),在載入資料的過程中,實際資料會被移動到資料倉庫目錄中;之後對資料對訪問將會直接在資料倉庫目錄中完成。刪除表時,表中的資料和元資料將會被同時刪除。
□External Table 只有一個過程,載入資料和建立表同時完成(CREATE EXTERNAL TABLE ……LOCATION),實際資料是儲存在 LOCATION 後面指定的 HDFS 路徑中,並不會移動到資料倉庫目錄中。當刪除一個 External Table 時,僅刪除元資料,表中的資料不會真正被刪除。
基本語法
基本資料型別
Hive支援多種不同長度的整型和浮點型資料,支援布林型,也支援無長度限制的字串型別。例如:TINYINT、SMALINT、BOOLEAN、FLOAT、DOUBLE、STRING等基本資料型別。這些基本資料型別和其他sql方言一樣,都是保留字。
集合資料型別
Hive中的列支援使用struct、map和array集合資料型別。大多數關係型資料庫中不支援這些集合資料型別,因為它們會破壞標準格式。關係型資料庫中為實現集合資料型別是由多個表之間建立合適的外來鍵關聯來實現。在大資料系統中,使用集合型別的資料的好處在於提高資料的吞吐量,減少定址次數來提高查詢速度。
使用集合資料型別建立表例項:
CREATE TABLE STUDENTINFO
(
NAME STRING,
FAVORITE ARRAY<STRING>,
COURSE MAP<STRING,FLOAT>,
ADDRESS STRUCT<CITY:STRING,STREET:STRING>
)
查詢語法:
SELECT S.NAME,S.FAVORITE[0],S.COURSE["ENGLISH"],S.ADDRESS.CITY FROM STUDENTINFO S;
分割槽表
建立分割槽表:
create table employee (name string,age int,sex string) partitioned by (city string) row format delimited fields terminated by '\t';
分割槽表裝載資料:
load data local inpath '/usr/local/lee/employee' into table employee partition (city='hubei');
整理自以下網路分享,在此感謝願意分享知識的各位朋友!