引言
查詢分析是大數據要解決的核心問題之一,而SQL做爲查詢分析中使用最簡單、最普遍的的語言之一,必然而然的催生了許多支持在Hadoop上使用SQL的系統,這就是所謂的SQL-on-Hadoop系統,其中大衆熟知的Hive就是最先的SQL-on-Hadoop系統。node
通過若干年的發展,SQL-on-Hadoop系統已經百花齊放,按照架構劃分這些系統大體能夠分爲如下幾類:python
MapReduce架構系統:如Hive,這類系統是在MapReduce計算框架上封裝了一個SQL語義層,在運行過程當中把SQL轉換爲MapReduce程序來執行
MPP架構系統:如Impala、Presto、Drill等,這類系統採用MPP(Massively Parallel Processing)架構,而非MapReduce
預計算系統:如Druid、Kylin等,這類系統主要特色是對數據進行預計算,並將結果保存,而在查詢時直接獲取相應結果值
本文主要是對這些系統作了一個基本總結,並簡單介紹了一些主流系統的架構以及處理流程。下表是按照時間順序,對這些系統的一個概述,包括技術特色和主導公司等。數據庫
Apache Hive
Apache Hive是Hadoop生態系統中最先的SQL引擎,它能夠將結構化數據文件映射爲一張數據庫表,並提供類SQL查詢功能。Hive本質上是在MapReduce計算框架上封裝了一個SQL語義層,並在運行過程當中把SQL轉換爲MapReduce程序來執行。網絡
Hive經過用戶交互接口接收SQL後,其Driver結合元數據將SQL翻譯成MapReduce程序,並提交到Hadoop中執行,最後將執行結果輸出,其架構以下圖所示:數據結構
主要組成部分包括:架構
user interface:即用戶接口,包含CLI(命令行),JDBC/ODBC等
Metastore:即元數據,包括表名、表的數據所在目錄等;默認元數據存儲在自帶的derby數據庫中,推薦使用MySQL
Driver:即驅動器,包含如下幾個組件:框架
解析器(SQL Parser):將SQL轉換成抽象語法樹(AST),並對AST進行語法分析
編譯器(Compiler):將AST編譯生成邏輯執行計劃
優化器(Query Optimizer):對邏輯執行計劃進行優化
執行器(Execution):把邏輯執行計劃轉換成能夠運行的物理計劃
Hive提供的類SQL查詢功能避免了開發人員書寫複雜的MapReduce程序,極大的簡化了MapReduce程序的開發,大大減小了相應的學習成本。隨着技術的不斷進步,Hive的執行引擎也不斷髮展,尤爲是有了Tez以後,其性能有了很大的改進。不過,其不足依舊很明顯,即處理速度慢,於是比較適合運行在批處理場景中,而不適合交互式查詢等對時延要求高的場景中。機器學習
Apache Spark
Spark是一個通用的大數據計算框架,指望使用一個技術棧來解決大數據領域包括批處理、流計算、交互式查詢、圖計算和機器學習在內的各類計算任務,其軟件棧以下圖所示:分佈式
其中的Spark SQL組件是一個用於處理結構化數據的組件,它吸取了一個叫Shark(Hive-on-Spark)的項目。Spark SQL中最重要的一個概念就是DataFrame,它是帶有Shema信息的RDD,相似於傳統數據庫中的二維表格。Spark SQL支持將多種外部數據源的數據轉化爲DataFrame,包括Json、Parquet等,並能夠經過將其註冊爲臨時表,而後使用SQL來處理和分析這些數據。Spark SQL的運行流程包含如下幾步,如圖所示:函數
包含如下幾個步驟:
SQL語句通過SqlParser解析成UnresolvedLogicalPlan
Analyzer結合catalog進行綁定,生成LogicalPlan
Optimizer對LogicalPlan優化,生成OptimizedLogicalPlan
SparkPlan將OptimizedLogicalPlan轉換成PhysicalPlan
prepareForExecution()將PhysicalPlan轉換成executedPhysicalPlan
PhysicalPlan執行獲得最終結果RDD
傳統的MapReduce程序中Map和Reduce階段的結果都要寫磁盤,這大大下降了系統性能。Spark使用RDD做爲基本數據結構,數據常駐內存,因此計算速度獲得了很大提升。可是當內存不足時,其計算速度會大大下降,甚至容易出現OOM錯誤。
Apache Impala
Apache Impala是一款基於HDFS/HBase的MPP查詢引擎,其架構以下圖所示:
主要組成部分包括:
Impalad: 即Impala Daemon(Impala守護進程);它運行在集羣的每一個node上,負責接收客戶端的查詢請求,對查詢進行並行化處理。其中接收查詢請求的Impalad爲Coordinator,Coordinator對查詢語句處理後生成執行計劃,再把執行計劃分發給具備相應數據的其它Impalad執行,其餘Impalad執行完成後,把結果發送回
Coordinator,由Coordinator構建最終結果,並返回給客戶端。另外,Impalad進程也會和Statusstore通訊以確認哪些Impalad是能夠正常工做的
Statestore: 負責跟蹤和檢查Impalad健康狀態的進程,由statestored進程表示;它負責處理Impalad的註冊訂閱,而且和各個Impalad進程保持心跳連接
CLI: 提供給用戶查詢使用的命令行工具(Impala Shell使用python實現),同時Impala還提供了Hue,JDBC, ODBC使用接口
Impala沒有使用MapReduce計算框架,而是使用與商用並行關係數據庫中相似的分佈式查詢引擎,而且Impala的中間結果不寫入磁盤,而是經過網絡以流的形式傳遞,這大大下降了IO開銷,於是Impala的查詢速度很是快。可是Impala缺點也很明顯,如對用戶自定義函數支持很差、不支持Transforms、不支持查詢期的容錯等。
Apache Drill
Apache Drill是一個分佈式的MPP SQL引擎,是開源版本的Google Dremel。它支持對本地文件、HDFS、HBASE等數據進行數據查詢,也支持對如JSON等schema-free的數據進行查詢,其架構以下圖所示:
從上圖能夠看到,Drill的核心是DrillBit,它主要負責接收客戶端的請求,處理查詢,並將結果返回給客戶端。 Drill的查詢流程包括如下步驟:
drill客戶端發起查詢,任意DrilBit均可以接受來自客戶端的查詢
收到請求的DrillBit成爲驅動節點(Foreman),對查詢進行分析優化生成執行計劃,以後將執行計劃劃分紅各個片斷,並肯定合適的節點來執行
各個節點執行查詢片斷,並將結果返回給驅動節點
驅動節點將結果返回給客戶端
Presto
Presto是一個分佈式的MPP查詢引擎,支持多種數據源,包括Hive、RDBMS、Redis等,而且能夠跨數據源查詢。Presto的基本架構以下圖所示:
主要組成部分包括:
coodinator:用於解析查詢SQL,生成執行計劃,並分發給worker執行
discovery server:worker上線後,向discovery server註冊。coodinator分發任務前,須要向discovery server獲取能夠正常工做worker列表
worker:具體執行任務的工做節點
Apache Phoenix
Apache Phoenix是一個運行在HBase上的SQL框架,其本質是用Java寫的基於JDBC API操做HBase的開源SQL引擎,經過Phoenix能夠像使用MySQL等關係型數據庫同樣操做HBase中的表。Apache Phoenix支持ACID事務功能的標準SQL,它將SQL編譯成原生HBase的scan語句,其架構以下圖所示:
從上圖能夠看到:
Phoenix的JDBC driver是在HBase的client端
Phoenix在HBase的RegionServer上
Apache Kylin
Apache Kylin是一個開源的分佈式分析引擎,提供Hadoop/Spark之上的SQL查詢接口及多維分析(OLAP)能力。Kylin的核心是預計算,即對可能用到的度量進行預計算,並將結果保存爲Cube以便查詢時直接訪問。Kylin的架構以下圖所示:
主要組成部分包括:
離線構建部分:根據元數據的定義,從數據源(如Hive)抽取數據,並經過MapReduce Job構建Cube,構建後的Cube保存在HBase中
在線查詢部分:用戶經過RESTful API、JDBC/ODBC等接口提交SQL,REST服務把SQL交給查詢引擎處理。查詢引擎解析SQL,生成邏輯執行計劃,以後將其轉化爲基於Cube的物理執行計劃,最後讀取預計算生成的Cube並返回結果
Apache Flink
Apache Flink是一個面向分佈式數據流處理和批量數據處理的開源計算平臺,它可以基於同一個Flink運行時提供流處理和批處理兩種類型應用的功能。區別於其餘流處理系統,Flink做爲流處理時,把輸入數據流看作是無界的,而批處理被做爲一種特殊的流處理,只是它的輸入數據流被定義爲有界的。
基於同一個Flink運行時(Flink Runtime),Flink分別提供了流處理和批處理API,爲了實現API層流與批的統一,Flink提供了一種關係型API,即Table & SQL API。
Apache HAWQ
Apache HAWQ的全稱是Hadoop With Query,是一個Hadoop原生的MPP SQL引擎。HAWQ能直接在HDFS上讀寫數據,而不須要connector,並支持ACID事務特性,其架構以下圖所示:
主要組成部分包括:
HAWQ master:負責處理客戶端提交的SQL,解析優化後向集羣Segment節點下發查詢,合併從各Segemt節點返回的結果,並返回最終結果給客戶端。HAWQ master內部由HAWQ Resource Manager,HAWQ Catalog Service,HAWQ Fault Tolerance Service,HAWQ Dispatcher等組件組成。HAWQ master還須要維護global system catalog,global system catalog是系統表的集合,其中包含了HAWQ集羣的元數據信息
HAWQ segment:集羣的計算節點,自己不存儲任何數據,全部數據都存儲在HDFS上。HAWQ master在分派SQL請求給Segment時會附帶相關的元數據信息,元數據信息包含了表的HDFS URL,Segment經過HDFS URL訪問須要處理的數據
PXF agent:PXF(Pivotal eXtension Framework)的服務。PXF是一個容許HAWQ訪問外部系統數據的可擴展框架,其中內置了訪問HDFS文件,HBase表以及Hive表的鏈接器,PXF還能夠經過和HCatalog集成來直接訪問Hive表
結束語
SQL-on-Hadoop系統通過了若干年的發展,已經有了很大的提升,可是目前各個系統仍然在不斷完善提升,例如:
執行計劃方面:更強的優化器
執行效率方面:支持code generation、vectorization等
存儲格式方面:支持更高效列存等
將來也會出現更多技術、更多系統。本文主要介紹了目前幾大開源的SQL-on-Hadoop系統及其架構,包括Hive、Spark、Presto、Drill等。
本文做者:勿煩
本文爲雲棲社區原創內容,未經容許不得轉載。