开源SQL-on-Hadoop系统一览
引言
查詢分析是大數(shù)據(jù)要解決的核心問題之一,而SQL作為查詢分析中使用最簡(jiǎn)單、最廣泛的的語言之一,必然而然的催生了許多支持在Hadoop上使用SQL的系統(tǒng),這就是所謂的SQL-on-Hadoop系統(tǒng),其中大眾熟知的Hive就是最早的SQL-on-Hadoop系統(tǒng)。
經(jīng)過若干年的發(fā)展,SQL-on-Hadoop系統(tǒng)已經(jīng)百花齊放,按照架構(gòu)劃分這些系統(tǒng)大致可以分為以下幾類:
- MapReduce架構(gòu)系統(tǒng):如Hive,這類系統(tǒng)是在MapReduce計(jì)算框架上封裝了一個(gè)SQL語義層,在運(yùn)行過程中把SQL轉(zhuǎn)換為MapReduce程序來執(zhí)行
- MPP架構(gòu)系統(tǒng):如Impala、Presto、Drill等,這類系統(tǒng)采用MPP(Massively Parallel Processing)架構(gòu),而非MapReduce
- 預(yù)計(jì)算系統(tǒng):如Druid、Kylin等,這類系統(tǒng)主要特點(diǎn)是對(duì)數(shù)據(jù)進(jìn)行預(yù)計(jì)算,并將結(jié)果保存,而在查詢時(shí)直接獲取相應(yīng)結(jié)果值
本文主要是對(duì)這些系統(tǒng)做了一個(gè)基本總結(jié),并簡(jiǎn)單介紹了一些主流系統(tǒng)的架構(gòu)以及處理流程。下表是按照時(shí)間順序,對(duì)這些系統(tǒng)的一個(gè)概述,包括技術(shù)特點(diǎn)和主導(dǎo)公司等。
| Apache Hive | 2008年進(jìn)入Apache,2010年畢業(yè) | 一款基于HDFS的MapReduce計(jì)算框架,提供類SQL的數(shù)據(jù)查詢功能,本質(zhì)是將SQL轉(zhuǎn)換為MapReduce任務(wù)運(yùn)行 | 初期由Facebook開發(fā),后被各大公司廣泛接受 |
| Apache Spark | 2010年進(jìn)入Apache,2014年畢業(yè) | 數(shù)據(jù)在內(nèi)存中以RDD(Resilient Distributed Datasets)表示,DataFrame是其核心編程抽象,同時(shí)也支持交互式查詢和流計(jì)算 | Databricks |
| Cloudera Impala | 2012年進(jìn)入Apache,2017年11月畢業(yè) | 一款使用C/C++實(shí)現(xiàn)的MPP SQL查詢引擎,使用HDFS作為存儲(chǔ),并支持列存 | Cloudera |
| Apache Drill | 2012年進(jìn)入Apache,2014年畢業(yè) | 以Google Dremel論文為基礎(chǔ),一個(gè)MPP數(shù)據(jù)查詢引擎,支持schema free的交互式數(shù)據(jù)查詢 | MapR |
| Presto | 2013年開源 | 基于內(nèi)存的計(jì)算引擎,本身并不存儲(chǔ)數(shù)據(jù),支持跨數(shù)據(jù)源的級(jí)聯(lián)查詢 | |
| Stinger Initiative | 2013年 | 對(duì)Hive的性能優(yōu)化和提升 | Hortonworks |
| Apache Phoenix | 2013年進(jìn)入Apache,2014年5月畢業(yè) | 構(gòu)建在HBase上的一個(gè)SQL層 | 初期由Salesforce開發(fā) |
| Apache Tajo | 2013年進(jìn)入Apache,2014年5月畢業(yè) | 基于Hadoop的數(shù)據(jù)倉(cāng)庫(kù)和SQL數(shù)據(jù)查詢執(zhí)行引擎 | 由Database Lab., Korea University開發(fā) |
| Apache Flink | 2014年4月進(jìn)入Apache,2014年12月畢業(yè) | 流式的數(shù)據(jù)流執(zhí)行引擎,基于流計(jì)算來模擬批計(jì)算,分別提供了流處理和批處理API | Data Artisans |
| Apache Kylin | 2014年11月進(jìn)入Apache,2015年11月畢業(yè) | 使用CUBE技術(shù)做多維數(shù)據(jù)預(yù)計(jì)算和聚合 | 初期由ebay開發(fā),現(xiàn)由Kyligence主導(dǎo) |
| Apache HAWQ | 2015年進(jìn)入Apache,2018年5月畢業(yè) | Hadoop原始大規(guī)模并行SQL分析引擎,支持ACID事物特性 | Hortonworks |
| Apache Trafodion | 2015年進(jìn)入Apache,孵化中 | 構(gòu)建在HBase上的一個(gè)SQL層 | HP實(shí)驗(yàn)室 |
Apache Hive
Apache Hive是Hadoop生態(tài)系統(tǒng)中最早的SQL引擎,它可以將結(jié)構(gòu)化數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供類SQL查詢功能。Hive本質(zhì)上是在MapReduce計(jì)算框架上封裝了一個(gè)SQL語義層,并在運(yùn)行過程中把SQL轉(zhuǎn)換為MapReduce程序來執(zhí)行。
Hive通過用戶交互接口接收SQL后,其Driver結(jié)合元數(shù)據(jù)將SQL翻譯成MapReduce程序,并提交到Hadoop中執(zhí)行,最后將執(zhí)行結(jié)果輸出,其架構(gòu)如下圖所示:
主要組成部分包括:
- user interface:即用戶接口,包含CLI(命令行),JDBC/ODBC等
- Metastore:即元數(shù)據(jù),包括表名、表的數(shù)據(jù)所在目錄等;默認(rèn)元數(shù)據(jù)存儲(chǔ)在自帶的derby數(shù)據(jù)庫(kù)中,推薦使用MySQL
-
Driver:即驅(qū)動(dòng)器,包含以下幾個(gè)組件:
- 解析器(SQL Parser):將SQL轉(zhuǎn)換成抽象語法樹(AST),并對(duì)AST進(jìn)行語法分析
- 編譯器(Compiler):將AST編譯生成邏輯執(zhí)行計(jì)劃
- 優(yōu)化器(Query Optimizer):對(duì)邏輯執(zhí)行計(jì)劃進(jìn)行優(yōu)化
- 執(zhí)行器(Execution):把邏輯執(zhí)行計(jì)劃轉(zhuǎn)換成可以運(yùn)行的物理計(jì)劃
Hive提供的類SQL查詢功能避免了開發(fā)人員書寫復(fù)雜的MapReduce程序,極大的簡(jiǎn)化了MapReduce程序的開發(fā),大大減少了相應(yīng)的學(xué)習(xí)成本。隨著技術(shù)的不斷進(jìn)步,Hive的執(zhí)行引擎也不斷發(fā)展,尤其是有了Tez之后,其性能有了很大的改進(jìn)。不過,其不足依舊很明顯,即處理速度慢,因而比較適合運(yùn)行在批處理場(chǎng)景中,而不適合交互式查詢等對(duì)時(shí)延要求高的場(chǎng)景中。
Apache Spark
Spark是一個(gè)通用的大數(shù)據(jù)計(jì)算框架,期望使用一個(gè)技術(shù)棧來解決大數(shù)據(jù)領(lǐng)域包括批處理、流計(jì)算、交互式查詢、圖計(jì)算和機(jī)器學(xué)習(xí)在內(nèi)的各種計(jì)算任務(wù),其軟件棧如下圖所示:
其中的Spark SQL組件是一個(gè)用于處理結(jié)構(gòu)化數(shù)據(jù)的組件,它吸收了一個(gè)叫Shark(Hive-on-Spark)的項(xiàng)目。Spark SQL中最重要的一個(gè)概念就是DataFrame,它是帶有Shema信息的RDD,類似于傳統(tǒng)數(shù)據(jù)庫(kù)中的二維表格。Spark SQL支持將多種外部數(shù)據(jù)源的數(shù)據(jù)轉(zhuǎn)化為DataFrame,包括Json、Parquet等,并可以通過將其注冊(cè)為臨時(shí)表,然后使用SQL來處理和分析這些數(shù)據(jù)。Spark SQL的運(yùn)行流程包含以下幾步,如圖所示:
包含以下幾個(gè)步驟:
傳統(tǒng)的MapReduce程序中Map和Reduce階段的結(jié)果都要寫磁盤,這大大降低了系統(tǒng)性能。Spark使用RDD作為基本數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)常駐內(nèi)存,所以計(jì)算速度得到了很大提高。但是當(dāng)內(nèi)存不足時(shí),其計(jì)算速度會(huì)大大降低,甚至容易出現(xiàn)OOM錯(cuò)誤。
Apache Impala
Apache Impala是一款基于HDFS/HBase的MPP查詢引擎,其架構(gòu)如下圖所示:
主要組成部分包括:
- Impalad: 即Impala Daemon(Impala守護(hù)進(jìn)程);它運(yùn)行在集群的每個(gè)node上,負(fù)責(zé)接收客戶端的查詢請(qǐng)求,對(duì)查詢進(jìn)行并行化處理。其中接收查詢請(qǐng)求的Impalad為Coordinator,Coordinator對(duì)查詢語句處理后生成執(zhí)行計(jì)劃,再把執(zhí)行計(jì)劃分發(fā)給具有相應(yīng)數(shù)據(jù)的其它Impalad執(zhí)行,其他Impalad執(zhí)行完成后,把結(jié)果發(fā)送回
Coordinator,由Coordinator構(gòu)建最終結(jié)果,并返回給客戶端。另外,Impalad進(jìn)程也會(huì)和Statusstore通信以確認(rèn)哪些Impalad是可以正常工作的 - Statestore: 負(fù)責(zé)跟蹤和檢查Impalad健康狀態(tài)的進(jìn)程,由statestored進(jìn)程表示;它負(fù)責(zé)處理Impalad的注冊(cè)訂閱,并且和各個(gè)Impalad進(jìn)程保持心跳鏈接
- CLI: 提供給用戶查詢使用的命令行工具(Impala Shell使用python實(shí)現(xiàn)),同時(shí)Impala還提供了Hue,JDBC, ODBC使用接口
Impala沒有使用MapReduce計(jì)算框架,而是使用與商用并行關(guān)系數(shù)據(jù)庫(kù)中類似的分布式查詢引擎,并且Impala的中間結(jié)果不寫入磁盤,而是通過網(wǎng)絡(luò)以流的形式傳遞,這大大降低了IO開銷,因而Impala的查詢速度非??臁5荌mpala缺點(diǎn)也很明顯,如對(duì)用戶自定義函數(shù)支持不好、不支持Transforms、不支持查詢期的容錯(cuò)等。
Apache Drill
Apache Drill是一個(gè)分布式的MPP SQL引擎,是開源版本的Google Dremel。它支持對(duì)本地文件、HDFS、HBASE等數(shù)據(jù)進(jìn)行數(shù)據(jù)查詢,也支持對(duì)如JSON等schema-free的數(shù)據(jù)進(jìn)行查詢,其架構(gòu)如下圖所示:
從上圖可以看到,Drill的核心是DrillBit,它主要負(fù)責(zé)接收客戶端的請(qǐng)求,處理查詢,并將結(jié)果返回給客戶端。 Drill的查詢流程包括以下步驟:
Presto
Presto是一個(gè)分布式的MPP查詢引擎,支持多種數(shù)據(jù)源,包括Hive、RDBMS、Redis等,并且可以跨數(shù)據(jù)源查詢。Presto的基本架構(gòu)如下圖所示:
主要組成部分包括:
- coodinator:用于解析查詢SQL,生成執(zhí)行計(jì)劃,并分發(fā)給worker執(zhí)行
- discovery server:worker上線后,向discovery server注冊(cè)。coodinator分發(fā)任務(wù)前,需要向discovery server獲取可以正常工作worker列表
- worker:具體執(zhí)行任務(wù)的工作節(jié)點(diǎn)
Apache Phoenix
Apache Phoenix是一個(gè)運(yùn)行在HBase上的SQL框架,其本質(zhì)是用Java寫的基于JDBC API操作HBase的開源SQL引擎,通過Phoenix可以像使用MySQL等關(guān)系型數(shù)據(jù)庫(kù)一樣操作HBase中的表。Apache Phoenix支持ACID事務(wù)功能的標(biāo)準(zhǔn)SQL,它將SQL編譯成原生HBase的scan語句,其架構(gòu)如下圖所示:
從上圖可以看到:
- Phoenix的JDBC driver是在HBase的client端
- Phoenix在HBase的RegionServer上
Apache Kylin
Apache Kylin是一個(gè)開源的分布式分析引擎,提供Hadoop/Spark之上的SQL查詢接口及多維分析(OLAP)能力。Kylin的核心是預(yù)計(jì)算,即對(duì)可能用到的度量進(jìn)行預(yù)計(jì)算,并將結(jié)果保存為Cube以便查詢時(shí)直接訪問。Kylin的架構(gòu)如下圖所示:
主要組成部分包括:
- 離線構(gòu)建部分:根據(jù)元數(shù)據(jù)的定義,從數(shù)據(jù)源(如Hive)抽取數(shù)據(jù),并通過MapReduce Job構(gòu)建Cube,構(gòu)建后的Cube保存在HBase中
- 在線查詢部分:用戶通過RESTful API、JDBC/ODBC等接口提交SQL,REST服務(wù)把SQL交給查詢引擎處理。查詢引擎解析SQL,生成邏輯執(zhí)行計(jì)劃,之后將其轉(zhuǎn)化為基于Cube的物理執(zhí)行計(jì)劃,最后讀取預(yù)計(jì)算生成的Cube并返回結(jié)果
Apache Flink
Apache Flink是一個(gè)面向分布式數(shù)據(jù)流處理和批量數(shù)據(jù)處理的開源計(jì)算平臺(tái),它能夠基于同一個(gè)Flink運(yùn)行時(shí)提供流處理和批處理兩種類型應(yīng)用的功能。區(qū)別于其他流處理系統(tǒng),Flink作為流處理時(shí),把輸入數(shù)據(jù)流看做是無界的,而批處理被作為一種特殊的流處理,只是它的輸入數(shù)據(jù)流被定義為有界的。
基于同一個(gè)Flink運(yùn)行時(shí)(Flink Runtime),Flink分別提供了流處理和批處理API,為了實(shí)現(xiàn)API層流與批的統(tǒng)一,Flink提供了一種關(guān)系型API,即Table & SQL API。
Apache HAWQ
Apache HAWQ的全稱是Hadoop With Query,是一個(gè)Hadoop原生的MPP SQL引擎。HAWQ能直接在HDFS上讀寫數(shù)據(jù),而不需要connector,并支持ACID事務(wù)特性,其架構(gòu)如下圖所示:
主要組成部分包括:
- HAWQ master:負(fù)責(zé)處理客戶端提交的SQL,解析優(yōu)化后向集群Segment節(jié)點(diǎn)下發(fā)查詢,合并從各Segemt節(jié)點(diǎn)返回的結(jié)果,并返回最終結(jié)果給客戶端。HAWQ master內(nèi)部由HAWQ Resource Manager,HAWQ Catalog Service,HAWQ Fault Tolerance Service,HAWQ Dispatcher等組件組成。HAWQ master還需要維護(hù)global system catalog,global system catalog是系統(tǒng)表的集合,其中包含了HAWQ集群的元數(shù)據(jù)信息
- HAWQ segment:集群的計(jì)算節(jié)點(diǎn),本身不存儲(chǔ)任何數(shù)據(jù),所有數(shù)據(jù)都存儲(chǔ)在HDFS上。HAWQ master在分派SQL請(qǐng)求給Segment時(shí)會(huì)附帶相關(guān)的元數(shù)據(jù)信息,元數(shù)據(jù)信息包含了表的HDFS URL,Segment通過HDFS URL訪問需要處理的數(shù)據(jù)
- PXF agent:PXF(Pivotal eXtension Framework)的服務(wù)。PXF是一個(gè)允許HAWQ訪問外部系統(tǒng)數(shù)據(jù)的可擴(kuò)展框架,其中內(nèi)置了訪問HDFS文件,HBase表以及Hive表的連接器,PXF還可以通過和HCatalog集成來直接訪問Hive表
結(jié)束語
SQL-on-Hadoop系統(tǒng)經(jīng)過了若干年的發(fā)展,已經(jīng)有了很大的提高,但是目前各個(gè)系統(tǒng)仍然在不斷完善提高,例如:
- 執(zhí)行計(jì)劃方面:更強(qiáng)的優(yōu)化器
- 執(zhí)行效率方面:支持code generation、vectorization等
- 存儲(chǔ)格式方面:支持更高效列存等
未來也會(huì)出現(xiàn)更多技術(shù)、更多系統(tǒng)。本文主要介紹了目前幾大開源的SQL-on-Hadoop系統(tǒng)及其架構(gòu),包括Hive、Spark、Presto、Drill等。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的开源SQL-on-Hadoop系统一览的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云栖专辑 | 阿里开发者们的第6个感悟:
- 下一篇: 在 Ali Kubernetes 系统中