1. 程式人生 > >Hive (數據倉庫)簡介

Hive (數據倉庫)簡介

height 文件系統 upd snappy 執行計劃 復雜 logical 2個 管理

一:什麽是Hive(數據倉庫)?

  1、Hive 由 Facebook 實現並開源
  2、是基於 Hadoop 的一個數據倉庫工具
  3、可以將結構化的數據映射為一張數據庫表
  4、並提供 HQL(Hive SQL)查詢功能
  5、底層數據是存儲在 HDFS 上
  6、Hive的本質是將 SQL 語句轉換為 MapReduce 任務運行
  7、使不熟悉 MapReduce 的用戶很方便地利用 HQL 處理和計算 HDFS 上的結構化的數據,適用於離線的批量數據計算。
  8、底層支持多種不同的執行引擎(Hive on MapReduce、Hive on Tez、Hive on Spark)支
  9、持多種不同的壓縮格式、存儲格式以及自定義函數(壓縮:GZIP、LZO、Snappy、BZIP2.. ; 存儲:TextFile、SequenceFile、RCFile、ORC、Parquet ;     UDF:自定義函數)
所以說 Hive 是基於 Hadoop 的一個數據倉庫工具,實質就是一款基於 HDFS 的 MapReduce 計算框架,對存儲在 HDFS 中的數據進行分析和管理

二:為什麽使用 Hive以及Hive的優點

直接使用 MapReduce 所面臨的問題:
  1、人員學習成本太高
  2、項目周期要求太短
  3、MapReduce實現復雜查詢邏輯開發難度太大
為什麽要使用 Hive:
  1、更友好的接口:操作接口采用類 SQL 的語法,提供快速開發的能力
  2、更低的學習成本:避免了寫 MapReduce,減少開發人員的學習成本
  3、更好的擴展性:可自由擴展集群規模而無需重啟服務,還支持用戶自定義函數
(1)簡單容易上手:提供了類SQL查詢語言HQL
(2)可擴展:為超大數據集設計了計算/擴展能力(MR作為計算引擎,HDFS作為存儲系統)一般情
況下不需要重啟服務Hive可以自由的擴展集群的規模。
(3)提供統一的元數據管理
(4)延展性:Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數

三:Hive 的應用場景

Hive 的最佳使用場合是大數據集的批處理作業,例如,網絡日誌分析。
(1)日誌分析:大部分互聯網公司使用hive進行日誌分析,文本分析 包括百度、淘寶等。
1)統計網站一個時間段內的pv、uv
2)多維度數據分析
(2)海量結構化數據離線分析

技術分享圖片

技術分享圖片

1、用戶接口: shell/CLI, jdbc/odbc, webui Command Line Interface
  CLI,Shell 終端命令行(Command Line Interface),采用交互形式使用 Hive 命令行與 Hive 進行交互,最常用(學習,調試,生產)
  JDBC/ODBC,是 Hive 的基於 JDBC 操作提供的客戶端,用戶(開發員,運維人員)通過 這連接至 Hive server 服務
  Web UI,通過瀏覽器訪問 Hive
2、跨語言服務 : thrift server 提供了一種能力,讓用戶可以使用多種不同的語言來操縱hive
  Thrift 是 Facebook 開發的一個軟件框架,可以用來進行可擴展且跨語言的服務的開發, Hive 集成了該服務,能讓不同的編程語言調用 Hive 的接口
3、底層的Driver: 驅動器Driver,編譯器Compiler,優化器Optimizer,執行器Executor
  Driver 組件完成 HQL 查詢語句從詞法分析,語法分析,編譯,優化,以及生成邏輯執行 計劃的生成。生成的邏輯執行計劃存儲在 HDFS 中,並隨後由
MapReduce 調用執行
  Hive 的核心是驅動引擎, 驅動引擎由四部分組成:
    (1) 解釋器:解釋器的作用是將 HiveSQL 語句轉換為抽象語法樹(AST)
    (2) 編譯器:編譯器是將語法樹編譯為邏輯執行計劃
    (3) 優化器:優化器是對邏輯執行計劃進行優化
    (4) 執行器:執行器是調用底層的運行框架執行邏輯執行計劃
4、元數據存儲系統 : RDBMS MySQL
  元數據,通俗的講,就是存儲在 Hive 中的數據的描述信息。
  Hive 中的元數據通常包括:表的名字,表的列和分區及其屬性,表的屬性(內部表和 外部表),表的數據所在目錄
  Metastore 默認存在自帶的 Derby 數據庫中。缺點就是不適合多用戶操作,並且數據存 儲目錄不固定。數據庫跟著 Hive 走,極度不方便管理
  解決方案:通常存我們自己創建的 MySQL 庫(本地 或 遠程)
  Hive 和 MySQL 之間通過 MetaStore 服務交互
執行流程
  HiveQL 通過命令行或者客戶端提交,經過 Compiler 編譯器,運用 MetaStore 中的元數 據進行類型檢測和語法分析,生成一個邏輯方案(Logical Plan),然後
通過的優化處理,產生 一個 MapReduce 任務。

五:Hive工作原理

1 Execute Query
Hive接口,如命令行或Web UI發送查詢驅動程序(任何數據庫驅動程序,如JDBC,ODBC等)來執行。
2 Get Plan
在驅動程序幫助下查詢編譯器,分析查詢檢查語法和查詢計劃或查詢的要求。
3 Get Metadata
編譯器發送元數據請求到Metastore(任何數據庫)。
4 Send Metadata
Metastore發送元數據,以編譯器的響應。
5 Send Plan
編譯器檢查要求,並重新發送計劃給驅動程序。到此為止,查詢解析和編譯完成。
6 Execute Plan
驅動程序發送的執行計劃到執行引擎。
7 Execute Job
在內部,執行作業的過程是一個MapReduce工作。執行引擎發送作業給JobTracker,

在名稱節點並把它分配作業到TaskTracker,這是在數據節點。在這裏,查詢執行MapReduce工作。技術分享圖片    

7.1 Metadata Ops
與此同時,在執行時,執行引擎可以通過Metastore執行元數據操作。
8 Fetch Result
執行引擎接收來自數據節點的結果。
9 Send Results
執行引擎發送這些結果值給驅動程序。
10 Send Results
驅動程序將結果發送給Hive接口。

六:Hive(數據倉庫)和數據庫的異同

(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進行並行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。

七:Hive的數據類型及文件格式

Hive 提供了基本數據類型和復雜數據類型
基本數據類型:
整型
TINYINT — 微整型,只占用1個字節,只能存儲0-255的整數。
SMALLINT– 小整型,占用2個字節,存儲範圍–32768 到 32767。
INT– 整型,占用4個字節,存儲範圍-2147483648到2147483647。
BIGINT– 長整型,占用8個字節,存儲範圍-2^63到2^63-1。
布爾型
BOOLEAN — TRUE/FALSE
浮點型
FLOAT– 單精度浮點數。
DOUBLE– 雙精度浮點數。
字符串型
STRING– 不設定長度。
復雜數據類型
Structs:一組由任意數據類型組成的結構。比如,定義一個字段C的類型為STRUCT {a INT; b STRING},則可以使用a和C.b來獲取其中的元素值;
Maps:和Java中的Map相同,即存儲K-V對的。
Arrays:數組。
hive的文件格式
TEXTFILE //文本,默認值
SEQUENCEFILE // 二進制序列文件
RCFILE //列式存儲格式文件 Hive0.6以後開始支持
ORC //列式存儲格式文件,比RCFILE有更高的壓縮比和讀寫效率,Hive0.11以後開始支持
PARQUET //列出存儲格式文件,Hive0.13以後開始支持

八: Hive的數據組織

1、Hive 的存儲結構包括數據庫、表、視圖、分區和表數據等。數據庫,表,分區等等都對 應 HDFS
上的一個目錄。表數據對應 HDFS 對應目錄下的文件。
2、Hive 中所有的數據都存儲在 HDFS 中,沒有專門的數據存儲格式,因為 Hive 是讀模式 (Schema
On Read),可支持 TextFile,SequenceFile,RCFile 或者自定義格式等
3、 只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據
  Hive 的默認列分隔符:控制符 Ctrl + A,\x01 Hive 的
  Hive 的默認行分隔符:換行符 \n
4、Hive 中包含以下數據模型:
  database:在 HDFS 中表現為${hive.metastore.warehouse.dir}目錄下一個文件夾
  table:在 HDFS 中表現所屬 database 目錄下一個文件夾
  external table:與 table 類似,不過其數據存放位置可以指定任意 HDFS 目錄路徑
  partition:在 HDFS 中表現為 table 目錄下的子目錄
  bucket:在 HDFS 中表現為同一個表目錄或者分區目錄下根據某個字段的值進行 hash 散 列之後的
多個文件
  view:與傳統數據庫類似,只讀,基於基本表創建
5、Hive 的元數據存儲在 RDBMS 中,除元數據外的其它所有數據都基於 HDFS 存儲。默認情
況下,Hive 元數據保存在內嵌的 Derby 數據庫中,只能允許一個會話連接,只適合簡單的
測試。實際生產環境中不適用,為了支持多用戶會話,則需要一個獨立的元數據庫,使用 MySQL 作
為元數據庫,Hive 內部對 MySQL 提供了很好的支持。
6、Hive 中的表分為內部表、外部表、分區表和 Bucket 表
內部表和外部表的區別:
  刪除內部表,刪除表元數據和數據
  刪除外部表,刪除元數據,不刪除數據
內部表和外部表的使用選擇:
  大多數情況,他們的區別不明顯,如果數據的所有處理都在 Hive 中進行,那麽傾向於 選擇內部表,但是如果
Hive 和其他工具要針對相同的數據集進行處理,外部表更合適。
  使用外部表訪問存儲在 HDFS 上的初始數據,然後通過 Hive 轉換數據並存到內部表中
  使用外部表的場景是針對一個數據集有多個不同的 Schema
  通過外部表和內部表的區別和使用選擇的對比可以看出來,hive 其實僅僅只是對存儲在 HDFS 上的數據提供了
一種新的抽象。而不是管理存儲在 HDFS 上的數據。所以不管創建內部 表還是外部表,都可以對 hive 表的數據存
儲目錄中的數據進行增刪操作。
分區表和分桶表的區別:
  Hive 數據表可以根據某些字段進行分區操作,細化數據管理,可以讓部分查詢更快。同 時表和分區也可以進
一步被劃分為 Buckets,分桶表的原理和 MapReduce 編程中的 HashPartitioner 的原理類似。
  分區和分桶都是細化數據管理,但是分區表是手動添加區分,由於 Hive 是讀模式,所 以對添加進分區的數據
不做模式校驗,分桶表中的數據是按照某些分桶字段進行 hash 散列 形成的多個文件,所以數據的準確性也高很多

講了這麽多都是它的好處,那它的缺點呢?

九:Hive的缺點

1、data shuffle時網絡瓶頸,Reduce要等Map結束才能開始,不能高效利用網絡帶寬
2、一般一個SQL都會解析成多個MR job,Hadoop每次Job輸出都直接寫HDFS,性能差
3、每次執行Job都要啟動Task,花費很多時間,無法做到實時
4、由於把SQL轉化成MapReduce job時,map,shuffle和reduce所負責執行的SQL功能不
同。那麽就有Map->MapReduce或者MapReduce->Reduce這樣的需求。。
這樣可以降低寫HDFS的次數,從而提高性能。很明顯,由於架構上的天然涉及,Hive只適合批處理

Hive (數據倉庫)簡介