1. 程式人生 > >雲時代大資料管理引擎HAWQ++

雲時代大資料管理引擎HAWQ++

HAWQ,取自Hadoop With Query,這是一款原生Hadoop並行SQL引擎。同時作為一款面向企業的分析型資料庫HAWQ有很多優良的特性,例如它完整相容ANSI-SQL標準語法, 支援標準JDBC/ODBC連線,支援ACID事務特性,高效能,擁有比傳統MPP資料庫更先進的彈性執行引擎,可以秒級動態加減節點,擁有各種容錯機制,支援多級資源和負載管理,提供Hadoop上PB級資料高效能互動式查詢能力,並且提供對主要BI工具的描述性分析支援,以及支援預測型分析的機器學習庫。

目前HAWQ屬於Apache的孵化專案,即將成為Apache頂級專案。由HAWQ創始團隊成立的偶數科技推出的HAWQ++則是基於Apache HAWQ的增強企業版。

HAWQ++體系架構

HAWQ++是典型的主從架構。其中有幾個Master節點:HAWQ++ master節點,HDFS master節點NameNode,YARN master節點ResourceManager。現階段HAWQ++元資料服務還整合在HAWQ++ master節點裡面,未來會獨立開來成為單獨的Catalog Service。將元資料獨立會帶來很多的好處,一方面可以將HAWQ++元資料與Hadoop叢集元資料進行融合,另一方面可以不再區分HAWQ++ master/slave角色,任意節點都可以接收查詢處理查詢,更好地實現負載均衡。

HAWQ++每個Slave節點上都部署有一個HDFS DataNode,一個YARN NodeManager以及一個HAWQ++ Segment。其中YARN是可選元件。如果沒有YARN的話,HAWQ++會使用自己內建的資源管理器。HAWQ++ Segment在執行查詢的時候會啟動多個QE(Query Executor,查詢執行器)。查詢執行器執行在資源容器裡。在這個架構下,節點可以動態的加入叢集,並且不需要資料重分佈。當一個節點加入叢集時,它會向HAWQ++ Master節點發送心跳,然後就可以接收未來查詢了。

圖片描述
圖1 HAWQ++體系架構

HAWQ++內部架構

圖2是HAWQ++內部架構圖。可以看到在HAWQ++ Master節點內部有如下重要元件:查詢解析器,優化器,資源代理,資源管理器,HDFS元資料快取,容錯服務,查詢派遣器和元資料服務。

在Slave節點上安裝有一個物理Segment,在查詢執行時,針對一個查詢,彈性執行引擎會啟動多個虛擬Segment同時執行查詢,節點間資料交換通過Interconnect(高速網際網路絡)進行。如果一個查詢啟動了1000個虛擬Segment,意思是這個查詢被均勻的分成了1000份任務,這些任務會並行執行。所以說虛擬Segment數其實表明了查詢的並行度。查詢的並行度是由彈性執行引擎根據查詢大小以及當前資源使用情況動態確定的。這裡簡單說一下幾個元件的作用。Parser做詞法語法分析,生成一棵Parse Tree,交給Analyzer做語義分析生成一棵Query Tree,再經過基於規則系統的Rewriter將一棵Query Tree可能改寫成Query Tree List,交給優化器做邏輯優化和基於cost的物理優化,生成優化的並行Plan。資源管理器通過資源代理向全域性資源管理器(比如YARN)動態申請資源並快取資源,在不需要的時候返回資源。HDFS元資料快取用於確定HAWQ++哪些Segment掃描表的哪些部分。因為HAWQ++的計算和資料是完全分離的,所以需要data locality資訊把計算派遣到資料所在的地方。如果每個查詢都去訪問NameNode獲取位置資訊會造成NameNode的瓶頸,所以建立了元資料快取。容錯服務負責檢測哪些節點可用,哪些節點不可用。不可用的機器會被排除出資源池。優化完的Plan由查詢派遣器傳送到各個節點上執行,並協調查詢執行的全過程。元資料服務負責儲存HAWQ++的各種元資料,包括資料庫和表資訊,以及訪問許可權等等。高速網際網路絡負責在各節點間傳輸資料,預設基於UDP協議。UDP協議不需要建立連線,可以避免TCP高併發連線數的限制。HAWQ++通過libhdfs3模組訪問HDFS。libhdfs3是Hadoop Native的C/C++介面,相比JNI的介面具有部署方便,消耗資源少和高效能的優勢。

圖片描述
圖2 HAWQ++內部架構

HAWQ++並行優化器

接下來具體解釋一下HAWQ++並行優化器這個模組,因為在一款資料庫系統裡優化器在很大程度上決定了SQL執行效能的好壞。HAWQ++原生優化器是在PostgresSQL優化器的基礎上開發的,簡單來說就是在pg生成的序列plan上插入了Motion的操作。Motion代表資料的移動,底層是通過高速網際網路絡實現的。基於插入的Motion,plan被切割成若干個Slice。同一個Slice在不同節點上可以並行執行。

Motion一共有三類:1.Redistribute Motion,負責按照hash鍵值重新分佈資料;2.Broadcast Motion,負責廣播資料;3.Gather Motion,負責蒐集資料到一起。

圖3中左邊的查詢計劃表示了一個不需要重新分佈資料的例子,因為表lineitem和orders都使用了連線鍵進行分佈。而如果這兩張表都是隨機分佈,那麼就會生成右邊的查詢計劃,和左邊查詢計劃相比多了一個Redistribute Motion的節點。

可能有些人會有疑問,HAWQ++的資料儲存在HDFS上,如果遇到HDFS加減節點某個Datanode上的block可能會被rebalance到其他Datanode上,那麼對於hash分佈的表不做Redistribute Motion怎麼能夠直接做HashJoin?原因在於對於hash分佈的表HAWQ++有維護QE和寫入檔案的對映關係,所以即便該檔案某個block不在本地了,那麼影響的也只是對於該block的本地讀還是遠端讀,和是否需要做Redistribute Motion是沒有關係的。另外基於cost的物理優化的輸入資料來源於統計資訊,因此預先通過analyze命令收集表的統計資訊可以幫助優化器產生更為優化的Plan。

圖片描述
圖3 並行查詢計劃

HAWQ++查詢處理流程

圖4展示了圖3中右邊查詢計劃的處理流程。HAWQ++的Master節點收到客戶端的連線請求會啟動QD(Query Dispatcher,查詢派遣器),進入詞法分析,語法分析,語義分析,優化器生成並行的Plan,再根據查詢資料量大小以及當前資源使用情況,結合datalocality的資訊,計算出需要啟動多少個virtual segment以及在哪些segment節點上啟動這些VSEG。接著dispatcher模組會通過libpq協議連線這些segment節點啟動QE,同時把並行plan做序列化經過壓縮dispatch過去。VSEG是一個邏輯的概念,如圖4中包含任意一組分別執行slice1和slice2的QE程序。同一個slice在所有VSEG上的QE程序集合我們稱為一個gang。每一個QE收到屬於自己的slice構建一棵查詢執行器樹,樹中每一個節點稱做一個operator,對應各自的執行器節點實現邏輯。

HAWQ++整個執行流程是Pipeline的模式,從上往下pull資料。Gang與gang之間的slice通過Motion傳輸資料,最終所有資料通過Gather Motion彙集到Master節點上返回給客戶端。

圖片描述
圖4 查詢處理流程

HAWQ++彈性執行引擎

HAWQ++彈性執行引擎是區別於傳統MPP資料庫的關鍵技術。針對傳統MPP資料庫,比如Greenplum Database,因為Segment配置死板,SQL計算執行往往必須調動所有叢集節點,造成資源浪費,約束SQL併發能力。每個節點又有各自獨佔的目錄和資料,對每個節點的可用性有比較嚴格的要求,擴充套件複雜。而HAWQ++引入的彈性執行引擎通過儲存和計算的完全分離使得我們可以啟動任意多個虛擬Segment來執行查詢。每一個Segment都是無狀態的,元資料和事務管理在Master節點實現,因此加入叢集的Segment節點無需狀態同步,使用者可根據需要動態加減節點。

針對每一條具體的查詢,根據使用者配置、SQL特徵以及實時資料庫運轉狀態動態決定SQL執行的計算併發度,動態分配使用健康低負載節點。同時根據表資料塊分佈動態分配IO任務到並行VSEG上,實現最優本地讀取比例,保障最優SQL執行效能。

HAWQ++可插拔外部儲存

HAWQ++可插拔外部儲存基於增強版的外部表讀寫框架開發完成,通過新框架HAWQ++可以更加高效地訪問更多型別外部儲存,可以實現可插拔檔案系統,比如S3,Ceph等,以及可插拔檔案格式,比如ORC,Parquet等。同內部表一樣,HAWQ++可以根據查詢資料量大小和資料庫資源利用率等動態調整叢集中外部表讀寫併發數,根據資料分佈選擇最優計算節點,從而達到優化和靈活控制外部表訪問效能的效果。

相比於Apache HAWQ原有的外部資料訪問方案PXF,可插拔外部儲存避免了資料傳輸路徑中的多次資料轉換,打破了通過固有並行度提供外部代理的方式,給使用者提供了更簡單更有效的資料匯入匯出方案,而且效能高數倍。

HAWQ++展望

目前HAWQ++還在持續不斷的開發過程當中,在不久的將來會推出高效能執行引擎以及新增update/delete 功能,成為雲時代大資料管理引擎當之無愧的領跑者。

作者:陶徵霖,浙江大學本碩畢業,先後就職於Oracle,EMC,Pivotal和北京偶數科技有限公司。一直從事資料庫相關領域的開發研究工作。隸屬於HAWQ核心團隊成員, 參與了HAWQ 1.X ~ 2.0的核心研發工作,後任Apache HAWQ Committer和PMC成員。現就職於創業型公司北京偶數科技有限公司,負責設計研發高效能HAWQ++大資料管理引擎。
本文系陶徵霖老師在CCTC 2017大資料峰會上所做分享內容,點此下載演講PPT。

更多精彩,歡迎關注CSDN大資料公眾號!

圖片描述