Hive - 簡介

一 概要介紹

        Hive最初是應Facebook每天產生的海量新興社會網絡數據進行管理和機器學習的需求而產生和發展的,是建立在 Hadoop 上的數據倉庫基礎構架。作爲Hadoop的一個數據倉庫工具,Hive可以將結構化的數據文件映射爲一張數據庫表,並提供簡單的sql查詢功能。 
     
       Hive 主要提供以下功能:
           1. 它提供了一系列的工具,可用來對數據進行提取/轉化/加載(ETL);
           2. 是一種可以存儲、查詢和分析存儲在HDFS(或者HBase)中的大規模數據的機制;
           3. 查詢是通過MapReduce來完成的(並不是所有的查詢都需要MapReduce來完成,比如select * from XXX就不需要;

        Hive設計目的就是用來管理和查詢結構化數據,它屏蔽了底層將sql語句轉換爲MapReduce任務過程,爲用戶提供的簡單的SQL語句,將用戶從複雜的MapReduce編程中解脫出來。

   

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

       Hive使用關係數據庫中的表、行、列、模式等概念,學起來很容易。學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
                                   
                                        
                                                                        Hive與傳統關係數據庫的對比


二  Hive的體系架構
  
     Hive的整體架構,如下圖所示

           

Hive的主要部件如下:

     用戶接口CLI(command-line interface,命令行界面)、JDBC/ODBC、Broswer

     Driver:  接受query的組件,該組件實現session的概念,以處理和提供基於JDBC/ODBC執行。

     編譯器: 該組件分析query,在不同的查詢塊和查詢表達式上進行語義分析,並最終通過從metastore中查找表與分區的元信息生成執行計劃。

     Metastore:存儲數據倉庫裏所有的各種表與分區的結構化信息,包括列與列類型信息,序列化器與反序列化器,從而能夠讀寫hdfs中的數據。

    Metastore 包含如下的部分:
          Database 是表(table)的名字空間。默認的數據庫(database)名爲‘default’
          Table      表(table)的原數據包含信息有:列(list of columns)和它們的類型(types),擁有者(owner),存儲空間(storage)和SerDei信息
          Partition 每個分區(partition)都有自己的列(columns),SerDe和存儲空間(storage)。這一特徵將被用來支持Hive中的模式演變(schema evolution)
   
        注:Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。 由於Hive的元數據需要不斷的更新、修改,而HDFS系統中的文件是多讀少改的,這顯然不能將Hive的元數據存儲在HDFS中。目前Hive將元數據存儲在數據庫中,如Mysql、Derby中。

     執行引擎 此組件執行由compiler創建的執行計劃。此計劃是一個關於階段的有向無環圖。執行引擎管理不同階段的依賴關係,並在合適的系統組件上執行這些階段

Hive查詢語言

     HiveQL是一個類SQL的查詢語言。它模仿SQL語法來創建表,讀表到數據,並查詢表。HiveQL也允許用戶嵌入他們自定義的map-reduce腳本。這些腳本能用任何支持基於行的流式接口的語言寫-從標準輸入讀入並寫到標準輸出。這種靈活性也有一定的代價:即字符串的轉換帶來的性能損失。儘管如此,我們看到用戶似乎不介意於此,他們自己實現這些腳本。另一個特性是多表插入。在此構造下,用戶可以在相同的數據上通過一條HiveQL執行多query。Hive優化這些query,從而能共享輸入數據的掃描,這樣就增加了這些query的幾個數量級的吞吐量。

三 Hive 中的數據模型

      Hive 沒有專門的數據存儲格式,也沒有爲數據建立索引,用戶可以非常自由的組織 Hive 中的表,只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。Hive 中所有的數據都存儲在 HDFS 中,Hive 中包含以下數據模型:表(Table),外部表(External Table),分區(Partition),桶(Bucket)。

      注:如果不指定分割符的話,hive默認的分隔符是\001 
              表=》分區=》桶,它們的對數據的劃分粒度越來越小
                                 
                                                      Hive數據抽象結構圖
       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
注意:表中可以不包括Partition字段

     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


     Table 的創建過程和數據加載過程(這兩個過程可以在同一個語句中完成),在加載數據的過程中,實際數據會被移動到數據倉庫目錄中;之後對數據對訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。

     外部表, External Table 指向已經在 HDFS 中存在的數據,可以創建 Partition。它和 Table 在元數據的組織上是相同的,而實際數據的存儲則有較大的差異。External Table 只有一個過程,加載數據和創建表同時完成(CREATE EXTERNAL TABLE ……LOCATION),實際數據是存儲在 LOCATION 後面指定的 HDFS 路徑中,並不會移動到數據倉庫目錄中。當刪除一個 External Table 時,僅刪除元數據,表中的數據不會真正被刪

發佈了111 篇原創文章 · 獲贊 27 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章