新一代資料倉庫HAWQ的體系架構
從首次提出到發展至今,資料倉庫大概可以分為三個階段,第一階段是採用共享架構的傳統資料倉庫,這類數倉主要是面向傳統的BI分析,可擴充套件性較差,大概是十幾個節點;第二階段是無共享架構的MPP,這類數倉主要是面向有複雜需求的傳統BI分析,典型的代表有Teradata、Vertica、Greenplum等等;前兩個階段的資料倉庫架構都存在缺乏彈性、不易調整、難以實現秒級擴容等問題,而新一代資料倉庫克服了這些困難,實現了彈性伸縮和靈活配置。
新一代資料倉庫主要是面向大資料和人工智慧,支援工業標準的X86伺服器,可擴充套件到上千個節點。如果再進一步細分的話,新一代資料倉庫可分為SQL on Hadoop、SQL on Object Store和Hybrid。HAWQ可以歸類到Hybrid裡面。下面介紹一下HAWQ的體系架構。
體系構架
概覽
圖1給出了一個典型的HAWQ叢集的主要元件。其中有幾個Master節點:包括HAWQ master節點,HDFS master節點NameNode,YARN master節點ResourceManager。現在HAWQ元資料服務在HAWQ master節點裡面,未來版本會成為單獨的服務。其他節點為Slave節點。每個Slave節點上部署有HDFS DataNode,YARN NodeManager以及一個HAWQ Segment。其中YARN是可選元件,如果沒有YARN的話,HAWQ會使用自己內建的資源管理器。HAWQ Segment在執行查詢的時候會啟動多個QE (Query Executor, 查詢執行器)。查詢執行器執行在資源容器裡面。在這個架構下,節點可以動態的加入叢集,並且不需要資料重新分佈。當一個節點加入叢集時,他會向HAWQ Master節點發送心跳,然後就可以接收未來查詢了。
圖1. HAWQ體系架構
圖2是HAWQ內部架構圖。可以看到在HAWQ master節點內部有如下幾個重要元件:查詢解析器(Parser/Analyzer),優化器,資源管理器,資源代理,容錯服務,查詢派遣器,元資料服務。在Slave節點上安裝有一個物理Segment,在查詢執行時,針對一個查詢,彈性執行引擎會啟動多個虛擬Segment同時執行查詢,節點間資料交換通過Interconnect(高速網際網路絡)進行。如果一個查詢啟動了1000個虛擬Segment,意思是這個查詢被均勻的分成了1000份任務,這些任務會並行執行。所以說虛擬Segment數其實表明了查詢的並行度。查詢的並行度是由彈性執行引擎根據查詢大小以及當前資源使用情況動態確定的。下面我逐個來解釋這些元件的作用以及它們之間的關係:
圖2: HAWQ內部架構
查詢解析器:負責解析查詢,並檢查語法及語義。最終生成查詢樹傳遞給優化器。
優化器:負責接受查詢樹,生成查詢計劃。針對一個查詢,可能有數億個可能的等價的查詢計劃,但執行效能差別很大。優化器的作用是找出優化的查詢計劃。
資源管理器:資源管理器通過資源代理向全域性資源管理器(比如YARN)動態申請資源並快取資源。在不需要的時候返回資源。我們快取資源的主要原因是減少HAWQ與全域性資源管理器之間的互動代價。HAWQ支援毫秒級查詢。如果每一個小的查詢都去向資源管理器申請資源,這樣的話,效能會受到影響。資源管理器同時需要保證查詢不使用超過分配給該查詢的資源,否則查詢之間會相互影響,可能導致系統整體不可用。
HDFS元資料快取:用於HAWQ確定哪些Segment掃描表的哪些部分。HAWQ需要把計算派遣到資料所在的地方,所以我們需要匹配計算和資料的區域性性。這些需要HDFS塊的位置資訊。位置資訊儲存在HDFS NameNode上。每個查詢都訪問HDFS NameNode會造成NameNode的瓶頸。所以我們在HAWQ Master節點上建立了HDFS元資料快取。
容錯服務:負責檢測哪些節點可用,哪些節點不可用。不可用的機器會被排除出資源池。
查詢派遣器:優化器優化完查詢以後,查詢派遣器派遣計劃到各個節點上執行,並協調查詢執行的整個過程。查詢派遣器是整個並行系統的粘合劑。
元資料服務:負責儲存HAWQ的各種元資料,包括資料庫和表資訊,以及訪問許可權資訊等。另外,元資料服務也是實現分散式事務的關鍵。
高速網際網路絡:負責在節點之間傳輸資料。使用軟體實現,基於UDP協議。UDP協議無需建立連線,從而可以避免TCP高併發連線數的限制。
查詢執行流程
圖3. 查詢執行流程
使用者通過JDBC/ODBC提交查詢之後,查詢解析器解析查詢得到查詢樹,然後優化器根據查詢樹生成查詢計劃,派遣器和資源管理器互動得到資源,分解查詢計劃,然後派遣計劃到Segment的執行器上面執行。最終結果會傳回給使用者。
彈性排程執行
彈性執行引擎有幾個關鍵設計點:儲存和計算的完全分離,無狀態Segment以及如何使用資源。儲存和計算的分離使得我們可以動態的啟動任意多個虛擬Segment來執行查詢。無狀態Segment使得叢集更容易擴充套件。要想保證大規模叢集的狀態一致性是比較困難的問題,所以我們採用了無狀態的Segment。如何使用資源包括如何根據查詢的代價申請多少資源,如何有效的使用這些資源以及如何使得資料區域性性最優。HAWQ內部針對每一個部分都進行了優化的設計。
極速執行器
執行器是資料庫最核心的部件之一,Oushu Database對執行器進行了完全重新設計,充分利用了最新CPU的每一個特性,比如SIMD指令等,可以做到效能的極致。
高速網際網路絡
高速網際網路絡的作用是在多個節點之間交換大量資料。HAWQ高速網際網路絡基於UDP協議。大家可能會疑問為什麼HAWQ不使用TCP。其實HAWQ同時支援TCP和UDP兩種協議,TCP協議實現早於UDP協議。但是因為我們遇到了TCP不能很好解決的高連線數併發問題,我們才開發了基於UDP的協議。圖4展示了一個高速網際網路絡的例子。
圖4. 高速網際網路絡
例子中各個節點上的執行器程序形成了一個數據交換的流水線。假設每個節點上有1000個程序。有1000個節點,這些程序需要相互互動,每個節點上就會有上百萬個連線。TCP是沒辦法高效地支援這麼多的連線數的。所以我們開發了基於UDP的互聯協議。針對UDP傳輸,作業系統是不能保證可靠性的,並且不能保證是有序傳遞的。所以我們的設計需要保證和支援如下特性:
可靠性:能夠保證在丟包的情況下,重傳丟失的包
有序性:保證包傳遞給接受者的最終有序性
流量控制:如果不控制傳送者的速度,接收者可能會被淹沒,甚至會導致整個網路效能急劇下降
效能和可擴充套件性:效能和可擴充套件性是我們需要解決TCP問題的初衷
可支援多種平臺
事務管理
事務是資料管理系統一個非常重要的屬性。大部分Hadoop裡面的SQL引擎不支援事務。讓程式設計師自己保證事務和資料的一致性是非常困難的事。 HAWQ支援事務的所有ACID屬性,支援Snapshot Isolation。事務發生由Master節點協調和控制。採用的是泳道模型。併發插入時每個併發會使用各自的泳道,互不衝突。在事務提交的時候通過記錄檔案邏輯長度的方式來保證一致性。如果事務失敗的時候,需要回滾,刪除檔案末尾的垃圾資料。起初HDFS是不支援truncate的,現在HDFS剛支援的truncate功能是根據HAWQ的需求做出的。
資源管理器
HAWQ支援三級資源管理:
全域性資源管理:可以整合YARN,和其他系統共享叢集資源。
HAWQ內部資源管理:可以支援查詢,使用者等級別的資源管理。
操作符級別資源管理:可以針對操作符分配和強制資源使用。
現在HAWQ支援多極資源佇列。可以通過DDL方便的定義和修改資源佇列。下面是HAWQ資源管理器的主要架構圖(圖5):
圖5. 資源管理器
資源管理器中的各個元件作用如下:
請求處理器:接收查詢派遣器程序的資源請求。
資源分配器:負責資源的分配。
資源池:儲存所有資源的現有狀態。
策略儲存:儲存所有的分配策略,將來會做到策略可定製。
資源代理:負責與全域性資源管理器互動。
儲存模組
HAWQ支援多種內部優化的儲存格式,比如AO和Parquet。提供MapReduceInputFormat,可以供外部系統直接訪問。其他各種儲存格式通過擴充套件框架訪問。針對使用者專有格式,使用者可以自己開發外掛。同時支援各種壓縮,多極分割槽等各種功能。