1. Hive是什么
1) Hive是什么?
這里引用 Hive wiki 上的介紹:
Hive is a data warehouse infrastructure built on top of Hadoop. It provides tools to enable easy data ETL, a mechanism to put structures on the data, and the capability to querying and analysis of large data sets stored in Hadoop files. Hive defines a simple SQL-like query language, called QL, that enables users familiar with SQL to query the data. At the same time, this language also allows programmers who are familiar with the MapReduce fromwork to be able to plug in their custom mappers and reducers to perform more sophisticated analysis that may not be supported by the built-in capabilities of the language.
Hive 是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 QL,它允許熟悉 SQL 的用戶查詢數據。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的復雜的分析工作。
Hive does not mandate read or written data be in the “Hive format”—there is no such thing. Hive works equally well on Thrift, control delimited, or your specialized data formats. Please see File Format and SerDe in Developer Guide for details.
Hive 沒有專門的數據格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允許用戶指定數據格式。
2) Hive不是什么?
Hive基于hadoop,hadoop是批處理系統,不能保證低延遲,因此,hive的查詢也不能保證低延遲。
Hive的工作模式是提交一個任務,等到任務結束時被通知,而不是實時查詢。相對應的是,類似于oracle這樣的系統當運行于小數據集的時候,響應非??欤僧斕幚淼臄祿浅4蟮臅r候,可能需要數小時。需要說明的是,hive即使在很小的數據集上運行,也可能需要數分鐘才能完成。
總之,低延遲不是hive追求的首要目標。hive的設計目標是:可伸縮、可擴展、容錯及輸入格式松耦合。
Hive 資源
Hive 本身提供了較豐富的文檔,以下鏈接提供了 Hive 的一些基礎文檔:
-
FaceBook 鏡像(被墻):[[http://mirror.facebook.com/facebook/hive]]
-
Wiki 頁面:[[http://wiki.apache.org/hadoop/Hive]]
-
入門指南:[[http://wiki.apache.org/hadoop/Hive/GettingStarted]]
-
查詢語言指南:[[http://wiki.apache.org/hadoop/Hive/HiveQL]]
-
演示文稿:[[http://wiki.apache.org/hadoop/Hive/Presentations]]
-
藍圖:[[http://wiki.apache.org/hadoop/Hive/Roadmap]]
大多數有關 Hive 的使用和特性的問題可以從以上的鏈接中尋找到答案。當然,由于 Hive 本身在不斷的發展中,文檔的更新速度很多時候都趕不上 Hive 本身的更新速度,若希望了解 Hive 的最新動態或者遇到 Bug,可以加入 Hive 的郵件列表:
* User: hive-user@hadoop.apache.org
* Developer: hive-dev@hadoop.apache.org
1. 為什么使用Hive
面臨的問題 人員學習成本太高 項目周期要求太短 我只是需要一個簡單的環境 MapReduce 如何搞定 復雜查詢好難 Join如何實現為什么要使用Hive?操作接口采用類SQL語法,提供快速開發的能力?避免了去寫MapReduce,減少開發人員的學習成本?擴展功能很方便 Hive的特點?可擴展Hive可以自由的擴展集群的規模,一般情況下不需要重啟服務?延展性Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數?容錯良好的容錯性,節點出現問題SQL仍可完成執行
2. Hive體系結構
Hive 的結構如圖所示,
主要分為以下幾個部分:
-
用戶接口,包括 命令行CLI,Client,Web界面WUI,JDBC/ODBC接口等
-
中間件:包括thrift接口和JDBC/ODBC的服務端,用于整合Hive和其他程序。
-
元數據metadata存儲,通常是存儲在關系數據庫如 mysql, derby 中的系統參數
-
底層驅動:包括HiveQL解釋器、編譯器、優化器、執行器(引擎)。
-
Hadoop:用 HDFS 進行存儲,利用 MapReduce 進行計算。
-
用戶接口主要有三個:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 啟動的時候,會同時啟動一個 Hive 副本。Client 是 Hive 的客戶端,用戶連接至 Hive Server。在啟動 Client 模式的時候,需要指出 Hive Server 所在節點,并且在該節點啟動 Hive Server。 WUI 是通過瀏覽器訪問 Hive。
-
Hive 將元數據存儲在數據庫中,如 mysql、derby。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
-
解釋器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,并在隨后有 MapReduce 調用執行。
-
Hive 的數據存儲在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select * from tbl 不會生成 MapRedcue 任務)。
Hive與Hadoop之前的關系:
3. Hive元數據存儲
MetaStore類似于Hive的目錄。它存放了有個表、區、列、類型、規則模型的所有信息。并且它可以通過thrift接口進行修改和查詢。它為編譯器提供高效的服務,所以,它會存放在一個傳統的RDBMS,利用關系模型進行管理。這個信息非常重要,所以需要備份,并且支持查詢的可擴展性。
Hive 將元數據存儲在 RDBMS 中,有三種模式可以連接到數據庫:
-
Single User Mode: 此模式連接到一個 In-memory 的數據庫 Derby,一般用于 Unit Test。
-
Multi User Mode:通過網絡連接到一個數據庫中,是最經常使用到的模式。
-
Remote Server Mode:用于非 Java 客戶端訪問元數據庫,在服務器端啟動一個 MetaStoreServer,客戶端利用 Thrift 協議通過 MetaStoreServer 訪問元數據庫。
附上元數據庫數據字典(如果使用mysql,show tables可以看到):
BUCKETING_COLS :
COLUMNS:Hive表字段信息(字段注釋,字段名,字段類型,字段序號)
DBS:元數據庫信息,存放HDFS路徑信息
PARTITION_KEYS :Hive分區表分區鍵
SDS:所有hive表、表分區所對應的hdfs數據目錄和數據格式。
SD_PARAMS :序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等
SEQUENCE_TABLE:SEQUENCE_TABLE表保存了hive對象的下一個可用ID,如’org.apache.hadoop.hive.metastore.model.MTable’, 21,則下一個新創建的hive表其TBL_ID就是21,同時SEQUENCE_TABLE表中271786被更新為26(這里每次都是+5?)。同樣,COLUMN,PARTITION等都有相應的記錄
SERDES :
SERDE_PARAMS:
SORT_COLS :
TABLE_PARAMS:表級屬性,如是否外部表,表注釋等
TBLS : 所有hive表的基本信息
上面表的內容來看,hive整個創建表的過程已經比較清楚了
-
解析用戶提交hive語句,對其進行解析,分解為表、字段、分區等hive對象
-
根據解析到的信息構建對應的表、字段、分區等對象,從SEQUENCE_TABLE中獲取構建對象的最新ID,與構建對象信息(名稱,類型等)一同通過DAO方法寫入到元數據表中去,成功后將SEQUENCE_TABLE中對應的最新ID+5。
4. Hive的數據存儲
首先,Hive 沒有專門的數據存儲格式,也沒有為數據建立索引,用戶可以非常自由的組織 Hive 中的表,只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。
其次,Hive 中所有的數據都存儲在 HDFS 中,Hive 中包含以下數據模型:Table,External Table,Partition,Bucket。
1)表table:一個表就是hdfs中的一個目錄
2)區Partition:表內的一個區就是表的目錄下的一個子目錄
3)桶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。表是否分區,如何添加分區,都可以通過Hive–QL語言完成。通過分區,即目錄的存放形式,Hive可以比較容易地完成對分區條件的查詢。
-
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 。桶是Hive的最終的存儲形式。在創建表時,用戶可以對桶和列進行詳細地描述。
-
External Table 指向已經在 HDFS 中存在的數據,可以創建 Partition。它和 Table 在元數據的組織上是相同的,而實際數據的存儲則有較大的差異。
-
Table 的創建過程和數據加載過程(這兩個過程可以在同一個語句中完成),在加載數據的過程中,實際數據會被移動到數據倉庫目錄中;之后對數據對訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。
-
External Table 只有一個過程,加載數據和創建表同時完成(CREATE EXTERNAL TABLE ……LOCATION),實際數據是存儲在 LOCATION 后面指定的 HDFS 路徑中,并不會移動到數據倉庫目錄中。當刪除一個 External Table 時,僅刪除
5. Hive和普通關系型數據庫的差異
由于 Hive 采用了 SQL 的查詢語言 HQL,因此很容易將 Hive 理解為數據庫。其實從結構上來看,Hive 和數據庫除了擁有類似的查詢語言,再無類似之處。本文將從多個方面來闡述 Hive 和數據庫的差異。數據庫可以用在 Online 的應用中,但是Hive 是為數據倉庫而設計的,清楚這一點,有助于從應用角度理解 Hive 的特性。
和普通關系數據庫的異同:
Hive | RDBMS | |
查詢語言 | HQL | SQL |
數據存儲 | HDFS | Raw Device or Local FS |
索引 | 無 | 有 |
執行 | MapReduce | Excutor |
執行延遲 | 高 | 低 |
處理數據規模 | 大 | 小 |
1. 查詢語言。由于 SQL 被廣泛的應用在數據倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者可以很方便的使用 Hive 進行開發。
2. 數據存儲位置。Hive 是建立在Hadoop 之上的,所有 Hive 的數據都是存儲在HDFS 中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。
3. 數據格式。Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加載數據的過程中,不需要從用戶數據格式到 Hive 定義的數據格式的轉換,因此,Hive 在加載的過程中不會對數據本身進行任何修改,而只是將數據內容復制或者移動到相應的 HDFS
目錄中。而在數據庫中,不同的數據庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,因此,數據庫加載數據的過程會比較耗時。
4. 數據更新。由于 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive 中不支持對數據的改寫和添加,所有的數據都是在加載的時候中確定好的。而數據庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO … VALUES 添加數據,使用 UPDATE… SET 修改數據。
5. 索引。之前已經說過,Hive 在加載數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,因此也沒有對數據中的某些 Key 建立索引。Hive 要訪問數據中滿足條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由于 MapReduce 的引入, Hive 可以并行訪問數據,因此即使沒有索引,對于大數據量的訪問,Hive 仍然可以體現出優勢。數據庫中,通常會針對一個或者幾個列建立索引,因此對于少量的特定條件的數據的訪問,數據庫可以有很高的效率,較低的延遲。由于數據的訪問延遲較高,決定了
Hive 不適合在線數據查詢。
6. 執行。Hive 中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的(類似 select * from tbl 的查詢不需要 MapReduce)。而數據庫通常有自己的執行引擎。
7. 執行延遲。之前提到,Hive 在查詢數據的時候,由于沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce 框架。由于 MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執行 Hive 查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時候,Hive 的并行計算顯然能體現出優勢。
8. 可擴展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的規模在4000 臺節點左右)。而數據庫由于 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的并行數據庫 Oracle 在理論上的擴展能力也只有 100 臺左右。
9. 數據規模。由于 Hive 建立在集群上并可以利用 MapReduce 進行并行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。
5. Hive的基本概念
參考:https://cwiki.apache.org/confluence/display/Hive/Tutorial
1)數據單元
按照數據的粒度大小,hive數據可以被組織成:
1)databases: 避免不同表產生命名沖突的一種命名空間
2)tables:具有相同scema的同質數據的集合
3)partitions:一個表可以有一個或多個決定數據如何存儲的partition key
4)buckets(或clusters):在同一個partition中的數據可以根據某個列的hash值分為多個bucket。partition和bucket并非必要,但是它們能大大加快數據的查詢速度。
2)、數據類型
(1)簡單類型:
TINYINT – 1 byte integer
SMALLINT – 2 byte integer
INT – 4 byte integer
BIGINT – 8 byte
BOOLEAN – TRUE/ FALSE
FLOAT – 單精度
DOUBLE – 雙精度
STRING – 字符串集合
(2)復雜類型:
Structs: structs內部的數據可以通過DOT(.)來存取,例如,表中一列c的類型為STRUCT{a INT; b INT},我們可以通過c.a來訪問域a。
Maps(Key-Value對):訪問指定域可以通過['element name']進行,例如,一個Map M包含了一個group->gid的k-v對,gid的值可以通過M['group']來獲取。
Arrays:array中的數據為相同類型,例如,假如array A中元素['a','b','c'],則A[1]的值為'b'。
3)、內建運算符和函數
包括關系運算符(A=B, A!=B, A<B等等)、
算術運算符(A+B, A*B, A&B, A|B等等)、
邏輯運算符(A&&B, A|B等等)、
復雜類型上的運算符(A[n], M[key], S.x)、
各種內建函數:round,floor,substr
4)、語言能力
hive查詢語言提供基本的類sql操作,這些操作基于table和partition,包括:
1. 使用where語句過濾制定行
2. 使用select查找指定列
3. join兩張table
4. group by
5. 一個表的查詢結果存入另一張表
6. 將一個表的內容存入本地目錄
7. 將查詢結果存儲到hdfs上
8. 管理table和partition(creat、drop、alert)
9. 在查詢中嵌入map-reduce程序
Hive query language provides the basic SQL like operations. These operations work on tables or partitions. These operations are:
-
Ability to filter rows from a table using a where clause.
-
Ability to select certain columns from the table using a select clause.
-
Ability to do equi-joins between two tables.
-
Ability to evaluate aggregations on multiple "group by" columns for the data stored in a table.
-
Ability to store the results of a query into another table.
-
Ability to download the contents of a table to a local (e.g., nfs) directory.
-
Ability to store the results of a query in a hadoop dfs directory.
-
Ability to manage tables and partitions (create, drop and alter).
-
Ability to plug in custom scripts in the language of choice for custom map/reduce jobs.
6. Hive實際應用
1、Apache Weblog Data
The format of Apache weblog is customizable, while most webmasters use the default.
For default Apache weblog, we can create a table with the following command.
More about !RegexSerDe can be found here in HIVE-662 and HIVE-1719.
CREATE TABLE apachelog ( host STRING, identity STRING, user STRING, time STRING, request STRING, status STRING, size STRING, referer STRING, agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?" ) STORED AS TEXTFILE;
轉自:http://blog.csdn.net/hguisu/article/details/18986759
原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2612