开源SQL-on-Hadoop系统一览
引言
查詢分析是大數據要解決的核心問題之一,而SQL作為查詢分析中使用最簡單、最廣泛的的語言之一,必然而然的催生了許多支持在Hadoop上使用SQL的系統,這就是所謂的SQL-on-Hadoop系統,其中大眾熟知的Hive就是最早的SQL-on-Hadoop系統。
經過若干年的發展,SQL-on-Hadoop系統已經百花齊放,按照架構劃分這些系統大致可以分為以下幾類:
- MapReduce架構系統:如Hive,這類系統是在MapReduce計算框架上封裝了一個SQL語義層,在運行過程中把SQL轉換為MapReduce程序來執行
- MPP架構系統:如Impala、Presto、Drill等,這類系統采用MPP(Massively Parallel Processing)架構,而非MapReduce
- 預計算系統:如Druid、Kylin等,這類系統主要特點是對數據進行預計算,并將結果保存,而在查詢時直接獲取相應結果值
本文主要是對這些系統做了一個基本總結,并簡單介紹了一些主流系統的架構以及處理流程。下表是按照時間順序,對這些系統的一個概述,包括技術特點和主導公司等。
| Apache Hive | 2008年進入Apache,2010年畢業 | 一款基于HDFS的MapReduce計算框架,提供類SQL的數據查詢功能,本質是將SQL轉換為MapReduce任務運行 | 初期由Facebook開發,后被各大公司廣泛接受 |
| Apache Spark | 2010年進入Apache,2014年畢業 | 數據在內存中以RDD(Resilient Distributed Datasets)表示,DataFrame是其核心編程抽象,同時也支持交互式查詢和流計算 | Databricks |
| Cloudera Impala | 2012年進入Apache,2017年11月畢業 | 一款使用C/C++實現的MPP SQL查詢引擎,使用HDFS作為存儲,并支持列存 | Cloudera |
| Apache Drill | 2012年進入Apache,2014年畢業 | 以Google Dremel論文為基礎,一個MPP數據查詢引擎,支持schema free的交互式數據查詢 | MapR |
| Presto | 2013年開源 | 基于內存的計算引擎,本身并不存儲數據,支持跨數據源的級聯查詢 | |
| Stinger Initiative | 2013年 | 對Hive的性能優化和提升 | Hortonworks |
| Apache Phoenix | 2013年進入Apache,2014年5月畢業 | 構建在HBase上的一個SQL層 | 初期由Salesforce開發 |
| Apache Tajo | 2013年進入Apache,2014年5月畢業 | 基于Hadoop的數據倉庫和SQL數據查詢執行引擎 | 由Database Lab., Korea University開發 |
| Apache Flink | 2014年4月進入Apache,2014年12月畢業 | 流式的數據流執行引擎,基于流計算來模擬批計算,分別提供了流處理和批處理API | Data Artisans |
| Apache Kylin | 2014年11月進入Apache,2015年11月畢業 | 使用CUBE技術做多維數據預計算和聚合 | 初期由ebay開發,現由Kyligence主導 |
| Apache HAWQ | 2015年進入Apache,2018年5月畢業 | Hadoop原始大規模并行SQL分析引擎,支持ACID事物特性 | Hortonworks |
| Apache Trafodion | 2015年進入Apache,孵化中 | 構建在HBase上的一個SQL層 | HP實驗室 |
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的運行流程包含以下幾步,如圖所示:
包含以下幾個步驟:
傳統的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的查詢流程包括以下步驟:
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等。
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的开源SQL-on-Hadoop系统一览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云栖专辑 | 阿里开发者们的第6个感悟:
- 下一篇: 2018最佳GAN论文回顾(上)