Apache HAWQ大規(guī)模并行 SQL 分析處理引擎
HAWQ 是一個Hadoop原生大規(guī)模并行SQL分析引擎,針對的是分析性應(yīng)用。和其他關(guān)系型數(shù)據(jù)庫類似,接受SQL,返回結(jié)果集。
Apache HAWQ 具有大規(guī)模并行處理很多傳統(tǒng)數(shù)據(jù)庫以及其他數(shù)據(jù)庫沒有的特性及功能。主要如下:
-
對標準的完善支持:ANSI SQL標準,OLAP擴展,標準JDBC/ODBC支持,比其他Hadoop SQL引擎都要完善。
-
具有MPP(大規(guī)模并行處理系統(tǒng))的性能,比其他Hadoop里面的SQL引擎快數(shù)倍。
-
具有非常成熟的并行優(yōu)化器。優(yōu)化器是并行SQL引擎的重要組成部分,對性能影響很多,尤其是對復(fù)雜查詢。
-
支持ACID事務(wù)特性:這是很多現(xiàn)有基于Hadoop的SQL引擎做不到的,對保證數(shù)據(jù)一致性很重要。
-
動態(tài)數(shù)據(jù)流引擎:基于UDP的高速互聯(lián)網(wǎng)絡(luò)。
-
彈性執(zhí)行引擎:可以根據(jù)查詢大小來決定執(zhí)行查詢使用的節(jié)點及Segment個數(shù)。
-
支持多種分區(qū)方法及多級分區(qū):比如List分區(qū)和Range分區(qū)。分區(qū)表對性能有很大幫助,比如你只想訪問最近一個月的數(shù)據(jù),查詢只需要掃描最近一個月數(shù)據(jù)所在分區(qū)。
-
支持多種壓縮方法:snappy,gzip,quicklz,RLE等。
-
多種UDF(用戶自定義函數(shù))語言支持:java, python, c/c++, perl, R等。
-
動態(tài)擴容:動態(tài)按需擴容,按照存儲大小或者計算需求,秒級添加節(jié)點。
-
多級資源或負載管理:和外部資源管理器YARN集成;可以管理CPU,Memory資源等;支持多級資源隊列;方便的DDL管理接口。
-
支持訪問任何HDFS及其他系統(tǒng)的數(shù)據(jù):各種HDFS格式(文本,SequenceFile,Avro,Parquet等等)以及其他外部系統(tǒng)(HBase等),并且用戶自己可以開發(fā)插件來訪問新的數(shù)據(jù)源。
-
原生的機器學(xué)習(xí)數(shù)據(jù)挖掘庫MADLib支持:易于使用及高性能。
-
與Hadoop系統(tǒng)無縫集成:存儲、資源、安裝部署(Ambari)、數(shù)據(jù)格式、訪問等。
-
完善的安全及權(quán)限管理:kerberos;數(shù)據(jù)庫,表等各個級別的授權(quán)管理。
-
支持多種第三方工具:比如Tableau,SAS,較新的Apache Zeppelin等。
-
支持對HDFS和YARN的快速訪問庫:libhdfs3和libyarn(其他項目也可以使用)。
-
支持在本地、虛擬化環(huán)境或者在云端部署。
HAWQ 是原生 Hadoop SQL 引擎中“原生”的意思,“原生”主要體現(xiàn)在如下幾個方面:
-
數(shù)據(jù)都存儲在HDFS上,不需要使用connector模式。
-
高可擴展性:和其他Hadoop組件一樣,高可擴展。并且具有高性能。
-
原生的代碼存?。汉推渌鸋adoop項目一樣。HAWQ是Apache項目。用戶可以自由的下載,使用和做貢獻。區(qū)別與其他的偽開源軟件。
-
透明性:用Apache的方式開發(fā)軟件。所有功能的開發(fā)及討論都是公開的。用戶可以自由參與。
-
原生的管理:可以通過Ambari部署、資源可以從YARN分配,與其它Hadoop組件可以運行在同一個集群。
下圖是一個典型的HAWQ集群的主要組件。其中有幾個Master節(jié)點:包括HAWQ master節(jié)點,HDFS master節(jié)點NameNode,YARN master節(jié)點ResourceManager。現(xiàn)在HAWQ元數(shù)據(jù)服務(wù)在HAWQ master節(jié)點里面,將來的版本會成為單獨的服務(wù)。其他節(jié)點為Slave節(jié)點。每個Slave節(jié)點上部署有HDFS DataNode,YARN NodeManager以及一個HAWQ Segment。HAWQ Segment在執(zhí)行查詢的時候會啟動多個QE (Query Executor, 查詢執(zhí)行器)。查詢執(zhí)行器運行在資源容器里面。
軟件內(nèi)部架構(gòu):
可以看到在HAWQ master節(jié)點內(nèi)部有如下幾個重要組件:查詢解析器(Parser/Analyzer),優(yōu)化器,資源管理器,資源代理,HDFS元數(shù)據(jù)緩存,容錯服務(wù),查詢派遣器,元數(shù)據(jù)服務(wù)。在Slave節(jié)點上安裝有一個物理Segment,在查詢執(zhí)行時,針對一個查詢,彈性執(zhí)行引擎會啟動多個虛擬Segment同時執(zhí)行查詢,節(jié)點間數(shù)據(jù)交換通過Interconnect(高速互聯(lián)網(wǎng)絡(luò))進行。如果一個查詢啟動了1000個虛擬Segment,意思是這個查詢被均勻的分成了1000份任務(wù),這些任務(wù)會并行執(zhí)行。所以說虛擬Segment數(shù)其實表明了查詢的并行度。查詢的并行度是由彈性執(zhí)行引擎根據(jù)查詢大小以及當前資源使用情況動態(tài)確定的。下面我逐個來解釋這些組件的作用以及它們之間的關(guān)系:
-
查詢解析器:負責(zé)解析查詢,并檢查語法及語義。最終生成查詢樹傳遞給優(yōu)化器。
-
優(yōu)化器:負責(zé)接受查詢樹,生成查詢計劃。針對一個查詢,可能有數(shù)億個可能的等價的查詢計劃,但執(zhí)行性能差別很大。優(yōu)化器的作用是找出優(yōu)化的查詢計劃。
-
資源管理器:資源管理器通過資源代理向全局資源管理器(比如YARN)動態(tài)申請資源。并緩存資源。在不需要的時候返回資源。我們緩存資源的主要原因是減少HAWQ與全局資源管理器之間的交互代價。HAWQ支持毫秒級查詢。如果每一個小的查詢都去向資源管理器申請資源,這樣的話,性能會受到影響。資源管理器同時需要保證查詢不使用超過分配給該查詢的資源,否則查詢之間會相互影響,可能導(dǎo)致系統(tǒng)整體不可用。
-
HDFS元數(shù)據(jù)緩存:用于HAWQ確定哪些Segment掃描表的哪些部分。HAWQ是把計算派遣到數(shù)據(jù)所在的地方。所以我們需要匹配計算和數(shù)據(jù)的局部性。這些需要HDFS塊的位置信息。位置信息存儲在HDFS NameNode上。每個查詢都訪問HDFS NameNode會造成NameNode的瓶頸。所以我們在HAWQ Master節(jié)點上建立了HDFS元數(shù)據(jù)緩存。
-
容錯服務(wù):負責(zé)檢測哪些節(jié)點可用,哪些節(jié)點不可用。不可用的機器會被排除出資源池。
-
查詢派遣器:優(yōu)化器優(yōu)化完查詢以后,查詢派遣器派遣計劃到各個節(jié)點上執(zhí)行,并協(xié)調(diào)查詢執(zhí)行的整個過程。查詢派遣器是整個并行系統(tǒng)的粘合劑。
-
元數(shù)據(jù)服務(wù):負責(zé)存儲HAWQ的各種元數(shù)據(jù),包括數(shù)據(jù)庫和表信息,以及訪問權(quán)限信息等。另外,元數(shù)據(jù)服務(wù)也是實現(xiàn)分布式事務(wù)的關(guān)鍵。
-
高速互聯(lián)網(wǎng)絡(luò):負責(zé)在節(jié)點之間傳輸數(shù)據(jù)。軟件實現(xiàn),基于UDP。
查詢的主要流程:
用戶通過JDBC/ODBC提交查詢之后,查詢解析器得到查詢樹,然后優(yōu)化器根據(jù)查詢樹生成查詢計劃,派遣器和資源管理器打交道得到資源,分解查詢計劃,然后派遣計劃到Segment的執(zhí)行器上面執(zhí)行。最終結(jié)果會傳回給用戶。
并行查詢計劃示例:
這個查詢包含一個連接,一個表達式和一個聚集。圖中有兩個查詢計劃。簡單來看,并行查詢計劃和串行查詢計劃最不同的是多了一些Motion操作符。Motion負責(zé)在節(jié)點之間交換數(shù)據(jù)。底層是通過高速互聯(lián)網(wǎng)絡(luò)實現(xiàn)的。我們可以看到這里有三種Motion:
-
Redistribution Motion: 負責(zé)按照hash鍵值重新分布數(shù)據(jù)
-
Broadcast Motion: 負責(zé)廣播數(shù)據(jù)
-
Gather Motion: 負責(zé)搜集數(shù)據(jù)到一起。
左邊的查詢計劃表示了如果表lineitem和orders都使用了連接鍵進行分布的情況。在這個例子中,lineitem按照l_orderkey進行hash分布,orders表按照o_orderkey進行分布。這樣的話兩個表做連接的時候是不需要進行重新分布的。右邊的查詢計劃表示了一個需要重新分布數(shù)據(jù)的例子。該查詢計劃和左邊的查詢計劃相比多了一個Motion節(jié)點。
更詳細的介紹請看 http://www.36dsj.com/archives/36776
