Apache HAWQ是目前社區(qū)比較火的一種SQL-on-Hadoop方案,由Pivotal公司開發(fā)并貢獻給了Apache社區(qū)。HAWQ的技術(shù)與構(gòu)架源自于業(yè)界頂尖的MPP數(shù)據(jù)庫Greenplum,是傳統(tǒng)的高性能分析型數(shù)據(jù)庫與Hadoop相結(jié)合的一次嘗試,其兼具了MPP架構(gòu)數(shù)據(jù)庫卓越的分析性能與Hadoop的可高擴展性,容錯性。
本文主要描述HAWQ的基本概念,在HDP集群中的部署以及初步測試。
HAWQ架構(gòu)概述
HAWQ的架構(gòu)如下圖所示:

HAWQ架構(gòu)是分布式系統(tǒng)中經(jīng)典的master-slave模式,主要分為下面三個服務:
HAWQ master:HAWQ master是整個系統(tǒng)的入口點,負責接收和認證客戶端的連接請求,處理客戶端提交的SQL命令,解析并優(yōu)化查詢,向集群的各個Segemt節(jié)點下發(fā)查詢并合理分布負載,協(xié)調(diào)從各Segemt節(jié)點返回的子查詢結(jié)果,向客戶端程序返回合并后的最終處理結(jié)果。HAWQ master內(nèi)部由HAWQ Resource Manager,HAWQ Catalog Service,HAWQ Fault Tolerance Service,HAWQ Dispatcher等組件組成。HAWQ master還需要維護global system catalog,global system catalog是系統(tǒng)表的集合,其中包含了HAWQ集群的元數(shù)據(jù)信息;HAWQ master上不包含任何用戶數(shù)據(jù),所有數(shù)據(jù)都在HDFS上。
HAWQ segment:HAWQ segment是HAWQ集群的計算節(jié)點,負責大規(guī)模查詢的并行處理;HAWQ segment節(jié)點本身不存儲任何數(shù)據(jù)和元數(shù)據(jù),所有需要處理的數(shù)據(jù)都存儲在底層的HDFS上,segment本身只負責計算,是無狀態(tài)的;HAWQ master在分派SQL請求給Segment時會附帶相關(guān)的元數(shù)據(jù)信息,元數(shù)據(jù)信息里包含了需要處理的表的HDFS URL,Segment通過元數(shù)據(jù)里的HDFS URL訪問SQL請求需要處理的數(shù)據(jù)。
PXF agent:PXF(HAWQ Extension Framework)是一個允許HAWQ訪問外部系統(tǒng)數(shù)據(jù)的可擴展的框架,PXF內(nèi)置了訪問HDFS文件,HBase表以及Hive表的連接器(connectors),PXF還可以通過和HCatalog集成來直接訪問Hive表;PXF允許用戶通過開發(fā)新的連接器來訪問其它并行數(shù)據(jù)存儲和處理引擎。PXF agent是PXF的服務,需要部署在集群的Segment節(jié)點上。
在HAWQ集群中,master節(jié)點上需要啟動HAWQ master,HDFS namenode和Yarn resourcemanager;每個slave節(jié)點上需要啟動HAWQ segment,PXF agent,HDFS datanode和Yarn nodemanager。HAWQ集群的數(shù)據(jù)直接存儲在HDFS上,可以集成Yarn來進行計算資源管理(HAWQ自身也提供了不依賴于Yarn的Standalone模式,Ambari部署的HAWQ默認是Standalone模式,用戶可以在Ambari頁面上自行切換);HAWQ也可以通過PXF查詢HBase和Hive的庫表。
用戶通過連接master節(jié)點來與HAWQ集群交互,可以使用數(shù)據(jù)庫客戶端程序(psql)或者JDBC和ODBC這樣的API連接HAWQ的庫表。
用戶通過連接HAWQ master服務與HAWQ集群交互。和大多數(shù)Hadoop組件類似,HAWQ也提供了命令行和API兩種交互方式:由于HAWQ繼承自Greemplum/PostgresSQL技術(shù)棧,所以天然的選擇了PostgresSQL的客戶端程序psql作為命令行工具去連接HAWQ庫表,提交SQL查詢;HAWQ支持JDBC和ODBC作為編程接口,第三方程序可以通過JDBC/OCBC方式訪問HAWQ。
通過ambari安裝HAWQ
Pivotal官方提供了HAWQ的發(fā)行版,即Pivotal HDB。
Hortonworks的Hadoop發(fā)行版Hortonworks Data Platform(HDP)從2.2.4.2版本開始支持集成Pivotal HDB,HDP的用戶可以直接在HDP集群中利用Ambari完成HAWQ的敏捷部署和運維。HAWQ版本和HDP/ambari以及操作系統(tǒng)版本的對應關(guān)系如下圖所示:

從上圖可知,HAWQ的最新發(fā)布版是2.3.0.0,對應的HDP版本是2.6.1,ambari版本是2.5.1。而且,HAWQ直到最近的兩個發(fā)布版才支持7.2以上版本的RHEL/CentOS。
設(shè)置本地源
首先需要從HAWQ官網(wǎng)(network.pivotal.io/products/pivotal-hdb)下載HAWQ安裝包的tar.gz文件到集群的yum源上。HAWQ安裝包下載完成后,按如下步驟完成HAWQ的本地源搭建:
- 在yum服務器上創(chuàng)建存放HAWQ安裝文件的目錄,解壓之前下載的文件并設(shè)置權(quán)限:
[root@host-10-1-236-146 ~]#? mkdir /staging
[root@host-10-1-236-146 ~]# chmod a+rx /staging
[root@host-10-1-236-146 ~]# cd /staging/
[root@host-10-1-236-146 staging]# tar xvf hdb-2.3.0.0-4600.el7.tar.gz
[root@host-10-1-236-146 staging]# cd hdb-2.3.0.0/
- 運行HAWQ安裝包里的setup_repo.sh腳本(注意將腳本中的DOCUMENT_ROOT修改為當前yum服務器的實際目錄,其默認為/var/www/html)完成yum源配置,生成repo文件:

- 將生成的yum repo文件拷貝到HDP集群的ambari節(jié)點的/etc/yum.repo.d/下面
- 在ambari節(jié)點上運行yum clean all && yum update測試hawq的yum源是否生效
安裝HAWQ Ambari plug-in
Ambari本身不支持HAWQ的安裝,ambari正常安裝啟動起來之后在服務添加頁面是看不到HAWQ的,所以需要安裝Pivotal開發(fā)的HAWQ插件。HAWQ Ambari plug-in會提供HAWQ的安裝和服務管理腳本。
可以按照如下步驟安裝HAWQ Ambari plug-in:
- 在ambari server上安裝HAWQ Ambari plug-in的rpm包:
[root@host-10-1-241-55 ~]# yum install -y hawq-ambari-plugin
(安裝完成之后,HAWQ Ambari plug-in會在ambari server上創(chuàng)建一個本地目錄(/var/lib/hawq)來放置一些所需的腳本和模版文件)
- 通過運行HAWQ Ambari plug-in提供的python腳本(/var/lib/hawq/add-hawq.py)為Ambari server添加HAWQ的源(腳本執(zhí)行時需要確保ambari-server服務正常運行):
./add-hawq.py --user admin --password admin --stack HDP-2.6 --hawqrepo http://host-10-1-236-146/hdb-2.3.0.0
(腳本的參數(shù)依次為:ambari server的admin用戶名,ambari server的admin用戶密碼,HDP stack版本,hawq源的地址)
- 重啟ambari-server
- 登陸到Ambari UI,既可在服務添加頁面看到HAWQ相關(guān)的服務安裝選項:

通過Ambari頁面安裝HAWQ
安裝好HAWQ Ambari plug-in并將Pivotal HDB的本地源加入Ambari后,我們就可以通過Ambari的圖形化界面進行HAWQ的安裝了。
安裝步驟如下:
- 在Ambari的Add Service Wizard里,選擇HAWQ和PXF

- 分配HAWQ master和HAWQ Segment,PXF Agent到集群中的機器:


- 配置HAWQ master和segment的數(shù)據(jù)存儲目錄,ambari默認設(shè)置為服務器本地的/data/hawq/master和/data/hawq/segment目錄;

另外,需要確保hawq的啟動用戶(Ambari默認為gpadmin)可以訪問上述數(shù)據(jù)存儲目錄,否則HAWQ服務將啟動失敗。

- 配置HAWQ Master服務的監(jiān)聽地址,Ambari默認值為5432,這個端口也是PostgresSQL的默認監(jiān)聽端口,所以如果HAWQ Master本地并安裝啟動了PostgresSQL的話,HAWQ Master就需要使用其他端口,否則會造成端口沖突。

- 選擇下一步Review整個HAWQ集群的配置

- 點擊Deploy部署HAWQ集群

- 如果HAWQ的部署過程中出現(xiàn)類似于下圖的錯誤,說明集群中缺少HAWQ所需的依賴;需要管理員在集群中的每臺機器上手動安裝下圖中Ambari錯誤提示中缺少的三個rpm包:libsasl,protobuf,thrift;需要注意的是,手動安裝的上述三個rpm包的版本和適配的操作系統(tǒng)版本需要和HAWQ版本以及當前集群的操作系統(tǒng)一致。

- 部署完成之后,在Ambari頁面查看HAWQ各個組件的狀態(tài)

- 如果在HAWQ啟動和后續(xù)的使用過程中,出現(xiàn)和HDFS有關(guān)的問題,可能需要調(diào)整HDFS的參數(shù),具體可以參考Pivotal官網(wǎng)的在線文檔(Procedure部分的第9小節(jié)):hdb.docs.pivotal.io/212/hdb/install/install-ambari.html
- 由于HAWQ自身沒有像HDFS或者Yarn那樣提供用于服務監(jiān)控和配置管理的圖形用戶界面(Web UI),所以用戶需要通過Ambari完成HAWQ的服務管理,服務監(jiān)控以及配置管理相關(guān)任務的圖形化操作。
- 如果在RHEL/CentOS 7.2的環(huán)境上部署HAWQ,會遇到從gpadmin用戶logout之后re-login,就無法訪問HAWQ的情況(無法執(zhí)行HAWQ管理命令,也無法用psql提交sql):

HAWQ master的日志(/data/hawq/master/pg_log/hawq-xxx.csv)報錯如下:

導致這個問題的原因是,RHEL/CentOS 7.2的systemd會在用戶退出登陸后默認清除信號量(semaphores),這會影響與HAWQ的交互。解決辦法是:停止HAWQ集群,以root身份修改systemd的配置,關(guān)閉RemoveIPC選項并重啟systemd-logind,然后重新拉起HAWQ集群:

(參考:Re: problem on AMD FX-8350)
測試HAWQ
HAWQ在HDP集群中安裝啟動完成后,我們就可以開始使用HAWQ進行數(shù)據(jù)分析了。
設(shè)置HAWQ運行環(huán)境
Ambari會為HAWQ集群創(chuàng)建一個名為gpadmin(HAWQ的技術(shù)架構(gòu)和源代碼出于Greenplum,所以很多配置項的命令都以gp開頭~)的服務賬戶,HAWQ相關(guān)服務由該用戶身份啟動,所以用戶執(zhí)行HAWQ的管理命令(如hawq,hawq_ctl等)或者提交SQL也需要gpadmin的用戶身份。
在HAWQ集群上設(shè)置HAWQ運行環(huán)境需要如下工作:
- 登錄到HAWQ集群中任何一個節(jié)點并切換到到gpadmin用戶
- Source HAWQ的環(huán)境變量設(shè)置腳本:/usr/local/hawq/greenplum_path.sh
- 如果部署HAWQ集群時沒有使用HAWQ master的默認端口(5432),則需要增加一個指向HAWQ master實際配置的端口的環(huán)境變量:PGPORT

- 可以上述設(shè)置HAWQ環(huán)境變量的相關(guān)命令寫入gpadmin用戶的~/.bashrc中,這樣每當用戶切換到gpadmin時候就會自動完成環(huán)境變量的設(shè)置
HAWQ運行環(huán)境設(shè)置好后可以進行簡單的環(huán)境測試,如:
- 執(zhí)行HAWQ的管理命令,查看HAWQ集群狀態(tài)

- 通過psql連接HAWQ庫:

導入測試數(shù)據(jù)
Pivotal官方提供了用于測試HAWQ的開源項目:GitHub - pivotalsoftware/hawq-samples,其展示了一個典型的零售業(yè)的OLAP場景。hawq-samples里包含了描述零售數(shù)據(jù)和零售數(shù)據(jù)的維度信息的數(shù)據(jù)壓縮文件,用于創(chuàng)建事實表,維度表和pxf外部表的SQL腳本,用于批量加載測試數(shù)據(jù)到HDFS的shell腳本等。
按照如下步驟在HAWQ里導入hawq-samples的數(shù)據(jù)并建立OLAP模型:
- 從github下載hawq-samples并checkout到對應分支,然后將表示HAWQ工作目錄的環(huán)境變量(HAWQGSBASE)指向hawq-samples的文件目錄:

hawq-samples的目錄結(jié)構(gòu)說明如下:

datasets/retail/ :Retail demo的數(shù)據(jù)集文件(.tsv.gz格式)
tutorials/getstart/hawq/:創(chuàng)建HAWQ表的SQL和Shell腳本
tutorials/getstart/pxf/:創(chuàng)建PXF外部表的SQL和Shell腳本
- 為Retail demo創(chuàng)建一個HAWQ庫和一個HAWQ schema(HAWQ schema是HAWQ庫的一個namespace,包含了一組表,數(shù)據(jù)類型,函數(shù)和操作符,一個HAWQ庫可以包含多個schema),創(chuàng)建的HAWQ為hawqgsdb,schema為retail_demo:

- 創(chuàng)建事實表,通過執(zhí)行hawq-samples提供的create_hawq_tables.sql腳本在hawqgsdb.retail_demo下面創(chuàng)建兩張事實表:orders_hawq代表零售訂單的詳細內(nèi)容,orders_lineitems_hawq代表訂單條目的詳細內(nèi)容

- 加載事實表的數(shù)據(jù)到HAWQ,通過執(zhí)行hawq-samples提供的load_hawq_tables.sh腳本將retail demo的數(shù)據(jù)加載到HAWQ的表中,load_hawq_tables.sh腳本使用zcat命令解壓縮.tsv,gz格式的數(shù)據(jù)文件,調(diào)用SQL命令copy加載解壓后的csv文件到hawqgsdb.retail_demo的兩張事實表中
- 驗證事實表,執(zhí)行hawq-samples提供的verify_load_hawq_tables.sh腳本對hawqgsdb.retail_demo的兩張事實表進行count操作,驗證數(shù)據(jù)已經(jīng)加載

- 加載維度數(shù)據(jù)到HDFS,執(zhí)行hawq-samples提供的load_data_to_HDFS.sh腳本加載維度數(shù)據(jù)到HDFS中(需要確保gpadmin具有sudo權(quán)限)

- 創(chuàng)建維度表,執(zhí)行hawq-samples提供的create_pxf_tables.sql腳本在hawqgsdb.retail_demo下面創(chuàng)建維度表;由于維度數(shù)據(jù)已經(jīng)加載在HDFS上,所以只需要通過pxf創(chuàng)建HAWQ的外部表來關(guān)聯(lián)HDFS上的維度數(shù)據(jù),而無需再次加載數(shù)據(jù)到HAWQ的內(nèi)部表中

- 驗證維度表,執(zhí)行hawq-samples提供的verify_create_pxf_tables.sh腳本對hawqgsdb.retail_demo的所有維度表進行count操作,驗證維度表已經(jīng)建立成功

執(zhí)行SQL查詢
在hawq-samples中,retail demo數(shù)據(jù)存儲在HAWQ內(nèi)部表中,維度數(shù)據(jù)存儲在HDFS外部源中,用戶需要同時使用HAWQ內(nèi)部和PXF外部表來關(guān)聯(lián)和查詢retail demo數(shù)據(jù)。在生產(chǎn)環(huán)境中,同時使用內(nèi)部表和外部數(shù)據(jù)源的情況也是比較常見的。
以下是一個簡單的SQL查詢,同時使用了存儲在HAWQ內(nèi)部描述訂單數(shù)據(jù)的事實表orders_hawq和存儲在HDFS上描述客戶信息的維度表customers_dim_pxf,確定購買了禮券的所有用戶的姓名和email地址,同時統(tǒng)計購買的訂單總額:
SELECT substring(retail_demo.orders_hawq.customer_email_address for 37) AS email_address, last_name,sum(retail_demo.orders_hawq.total_paid_amount::float8) AS gift_cert_total FROM retail_demo.customers_dim_pxf, retail_demo.orders_hawq WHERE retail_demo.orders_hawq.payment_method_code='GiftCertificate' AND retail_demo.orders_hawq.customer_id=retail_demo.customers_dim_pxf.customer_id GROUP BY retail_demo.orders_hawq.customer_email_address, last_name ORDER BY last_name limit 10;
在psql中執(zhí)行上述SQL查詢,結(jié)果如下:

結(jié)論
Apache HAWQ作為一款原生的SQL-on-Hadoop引擎,兼具了MPP數(shù)據(jù)庫強大的分析性能和Hadoop的高可擴展性;在HDP集群里可以通過Ambari進行快速部署和集中管理,為HDP集群提供高性能分析能力。Apache HAWQ目前尚處于Apache的孵化階段,在生產(chǎn)環(huán)境下的部署還比較少,缺乏生產(chǎn)環(huán)境的嚴苛校驗,其穩(wěn)定性,查詢性能以及容錯性尚待進一步的測試和優(yōu)化。但是,作為Hortonworks陣營里唯一可用的原生SQL-on-Hadoop引擎,其發(fā)展還是可以期待一下的,未來期待它能夠替代Cloudera Impala :-)