Hive整理

一 Hive 簡介

什麼是Hive

一、Hive 由 Facebook 實現並開源數據庫

二、是基於 Hadoop 的一個數據倉庫工具編程

三、能夠將結構化的數據映射爲一張數據庫表瀏覽器

四、並提供 HQL(Hive SQL)查詢功能服務器

五、底層數據是存儲在 HDFS 上架構

六、Hive的本質是將 SQL 語句轉換爲 MapReduce 任務運行框架

七、使不熟悉 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 所面臨的問題:工具

  一、人員學習成本過高

  二、項目週期要求過短

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

爲何要使用 Hive:

  一、更友好的接口:操做接口採用類 SQL 的語法,提供快速開發的能力

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

  三、更好的擴展性:可自由擴展集羣規模而無需重啓服務,還支持用戶自定義函數

Hive 特色

優勢

  一、可擴展性,橫向擴展,Hive 能夠自由的擴展集羣的規模,通常狀況下不須要重啓服務 橫向擴展:經過分擔壓力的方式擴展集羣的規模 縱向擴展:一臺服務器cpu i7-6700k 4核心8線程,8核心16線程,內存64G => 128G

  二、延展性,Hive 支持自定義函數,用戶能夠根據本身的需求來實現本身的函數

  三、良好的容錯性,能夠保障即便有節點出現問題,SQL 語句仍可完成執行

缺點

  一、Hive 不支持記錄級別的增刪改操做,可是用戶能夠經過查詢生成新表或者將查詢結 果導入到文件中(當前選擇的 hive-2.3.2 的版本支持記錄級別的插入操做)

  二、Hive 的查詢延時很嚴重,由於 MapReduce Job 的啓動過程消耗很長時間,因此不能 用在交互查詢系統中。

  三、Hive 不支持事務(由於不沒有增刪改,因此主要用來作 OLAP(聯機分析處理),而 不是 OLTP(聯機事務處理),這就是數據處理的兩大級別)。

Hive 和 RDBMS 的對比

總結:

  Hive 具備 SQL 數據庫的外表,但應用場景徹底不一樣,Hive 只適合用來作海量離線數 據統計分析,也就是數據倉庫

二 Hive的架構

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

一、用戶接口

  CLI,Shell 終端命令行(Command Line Interface),採用交互形式使用 Hive 命令行與 Hive 進行交互,最經常使用(學習,調試,生產)

  JDBC/ODBC,是 Hive 的基於 JDBC 操做提供的客戶端,用戶(開發員,運維人員)經過 這鏈接至 Hive server 服務

  Web UI,經過瀏覽器訪問 Hive

二、跨語言服務

  Thrift 是 Facebook 開發的一個軟件框架,能夠用來進行可擴展且跨語言的服務的開發, Hive 集成了該服務,能讓不一樣的編程語言調用 Hive 的接口

三、底層的Driver:

      驅動器Driver,編譯器Compiler,優化器Optimizer,執行器Executor,Driver 組件完成 HQL 查詢語句從詞法分析,語法分析,編譯,優化,以及生成邏輯執行 計劃的生成。生成的邏輯執行計劃存儲在 HDFS 中,並隨後由 MapReduce 調用執行

 Hive 的核心是驅動引擎, 驅動引擎由四部分組成:

  (1) 解釋器:解釋器的做用是將 HiveSQL 語句轉換爲抽象語法樹(AST)

  (2) 編譯器:編譯器是將語法樹編譯爲邏輯執行計劃

  (3) 優化器:優化器是對邏輯執行計劃進行優化

  (4) 執行器:執行器是調用底層的運行框架執行邏輯執行計劃

四、元數據存儲系統

  元數據,通俗的講,就是存儲在 Hive 中的數據的描述信息。

  Hive 中的元數據一般包括:表的名字,表的列和分區及其屬性,表的屬性(內部表和 外部表),表的數據所在目錄

  Metastore 默認存在自帶的 Derby 數據庫中。缺點就是不適合多用戶操做,而且數據存 儲目錄不固定。數據庫跟着 Hive 走,極度不方便管理

  解決方案:一般存咱們本身建立的 MySQL 庫(本地 或 遠程)

  Hive 和 MySQL 之間經過 MetaStore 服務交互

五、執行流程

  HiveQL 經過命令行或者客戶端提交,通過 Compiler 編譯器,運用 MetaStore 中的元數 據進行類型檢測和語法分析,生成一個邏輯方案(Logical Plan),而後經過的優化處理,產生 一個 MapReduce 任務。

三 Hive的數據組織

一、Hive 的存儲結構包括數據庫、表、視圖、分區和表數據等。數據庫,表,分區等等都對 應 HDFS 上的一個目錄。表數據對應 HDFS 對應目錄下的文件。

二、Hive 中全部的數據都存儲在 HDFS 中,沒有專門的數據存儲格式,由於 Hive 是讀模式 (Schema On Read),可支持 TextFile,SequenceFile,RCFile 或者自定義格式等

三、 只須要在建立表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就能夠解析數據

  Hive 的默認列分隔符:控制符 Ctrl + A,\x01 Hive 的

  Hive 的默認行分隔符:換行符 \n

四、Hive 中包含如下數據模型:

  database:在 HDFS 中表現爲${hive.metastore.warehouse.dir}目錄下一個文件夾

  table:在 HDFS 中表現所屬 database 目錄下一個文件夾

  external table:與 table 相似,不過其數據存放位置能夠指定任意 HDFS 目錄路徑

  partition:在 HDFS 中表現爲 table 目錄下的子目錄

  bucket:在 HDFS 中表現爲同一個表目錄或者分區目錄下根據某個字段的值進行 hash 散 列以後的多個文件

  view:與傳統數據庫相似,只讀,基於基本表建立

五、Hive 的元數據存儲在 RDBMS 中,除元數據外的其它全部數據都基於 HDFS 存儲。默認情 況下,Hive 元數據保存在內嵌的 Derby 數據庫中,只能容許一個會話鏈接,只適合簡單的 測試。實際生產環境中不適用,爲了支持多用戶會話,則須要一個獨立的元數據庫,使用 MySQL 做爲元數據庫,Hive 內部對 MySQL 提供了很好的支持。

六、Hive 中的表分爲內部表、外部表、分區表和 Bucket 表

內部表和外部表的區別:

  刪除內部表,刪除表元數據和數據

  刪除外部表,刪除元數據,不刪除數據

內部表和外部表的使用選擇:

  大多數狀況,他們的區別不明顯,若是數據的全部處理都在 Hive 中進行,那麼傾向於 選擇內部表,可是若是 Hive 和其餘工具要針對相同的數據集進行處理,外部表更合適。

  使用外部表訪問存儲在 HDFS 上的初始數據,而後經過 Hive 轉換數據並存到內部表中

  使用外部表的場景是針對一個數據集有多個不一樣的 Schema

  經過外部表和內部表的區別和使用選擇的對比能夠看出來,hive 其實僅僅只是對存儲在 HDFS 上的數據提供了一種新的抽象。而不是管理存儲在 HDFS 上的數據。因此無論建立內部 表仍是外部表,均可以對 hive 表的數據存儲目錄中的數據進行增刪操做。

分區表和分桶表的區別: 

  Hive 數據表能夠根據某些字段進行分區操做,細化數據管理,可讓部分查詢更快。同 時表和分區也能夠進一步被劃分爲 Buckets,分桶表的原理和 MapReduce 編程中的 HashPartitioner 的原理相似。

  分區和分桶都是細化數據管理,可是分區表是手動添加區分,因爲 Hive 是讀模式,所 以對添加進分區的數據不作模式校驗,分桶表中的數據是按照某些分桶字段進行 hash 散列 造成的多個文件,因此數據的準確性也高不少

相關文章
相關標籤/搜索