Hive基礎

目錄(?)[+]web


 

1.  Hive是什麼sql

 

1) Hive是什麼?數據庫

這裏引用 Hive wiki 上的介紹:apache

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不是什麼?
oracle

        Hive基於hadoop,hadoop是批處理系統,不能保證低延遲,所以,hive的查詢也不能保證低延遲。
        Hive的工做模式是提交一個任務,等到任務結束時被通知,而不是實時查詢。相對應的是,相似於oracle這樣的系統當運行於小數據集的時候,響應很是快,可當處理的數據集很是大的時候,可能須要數小時。須要說明的是,hive即便在很小的數據集上運行,也可能須要數分鐘才能完成。
    總之,低延遲不是hive追求的首要目標。hive的設計目標是:可伸縮、可擴展、容錯及輸入格式鬆耦合。
app


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的服務端,用於整合和其餘程序。
  • 元數據metadata存儲,一般是存儲在關係數據庫如 mysql, derby 中的系統參數
  • 底層驅動包括HiveQL解釋器、編譯器、優化器、執行器(引擎)。
  • Hadoop:用 HDFS 進行存儲,利用 MapReduce 進行計算。
  1. 用戶接口主要有三個:CLI,Client 和 WUI。其中最經常使用的是 CLI,Cli 啓動的時候,會同時啓動一個 Hive 副本。Client 是 Hive 的客戶端,用戶鏈接至 Hive Server。在啓動 Client 模式的時候,須要指出 Hive Server 所在節點,而且在該節點啓動 Hive Server。 WUI 是經過瀏覽器訪問 Hive。
  2. Hive 將元數據存儲在數據庫中,如 mysql、derby。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。
  3. 解釋器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,並在隨後有 MapReduce 調用執行。
  4. Hive 的數據存儲在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,好比 select * from tbl 不會生成 MapRedcue 任務)。
Hive與Hadoop以前的關係:




3.  Hive元數據存儲

       MetaStore相似於的目錄。它存放了有個表、區、列、類型、規則模型的全部信息。而且它能夠經過thrift接口進修改和查詢。它爲編譯器提供高效的服務,因此,它會存放在一個傳統的RDBMS,利用關係模型進管理。這個信息很是重要,因此須要備份,而且支持查詢的可擴展性。

     Hive 將元數據存儲在 RDBMS 中,有三種模式能夠鏈接到數據庫:

  • Single User Mode: 此模式鏈接到一個 In-memory 的數據庫 Derby,通常用於 Unit Test。

  • Multi User Mode:經過網絡鏈接到一個數據庫中,是最常用到的模式。
       

  • Remote Server Mode:用於非 Java 客戶端訪問元數據庫,在服務器端啓動一個 MetaStoreServer,客戶端利用 Thrift 協議經過 MetaStoreServer 訪問元數據庫。

BUCKETING_COLS  :
Hive字段註釋,字段名,字段類型,字段序號)
元數據庫信息,存放HDFSHive全部hive序列化反序列化信息,如行分隔符、列分隔符、NULLSEQUENCE_TABLE對象的下一個可用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:表的基本信息

上面表的內容來看,hive整個建立表的過程已經比較清楚了
    解析用戶提交hive語句,對其進行解析,分解爲表、字段、分區等hive對象
  1. 根據解析到的信息構建對應的表、字段、分區等對象,從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:若是有分區,那麼桶就是區下的一個單位,若是表內沒有區,那麼桶直接就是表下的單位,桶通常是文件的形式。

  1. Hive 中的 Table 和數據庫中的 Table 在概念上是相似的,每個 Table 在 Hive 中都有一個相應的目錄存儲數據。例如,一個表 pvs,它在 HDFS 中的路徑爲:/wh/pvs,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄,全部的 Table 數據(不包括 External Table)都保存在這個目錄中。
  2. 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。表是否分區,如何添加分區,均可以經過-語言完成。經過分區,即目錄的存放形式,能夠比較容易地完成對分區條件的查詢。
  3. 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 。桶是的最終的存儲形式。在建立表時,用戶能夠對桶和列進詳細地描述。
  4. 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 的特性。

  RDBMS HQL HDFS 無 MapReduce 高 大

 










因爲 SQL 被普遍的應用在數據倉庫中,所以,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者能夠很方便的使用 Hive 進行開發。

Hive 是創建在Hadoop 之上的,全部 Hive 的數據都是存儲在HDFS 中的。而數據庫則能夠將數據保存在塊設備或者本地文件系統中。

Hive 中沒有定義專門的數據格式,數據格式能夠由用戶指定,用戶定義數據格式須要指定三個屬性:列分隔符(一般爲空格、」\t」、」\x001″)、行分隔符 (」\n」)以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。因爲在加載數據的過程當中,不須要從用戶數據格式到 Hive 定義的數據格式的轉換,所以,Hive 在加載的過程當中不會對數據自己進行任何修改,而只是將數據內容複製或者移動到相應的 HDFS
目錄中。而在數據庫中,不一樣的數據庫有不一樣的存儲引擎,定義了本身的數據格式。全部數據都會按照必定的組織存儲,所以,數據庫加載數據的過程會比較耗時。

由 於 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。所以,Hive 中不支持對數據的改寫和添加,全部的數據都是在加載的時候中肯定好的。而數據庫中的數據一般是須要常常進行修改的,所以可使用 INSERT INTO …  VALUES 添加數據,使用 UPDATE… SET 修改數據。

之 前已經說過,Hive 在加載數據的過程當中不會對數據進行任何處理,甚至不會對數據進行掃描,所以也沒有對數據中的某些 Key 創建索引。Hive 要訪問數據中知足條件的特定值時,須要暴力掃描整個數據,所以訪問延遲較高。因爲 MapReduce 的引入, Hive 能夠並行訪問數據,所以即便沒有索引,對於大數據量的訪問,Hive 仍然能夠體現出優點。數據庫中,一般會針對一個或者幾個列創建索引,所以對於少許的特定條件的數據的訪問,數據庫能夠有很高的效率,較低的延遲。因爲數據 的訪問延遲較高,決定了
Hive 不適合在線數據查詢。

Hive 中大多數查詢的執行是經過 Hadoop 提供的 MapReduce 來實現的(相似 select * from tbl 的查詢不須要 MapReduce)。而數據庫一般有本身的執行引擎。

之 前提到,Hive 在查詢數據的時候,因爲沒有索引,須要掃描整個表,所以延遲較高。另一個致使 Hive 執行延遲高的因素是 MapReduce 框架。因爲 MapReduce 自己具備較高的延遲,所以在利用 MapReduce 執行 Hive 查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。固然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時 候,Hive 的並行計算顯然能體現出優點。

由 於 Hive 是創建在 Hadoop 之上的,所以 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集羣在 Yahoo!,2009年的規模在4000 臺節點左右)。而數據庫因爲 ACID 語義的嚴格限制,擴展行很是有限。目前最早進的並行數據庫 Oracle 在理論上的擴展能力也只有 100 臺左右。

因爲 Hive 創建在集羣上並能夠利用 MapReduce 進行並行計算,所以能夠支持很大規模的數據;對應的,數據庫能夠支持的數據規模較小。

 


6.  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實際應用

一、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
相關文章
相關標籤/搜索