一、Hive簡介
Hive 是一個構建於 Hadoop 之上的資料倉庫工具,由 Facebook 公司開發,並在 2008 年 8 月開源。Hive 在某種程度上可以看作是使用者程式設計介面,其本身並不儲存和處理資料,而是依賴 HDFS 來儲存資料,依賴 MapReduce 來處理資料。Hive 定義了簡單的類似 SQL 的查詢語言-HiveQL,它與大部分 SQL 語法相容,但是,並不完全支援 SQL 標準,比如,HiveQL 預設不支援更新操作,也不支援索引和事務,它的子查詢和連線操作也存在很多侷限。
Hive的最佳使用場景是大資料的批處理作業。
Hive框架的作用:
(1)可以讓不懂Java開發的資料分析人員使用Hadoop進行資料分析。
(2)MapReduce開發非常繁瑣複雜,使用Hive可以提高效率。
(3)統一的元資料管理,可與Impala/Spark共享元資料。
二、Hive的體系結構首先左邊是Command-line shell的一個命令列,右邊有個Thrift/JDBC,這是什麼意思呢?就是說我們可以透過什麼方式來訪問Hive,可以理解成Command-line shell和Thrift/JDBC 是兩個客戶端來操作資料,你可以透過Hive指令碼的方式來操作,也可以透過伺服器,透過thrift協議按照編譯JDBC的方式就能夠完成對Hive裡面的資料進行相應的操作。
不管是透過哪一個客戶端,肯定要寫SQL語句。因為剛開始的時候SQL僅僅是一段很普通的字串,如果想把這段SQL轉換成物理性的執行計劃,那其中是有很多的過程的,所以第一步就是解析SQL。首先把語句解析成抽象語法樹(AST),之後才能轉換成邏輯性執行計劃,上圖中有一個SQL Parser目的就是把我們的SQL語句翻譯成抽象語法樹,到這一步之後會生成邏輯執行計劃,然後再使用一個查詢最佳化的工具Query Optimizer對我們邏輯執行計劃進行最佳化,最終再透過Exection(執行器)生成物理執行計劃,在物理執行計劃中還包括序列化和反序列化(SerDes),把最終的物理執行計劃生提交到MapReduce上去執行。
從上到下的這個過程,從客戶端傳遞SQL至Driver來解析SQL語句到最後生成物理執行計劃交給MapReduce執行這些都是由Hive核心完成的,我們輸入僅僅只有一條SQL語句,那麼輸出就是相應的作業的輸出了,那麼左邊還剩下兩個框Metastore和RDBMS(MySQL)是什麼意思呢?
MetaStore表示元資料,也就是“資料的資料”,例如一張表裡有許多資料,而元資料則是在描述該表的相關資訊,例如建立時間、列數、行數等。Hive的元資料預設儲存在derby資料庫裡,但推薦儲存在MySQL裡。
三、 SQL on Hadoop框架Hive是一種最常見、使用最為廣泛的SQL on Hadoop框架。還有幾個其他常見的SQL on Hadoop框架。
1. Presto
Presto是Facebook開源的大資料查詢引擎,為了解決Hive查詢慢產生。使用Java編寫,資料全部在記憶體中處理,作用和Impala類似。原生集成了Hive、HBase和關係型資料庫。國內京東使用比較廣泛。
2. Drill
2012年,由Hadoop 分銷商的領導者之一MapR 領導的一個團隊,提出構建一個Google Dremel 的開源版本,一個互動式的分散式熱點分析系統。
2015年,兩位關鍵的Drill 貢獻者離開了MapR,並啟動了Dremio,該專案尚未釋出。
3. Impala
底層是使用C++寫的,受到Google的Dremel專案啟發,2012年由Cloudera開發,現在是Apache開源專案。
Impala是基於記憶體的,適合互動式查詢任務。Hive是基於磁碟的。
需要指出的是,雖然 Impala 的實時查詢效能要比 Hive 好很多,但是, Impala 的目的並不在於替換現有的包括 Hive 在內的 MapReduce 工具,而是提供一個統一的平臺用於實時查詢。事實上, Impala 的執行依然需要依賴於 Hive 的元資料。 總體而言, Impala 與其它元件之間的關係如圖所示。
與 Hive 類似, Impala 也可以直接與 HDFS 和 HBase 進行互動。 Hive 底層執行使用的是MapReduce,所以主要用於處理長時間執行的批處理任務,例如批次提取、轉化、載入型別的任務。而 Impala 則採用了與商用並行關係資料庫類似的分散式查詢引擎,可以直接從HDFS 或者 HBase 中用 SQL 語句查詢資料, 而不需要把 SQL 語句轉化成 MapReduce 任務來執行, 從而大大降低了延遲, 可以很好地滿足實時查詢的要求。另外, Impala 和 Hive 採用相同的 SQL 語法、 ODBC 驅動程式和使用者介面。
4. Spark SQL
Spark SQL是Spark用來處理結構化資料的一個模組,它提供了一個程式設計抽象叫做DataFrame並且作為分散式SQL查詢引擎的作用。
由於MapReduce這種計算模型執行效率比較慢,所以Spark SQL的應運而生,它是將Spark SQL轉換成RDD,然後提交到叢集執行,執行效率非常快!同時Spark SQL也支援從Hive中讀取資料。
5. Apache Kylin
Apache Kylin是一個開源的、分散式的分析型資料倉庫,提供Hadoop/Spark 之上的 SQL 查詢介面及多維分析(OLAP)能力以支援超大規模資料,最初由 eBay 開發並貢獻至開源社群。它能在亞秒內查詢巨大的表。
Kylin 提供與多種資料視覺化工具的整合能力,如 Tableau、PowerBI 等,令使用者可以使用 BI 工具對 Hadoop 資料進行分析。
Kylin 以Hive或者Kafka作為資料來源,裡面儲存著真實表,而Kylin做的就是將資料進行抽象,透過引擎實現Cube的構建。將HBase作為資料的倉庫,存放Cube。因為HBase的直接讀取比較複雜,所以Kylin提供了近似SQL和HQL的形式,滿足了資料讀取的基本需求。對外提供了RestApi和JDBC/ODBC方便操作。
Elasticsearch技術專欄第1-3章,分別介紹了Elasticsearch/Kibana/Metricbeat v7.3的安裝配置。技術專欄從實戰出發,透過理論講解-環境搭建-專案案例實戰,讓初學者快速掌握Elastic技術棧。
獲取更多Elasticsearch設計細節、入門例項、原理剖析和演示專案原始碼,可訪問Elasticsearch 7.x 技術專欄。