1. 程式人生 > >hive的基礎理論

hive的基礎理論

1. hive的介紹

   什麼是hive:Hive是基於hadoop的一個數據倉庫工具,實質就是一款基於hdfs的MapReduce計算框架,對儲存在HDFS中的資料進行分析和管理。
   hive的工作方式:把存放在hive中的資料都抽象成一張二維表格,提供了一個類似於sql語句的操作方式,這些sql語句最終被hive的底層翻譯成為MapReduce程式,最終在hadoop叢集上執行,結果也會輸出在hdfs之中。(必須是結構化的資料)。在儲存的時候hive對資料不做校驗,在讀取的時候校驗。
   hive的的優點:極大的簡化了分散式的計算程式的程式設計。使不會分散式程式設計的,其他工作人員都可以進行海量資料的統計分析。
   hive的的缺點

:不支援行級別的增刪改操作、hive的查詢延遲很嚴重、hive中不支援事務,主要用於做OLAP(聯機分析處理)。
   hive的的適用場景:hive資料倉庫中的資料,主要是儲存,在進行ETL(資料清洗、抽取、轉換、裝載)操作之後的具有結構化的資料。但是資料的儲存的格式沒有特殊要求,可以使普通檔案,也可以是溢寫壓縮檔案等等。
   hive的的與關係型資料庫的對比
hive的基礎理論

2. hive的架構

hive的基礎理論
hive的架構中有四個部分組成:
   使用者介面
    - CLI(command line interface),shell終端命令列,採用互動式使用hive命令列與hive進行互動,最常用(學習、生成、除錯)
    - Jdbc/odbc:是hive的基於jdbc操作提供的客戶端,使用者(開發、運維)通過這個連結hive server服務
    - Web UI:通過瀏覽器訪問hive(基本不用)
   Thrift Server

:Thrift是facebook開發的一個軟體框架,可以用來進行可擴充套件且跨語言的服務的開發,hive集成了該服務,能讓不同的程式語言呼叫hive的介面。
   底層四大元件:底層的四大元件完成hql查詢語句從詞法分析,語法分析,編譯,優化,以及生成邏輯執行計劃的生成。生成的邏輯執行計劃儲存在hdfs中,並隨後由MapReduce呼叫執行。
    - 直譯器:直譯器的作用是將hiveSQL語句轉換成抽象語法數
    - 編譯器:編譯器是將語法樹編譯成為邏輯執行計劃
    - 優化器:優化器是對邏輯執行計劃進行優化
    - 執行器:執行時呼叫底層的執行框架執行邏輯執行計劃
執行流程就是:hiveQL,通過命令或者客戶端提交,經過compiler編譯器,運用metastore中的元資料進行型別檢測和語法分析,生成一個邏輯方案,然後通過的優化處理,產生一個maptask程式。
   元資料庫
:就是儲存在hive中的資料的描述資訊,通常包括:表的名字、表的列和分割槽以及其屬性、表的屬性(內部表和外部表),表的資料所在目錄。而hive有兩種元資料的儲存方案:
    - Metastore預設儲存在自帶的derby資料庫中。缺點是:不適合多使用者操作,並且資料儲存目錄不固定。資料庫跟著hive的進入目錄走,極度不方便管理。
    - Hive和mysql之間通過Metastore服務互動(本地或者遠端)

3. hive的資料儲存

  hive的儲存特點
    - hive中所有的資料都儲存在hdfs中,沒有專門的資料儲存格式,因為hive是讀模式,可支援TezxtFile、SequenceFile(序列化)RCFile(行列結合)或者自定義格式等
    - 只需要在建立表的時候,告訴hive資料中的列分隔符和行分隔符,hive就可以解析資料,預設的列分隔符是:(Ctrl + a 不可見字元: \x01),行分隔符是:(\n 換行符)
  hive的儲存結構: hive的儲存結構:資料庫、表、檢視、分割槽和表資料等。資料庫、表、檢視、分割槽等等都對應hdfs上的一個目錄,表資料對應hdfs對應目錄下的檔案。
例:

Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/student.txt
Hdfs://Hadoop01/user/hive/warehouse:表示hive的資料倉庫
Hdfs://Hadoop01/user/hive/warehouse/myhive.db: hive的一個數據庫
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student hive中的一個表
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/student.txt 資料檔案

注意:當我們在建立表的時候,首先會在hdfs上的相應的目錄下生成一個檔案,同時在hive的元資料庫中會為這個新建的表生成一條記錄。
   hive具體的儲存結構
     - 資料倉庫:在 HDFS 中表現為${hive.metastore.warehouse.dir}目錄下一個資料夾
     -:hive的表分為內部表、外部表、分割槽表、分桶表,表在hdfs中的表現形式也是目錄,但是不同的表之間的表現形式不同
     - 檢視:物化,hive是不會進行物化,相當於給一個sql語句建立了一個快捷方式,儲存的是一個檢視中的sql語句。只讀,基於基表建立。
     - 資料檔案 :表中的真實資料

4. hive的特特特別重要的要點

1)hive中內部表和外部表的區別

內部表:又叫管理表,表的建立,和刪除都由hive自己決定。
外部表:表結構上同內部表,但是儲存的資料時自己定義的,外部表在刪除的時候只刪除元資料,原始資料時不能刪除的。
 內部表和外部表的區別主要體現在兩個方面:
   - 刪除:刪除內部表,刪除元資料和資料;刪除外部表,刪除元資料,保留資料。
   - 使用:如果資料的所有處理都在 Hive 中進行,那麼傾向於 選擇內部表,但是如果 Hive 和其他工具要針對相同的資料集進行處理,外部表更合適。使用外部表訪問儲存在hdfs上的資料,然後通過hive轉化資料並存儲到內部表中。

2)hive中分桶表和分割槽表的區別

分割槽表: 原來的一個大表儲存的時候分成不同的資料目錄進行儲存。
  如果說是單分割槽表,那麼在表的目錄下就只有一級子目錄,如果說是多分割槽表,那麼在表的目錄下有多少分割槽就有多少級子目錄。不管是單分割槽表,還是多分割槽表,在表的目錄下,和非最終分割槽目錄下是不能之間儲存資料檔案的。
例:

單分割槽表:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p0
多分割槽表:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p0
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p1
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p2
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p1/p11

分桶表: 原理和hashpartitioner 一樣,將hive中的一張表的資料進行歸納分類的時候,歸納分類規則就是hashpartitioner。(需要指定分桶欄位,指定分成多少桶)
 bucket:在hdfs中表現為同一個表目錄或者分割槽目錄下根據某個欄位的值進行Hash雜湊之後的多個檔案,分桶的表現形式就是一個單獨的檔案.
例:

Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/age>15
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/age>20
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/age>30

分割槽表和分桶的區別除了儲存的格式不同外,最主要的是作用:
  - 分割槽表:細化資料管理,縮小mapreduce程式 需要掃描的資料量。
  - 分桶表:提高join查詢的效率,在一份資料會被經常用來做連線查詢的時候建立分桶,分桶欄位就是連線欄位;提高取樣的效率。