Hive 1、什么是Hive,Hive有什么用


  

一、什么是Hive

  Hive是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數據。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的復雜的分析工作。


  Hive 沒有專門的數據格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允許用戶指定數據格式。

二、Hive的應用場景

  Hive 構建在基於靜態批處理的Hadoop 之上,Hadoop 通常都有較高的延遲並且在作業提交和調度的時候需要大量的開銷。因此,Hive 並不能夠在大規模數據集上實現低延遲快速的查詢,例如,Hive 在幾百MB 的數據集上執行查詢一般有分鍾級的時間延遲。因此, Hive 並不適合那些需要低延遲的應用,例如,聯機事務處理(OLTP)。Hive 查詢操作過程嚴格遵守Hadoop MapReduce 的作業執行模型,Hive 將用戶的HiveQL 語句通過解釋器轉換為MapReduce 作業提交到Hadoop 集群上,Hadoop 監控作業執行過程,然后返回作業執行結果給用戶。Hive 並非為聯機事務處理而設計,Hive 並不提供實時的查詢和基於行級的數據更新操作。Hive 的最佳使用場合是大數據集的批處理作業,例如,網絡日志分析。
 
三、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 調用執行。

    .編譯器將一個Hive QL轉換操作符
    .操作符是Hive的最小的處理單元
    .每個操作符代表HDFS的一個操作或者一道MapReduce作業

    Hive編譯器
 
 
 
     編譯流程

 
 
  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的模式
   單用戶數據庫模式
  單用戶數據庫模式:通過網絡連接到一個數據庫中,是最經常使用到的模式。
  
  
   單用戶Derby模式
  單用戶Derby模式:此模式連接到一個In-memory 的數據庫Derby,一般用於Unit Test。
  
 
   多用戶遠程服務器模式
  多用戶遠程服務器模式:用於非Java客戶端訪問元數據庫,在服務器端啟動MetaStoreServer,客戶端利用Thrift協議通過MetaStoreServer訪問元數據庫。
  
 
六、Hive執行流程
    •編譯器將一個Hive QL轉換操作符
    •操作符是Hive的最小的處理單元
    •每個操作符代表HDFS的一個操作或者一道MapReduce作業
  Operator
    •Operator都是hive定義的一個處理過程
    •Operator都定義有:
    •protected List  <Operator<?   extends Serializable  >> childOperators; 
    •protected List  <Operator<?   extends Serializable  >> parentOperators; 
    •protected boolean done; // 初始化值為false
    •所有的操作構成了 Operator圖,hive正是基於這些圖關系來處理諸如limit, group by, join等操作
 
操作符
描述
TableScanOperator
掃描hive表數據
ReduceSinkOperator
創建將發送到Reducer端的<Key,Value>對
JoinOperator
Join兩份數據
SelectOperator
選擇輸出列
FileSinkOperator
建立結果數據,輸出至文件
FilterOperator
過濾輸入數據
GroupByOperator
GroupBy語句
MapJoinOperator
/*+mapjoin(t) */
LimitOperator
Limit語句
UnionOperator
Union語句
    
    •Hive通過ExecMapper和ExecReducer執行MapReduce任務
    •在執行MapReduce時有兩種模式
    •本地模式
    •分布式模式
 
   ANTLR詞法語法分析工具
    •ANTLR—Another Tool for Language Recognition
    •ANTLR 是開源的
    •為包括Java,C++,C#在內的語言提供了一個通過語法描述來自動構造自定義語言的識別器(recognizer),編譯器(parser)和解釋器(translator)的框架
    •Hibernate就是使用了該分析工具
 
  
七、一條HQL引發的思考
    案例HQL
    •select key from test_limit  limit 1
    •Stage-1
    •TableScan Operator>Select Operator-> Limit->File Output Operator
    •Stage-0
    •Fetch Operator
    •讀取文件
 
    Mapper與InputFormat
    •該hive MR作業中指定的mapper是:
    •mapred.mapper.class = org.apache.hadoop.hive.ql.exec.ExecMapper
    •input format是:
    •hive.input.format  = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM