1. 程式人生 > >HAWQ技術解析(三) —— 基本架構

HAWQ技術解析(三) —— 基本架構

        HAWQ是一個Hadoop原生的SQL查詢引擎,它結合了MPP資料庫的關鍵技術和Hadoop的可擴充套件性。HAWQ在原生的HDFS上讀寫資料,MPP架構使HAWQ表現出超越其它SQL on Hadoop解決方案的查詢效能,Hadoop又為HAWQ提供了傳統資料庫所不具備的線性擴充套件能力。

一、HAWQ的架構
        在一個典型的HAWQ部署中,每個slave節點上會安裝有一個HAWQ物理段,一個HDFS的DataNode和一個NodeManager。而HAWQ、HDFS和YARN的主機則安裝在(與slave)分離的節點上。
        下圖提供了一個HAWQ典型部署的高級別架構檢視。
        HAWQ與Hadoop的資源管理框架YARN緊密結合,為查詢提供資源管理。HAWQ在一個資源池中快取YARN容器,然後利用HAWQ自身的細粒度資源管理,為使用者或組在本地管理這些資源。當執行一個查詢時,HAWQ根據查詢成本、資源佇列定義、資料區域性化和當前系統中的資源使用情況,為查詢分配一組虛擬段。之後查詢被分發到相應的物理主機,可能是節點子集或整個叢集。每個HAWQ節點上的資源實施器監控著查詢對資源的實時使用情況,避免違規的資源使用。
        下圖提供了構成HAWQ軟體元件的另一個檢視。

1. HAWQ主節點
        HAWQ主節點是系統的入口點,有一個接受客戶端連線,並處理SQL命令的資料庫程序。HAWQ主節點解析查詢,優化查詢,向段分發查詢,並協調查詢執行。
        終端使用者通過主節點與HAWQ互動。可以使用如psql的客戶端程式,或者類似JDBC、ODBC的應用程式介面(APIs)連線到資料庫。
        “全域性系統目錄”是一組系統表的集合,包含HAWQ系統自身的元資料,儲存在主節點中。主節點本身不含任何使用者資料,資料只儲存在HDFS上。主節點對客戶端連線請求進行鑑權,處理輸入的SQL命令,在段間分發任務,協調每個段返回的結果,向客戶端程式輸出最終結果。

2. HAWQ段

        在HAWQ中,段是並行資料處理單元。
        每個主機上只有一個物理段,每個段可以為一個查詢片段啟動多個查詢執行器(Query Executors ,QEs)。這使得單一的物理段表現得像多個虛擬段,從而使HAWQ能夠更好地利用所有可用資源。

        注意:在本文件中,當我們提到段本身時,指的就是物理段。

        一個虛擬段就像是QE的一個容器。每個虛擬段含有為查詢片段啟動的一個QE。虛擬段的數量被用於確定一個查詢的並行度(degree of parallelism,DOP)。
        段有別於主節點,原因是段:
  • 無狀態。
  • 不儲存資料庫表元資料。
  • 不儲存本地檔案系統中的資料。
        主節點將SQL請求連同相關的元資料資訊分發給段進行處理。元資料中包含所請求表的HDFS url地址,段使用該URL訪問相應的資料。

3. HAWQ互聯
        “互聯”是HAWQ的網路層。當一個使用者連線到資料庫併發出了一個查詢,每個處理查詢的段上會建立多個程序。“互聯”指的是段之間的程序間通訊,以及通訊所依賴的底層網路架構。互聯使用標準的乙太網交換結構。
        預設情況下,互聯使用UDP(User Datagram Protocol)在網路間傳輸訊息。HAWQ軟體在UDP的功能之上執行附加的包驗證。這就意味著(HAWQ的網路傳輸)可靠性相當於TCP(Transmission Control Protocol),而在效能和可擴充套件性上卻優於TCP。如果使用TCP互聯,HAWQ有一個1000個段例項的擴充套件上限,而UDP作為當前互聯使用的預設協議,則沒有這個限制。

4. HAWQ資源管理器
        HAWQ資源管理器從YARN獲取資源,並響應資源請求。資源被HAWQ資源管理器快取,以支援低延時查詢。HAWQ資源管理器也能夠以獨立模式執行。在這種部署中,HAWQ自己管理資源而不需要YARN。

5. HAWQ目錄服務
        HAWQ目錄服務儲存全部元資料,例如UDF/UDT資訊,表資訊,安全資訊和資料檔案位置資訊等。

6. HAWQ容錯服務
        HAWQ容錯服務(FTS)負責接收從segment發來的心跳資訊,並負責檢測段是否失效。

7. HAWQ分發器
        HAWQ分發器將查詢計劃分發到選擇的段的子集上,並協調查詢的執行。分發器和資源管理器是HAWQ的主要元件,分發器負責查詢的動態排程。資源管理器負責執行查詢資源需求。

        原文:
        http://hdb.docs.pivotal.io/211/hawq/overview/HAWQArchitecture.html

二、表的分佈與儲存
        除系統表外,HAWQ將其它所有表資料儲存到HDFS中。當用戶建立了一個表,其元資料儲存到master主機上的本地檔案系統中,表的資料儲存到HDFS中。
        為了簡化表資料管理,一個表中的所有資料都儲存在一個HDFS目錄中。
        對於所有HAWQ表儲存格式,AO(Append-Only)和Parquet,資料檔案是可拆分的,因此HAWQ可以賦予多個虛擬段併發處理同一個資料檔案,這提高了查詢執行的並行度。

1. 表分佈策略
        HAWQ預設的表分佈策略是隨機分佈。
        相對於使用表的雜湊分佈策略,隨機分佈有一些好處。例如,當叢集擴容後,HAWQ可以自動使用更多的資源,而不再需要重新分佈資料。對於大表,重新分佈資料的代價是很高的。當底層HDFS在執行rebalance操作,或者某些DataNode失效後,隨機分佈表的資料本地化會更好,而且叢集規模越大,這種策略的優勢越明顯。
        另一方面,對於某些查詢,雜湊分佈的表會比隨機分佈快。例如,在一些TPC-H查詢中,雜湊分佈表的查詢效能更好。你應該依據你的應用場景選擇最合適的分佈策略。

2. 資料本地化
        資料是跨越HDFS的DataNode分佈儲存的。由於遠端讀取會引入網路I/O,HAWQ使用一個數據本地化演算法提升本地資料讀取比例。當HAWQ給虛擬段分配資料塊時,它考慮三個方面的因素:
  • 本地讀取比例。
  • 資料檔案連續讀。
  • 保持虛擬段間的資料平衡。
3. 外部資料訪問
        HAWQ可以使用Pivotal eXtension Framework(PXF)訪問外部檔案。PXF是HAWQ的擴充套件框架,它允許HAWQ象讀寫HAWQ表一樣來訪問外部資料來源的資料。PXF中已經內建了多個聯結器,用於訪問HDFS檔案,Hive表和HBase表。並且PXF還與HCatalog整合,直接查詢Hive表。
        使用者可以使用PXF API開發的Java外掛,建立自己定製的PXF聯結器,訪問其它並行資料儲存或處理引擎。

        原文:
        http://hdb.docs.pivotal.io/211/hawq/overview/TableDistributionStorage.html

三、執行時彈性查詢
        HAWQ使用動態分配虛擬段為執行查詢提供資源。
        HAWQ 1.x時,用於執行一個查詢的段(計算資源容器)的個數是固定的,無論底層查詢是一個需要很多資源的大查詢,還是一個需要很少資源的小查詢。這種架構雖然簡單,但資源使用低效。
        為了解決這個問題,HAWQ現在使用基於虛擬段的執行時彈性查詢特性。HAWQ會根據查詢的成本,按需分配虛擬段。換言之,對於大查詢,HAWQ分配很多虛擬段,而只給小查詢分配少數虛擬段。

1. 儲存
        在HAWQ裡,虛擬段的個數會依據查詢的成本而有所不同。為了簡化表管理,與一個表相關的所有資料都儲存到一個HDFS目錄下。
        對於所有HAWQ表儲存格式,AO(Append-Only)和Parquet,資料檔案是可拆分的,因此HAWQ可以賦予多個虛擬段併發處理同一個資料檔案,這提高了查詢執行的並行度。

2. 物理段與虛擬段
        在HAWQ裡,每個主機只安裝一個物理段,但執行查詢時可以啟動多個虛擬段。HAWQ為查詢按需分配多個分佈於不同主機上的虛擬段。虛擬段是記憶體、CPU等資源的容器。查詢就是在虛擬段中被查詢執行器所執行。

       注意:在本文件中,當我們提到段本身時,指的就是物理段。

3. 虛擬段分配策略
        依據虛擬段分配策略分配不同數量的虛擬段。
        以下因素決定了一個查詢所使用的虛擬段個數。
  • 查詢執行時的可用資源。
  • 查詢成本。
  • 表的分佈策略,就是說,是隨機分佈表還是雜湊分佈表。
  • 查詢是否引入了UDF或外部表。
  • 特定的伺服器配置引數,比如針對雜湊表查詢的“default_hash_table_bucket_number”,以及“hawq_rm_nvseg_perquery_limit”等。
        原文:
        http://hdb.docs.pivotal.io/211/hawq/overview/ElasticSegments.html

四、資源管理
        HAWQ提供多種方法管理資源,包含多個使用者配置選項,與YARN資源管理器的整合等。HAWQ使用下面的機制進行資源管理:
  • 全域性資源管理。你可以將HAWQ與YARN資源管理器整合,在需要時請求或回收資源。如果不與YARN整合,HAWQ可以管理它自己的資源,並排他地使用叢集資源。如果你將YARN整合到HAWQ,則HAWQ自動地從YARN獲取資源,並通過內部定義的資源佇列管理這些獲得的資源。當資源不再使用時,被自動返回給YARN。
  • 使用者定義資源佇列等級。HAWQ管理員或者超級使用者設計和定義資源佇列,用於為查詢組織和分發資源。
  • 查詢執行時動態資源分配。HAWQ根據資源佇列的定義動態分配資源。HAWQ會基於執行時(或排隊中)的查詢,以及當前資源佇列的容量,自動分發資源。
  • 虛擬段和查詢的資源限制。你可以配置HAWQ強制虛擬段和用於查詢的資源佇列對CPU和記憶體的使用限制。
        原文:
        http://hdb.docs.pivotal.io/211/hawq/overview/ResourceManagement.html

五、HDFS目錄快取
        HDFS目錄快取是HAWQ 主節點用來確定HDFS上表資料分佈資訊的一種快取服務。
        HDFS在做RPC處理時會比較慢,尤其是當併發請求數很高時。為了決定哪個段管理哪部分資料,HAWQ需要從HDFS的NameNode獲取資料的位置資訊。HDFS目錄快取就是用來快取資料的位置資訊,從而加快HDFS的RPC處理。

        原文:
        http://hdb.docs.pivotal.io/211/hawq/overview/HDFSCatalogCache.html

六、管理工具
        HAWQ的管理工具都被合併進一個hawq命令。該命令可以初始化、啟動和停止每一個單獨的段,並且支援叢集的動態擴充套件。

        原文:
        http://hdb.docs.pivotal.io/211/hawq/overview/ManagementTools.html

(hawq命令的簡要聯機幫助如下圖所示。)

七、高可用、冗餘和容錯
        HAWQ通過系統冗餘保證其叢集的高可用性。HAWQ的部署利用硬體平臺的冗餘,如用為主節點提供RAID,為段提供JBOD,為互聯層提供網路冗餘。在軟體層面,HAWQ通過主節點映象和雙叢集維護提供冗餘。另外,HAWQ支援HDFS的NameNode高可用配置。
        為了保持叢集的健康,HAWQ使用基於心跳和按需探查協議(on-demand probe protocols)的容錯服務(Fault Tolerance Service,FTS)。它可以動態識別新加入的節點,也可以在節點變得不穩定時,將其從叢集中刪除。

1. 關於高可用
        HAWQ使用多種機制保證高可用性,其中對於HAWQ最重要的機制如下:
  • 主節點映象。萬一主節點失效,叢集還有一個備用主節點可用。
  • 雙重叢集。管理員可以建立一個備用叢集,並通過雙重ETL或者備份與恢復機制同步主叢集的資料。
        除在HAWQ級別管理高可用外,你可以在HDFS中實現NameNode的高可用,從而為HAWQ提供高可用性。

2. 關於段容錯
        HAWQ中的段是無狀態的,這保證了段能夠快速恢復,並且有更好的可用性。當一個段失效時,該段被從資源池中刪除,查詢不會再被分發到該段。當失效段重新可用時,容錯服務驗證該節點有效後,將它添加回資源池。

3. 關於互聯冗餘
        互聯指的是段和段之間的程序間通訊,以及通訊所依賴的網路架構。可以通過在網路中部署雙重千兆乙太網交換機,並部署與HAWQ主機伺服器(主節點和段)冗餘的千兆連線。為了在HAWQ中使用多個網絡卡,需要進行網絡卡繫結。

        原文:
        http://hdb.docs.pivotal.io/211/hawq/overview/RedundancyFailover.html