1. 程式人生 > >(一)Hive初識

(一)Hive初識

Hive學習之路 (一)Hive初識

目錄

 

正文

回到頂部

Hive 簡介

什麼是Hive

1、Hive 由 Facebook 實現並開源

2、是基於 Hadoop 的一個數據倉庫工具

3、可以將結構化的資料對映為一張資料庫表

4、並提供 HQL(Hive SQL)查詢功能

5、底層資料是儲存在 HDFS 上

6、Hive的本質是將 SQL 語句轉換為 MapReduce 任務執行

7、使不熟悉 MapReduce 的使用者很方便地利用 HQL 處理和計算 HDFS 上的結構化的資料,適用於離線的批量資料計算。

  資料倉庫之父比爾·恩門(Bill Inmon)在 1991 年出版的“Building the Data Warehouse”(《建 立資料倉庫》)一書中所提出的定義被廣泛接受——資料倉庫(Data Warehouse)是一個面 向主題的(Subject Oriented)、整合的(Integrated)、相對穩定的(Non-Volatile)、反映歷史 變化(Time Variant)的資料集合,用於支援管理決策(Decision Making Support)。

  Hive 依賴於 HDFS 儲存資料,Hive 將 HQL 轉換成 MapReduce 執行,所以說 Hive 是基於 Hadoop 的一個數據倉庫工具,實質就是一款基於 HDFS 的 MapReduce 計算框架,對儲存在 HDFS 中的資料進行分析和管理

為什麼使用 Hive

直接使用 MapReduce 所面臨的問題:

  1、人員學習成本太高

  2、專案週期要求太短

  3、MapReduce實現複雜查詢邏輯開發難度太大

為什麼要使用 Hive:

  1、更友好的介面:操作介面採用類 SQL 的語法,提供快速開發的能力

  2、更低的學習成本:避免了寫 MapReduce,減少開發人員的學習成本

  3、更好的擴充套件性:可自由擴充套件叢集規模而無需重啟服務,還支援使用者自定義函式

Hive 特點

優點

  1、可擴充套件性,橫向擴充套件,Hive 可以自由的擴充套件叢集的規模,一般情況下不需要重啟服務 橫向擴充套件:通過分擔壓力的方式擴充套件叢集的規模 縱向擴充套件:一臺伺服器cpu i7-6700k 4核心8執行緒,8核心16執行緒,記憶體64G => 128G

  2、延展性,Hive 支援自定義函式,使用者可以根據自己的需求來實現自己的函式

  3、良好的容錯性,可以保障即使有節點出現問題,SQL 語句仍可完成執行

缺點

  1、Hive 不支援記錄級別的增刪改操作,但是使用者可以通過查詢生成新表或者將查詢結 果匯入到檔案中(當前選擇的 hive-2.3.2 的版本支援記錄級別的插入操作)

  2、Hive 的查詢延時很嚴重,因為 MapReduce Job 的啟動過程消耗很長時間,所以不能 用在互動查詢系統中。

  3、Hive 不支援事務(因為不沒有增刪改,所以主要用來做 OLAP(聯機分析處理),而 不是 OLTP(聯機事務處理),這就是資料處理的兩大級別)。

Hive 和 RDBMS 的對比

總結:

  Hive 具有 SQL 資料庫的外表,但應用場景完全不同,Hive 只適合用來做海量離線數 據統計分析,也就是資料倉庫

回到頂部

Hive的架構

從上圖看出hive的內部架構由四部分組成:

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、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 雜湊 形成的多個檔案,所以資料的準確性也高很多