HAWQ作為Hadoop上的一個服務提供給用戶,與其他全部服務一樣。最主要的操作就是啟動、停止、重新啟動服務。要完畢這些操作,須要適當的環境設置。以下就HAWQ管理的一些基礎概念、操作環境、啟動停止及其推薦的操作進行討論。
一、基礎概念
假設組織中能夠做到系統管理與開發分離。那這部分內容嚴格說應該是HAWQ系統管理員所關心的。要利用好HAWQ集群,應該有一些Linux/UNIX系統管理、數據庫管理系統、DBA和SQL等必備知識和經驗。
HAWQserver實際上是一個以HDFS作為物理存儲的分布式數據庫系統,像Oracle、MySQL等軟件一樣,是一個真正的數據庫。
HAWQ代碼源自PostgreSQL,具有完整的數據庫特性。就連HAWQ的官方文檔也始終與PostgreSQL文檔保持一致。
這點與其他SQL-on-Hadoop方案顯著不同。比如Hive。它僅僅是給MapReduce封裝了一個SQL語義層,SQL語句的運行依賴於底層的MapReduce計算框架,SparkSQL、Impala等等也都是如此。因此個人覺得HAWQ更適合DBA轉到Hadoop上。(當然,要是有個將MySQL移植到Hadoop上的產品就更好了。)
1. HAWQ用戶
HAWQ支持對用戶和操作權限的管理。
HAWQ系統安裝后。數據庫中包含一個提前定義的超級用戶,該用戶與安裝HAWQ的操作系統用戶用戶同名。叫做gpadmin。
gpadmin作為操作系統用戶,能夠使用HAWQ的命令行工具運行管理任務,如啟動或停止HAWQ、擴展集群、刪除集群中的節點等過程。而作為數據庫用戶,gpadmin相當於Oracle的sys或MySQL的root,具有數據庫的最大權限。HAWQ管理員用戶能夠創建其他數據庫用戶,並向他們賦予管理或操作數據庫對象的權限。
能夠選擇使用Ambari或命令行管理HAWQ集群。當使用Ambari管理HAWQ時。用Ambari的管理員用戶登錄Web控制台頁面就可以,不須要使用gpadmin。Ambari缺省的管理員username/password是admin/admin。Managing HAWQ Using Ambari提供了通過Ambari管理HAWQ集群的具體說明。
2. HAWQ系統部署
從前面的安裝過程中看到。一個典型的HAWQ部署包含一個HDFS NameNode、一個HAWQ master、一個HAWQ standby,以及多個HAWQ segment與HDFS DataNode。HAWQ集群中還可能包含HAWQ Extension Framework(PXF)服務或其他Hadoop的服務。
使用Ambari在HDP上安裝HAWQ時,會為HAWQ節點自己主動選擇HDP集群中的主機,僅僅要求master和standby運行在不同主機上。segment能夠和master、standby運行在同樣主機上,通常在每一個DataNode上運行一個segment。
在我的實驗環境中,Ambari選擇hdp3作為master,hdp2作為standby,HDP集群中的全部4台主機。每一個上面運行一個segment。實驗環境與安裝過程參見http://blog.csdn.net/wzy0623/article/details/55212318。
二、HAWQ操作環境
在操作HAWQ集群前,必須設置HAWQ所需的環境。
1. 設置HAWQ操作環境
HAWQ提供了一個名為greenplum_path.sh的shell腳本文件。位於HAWQ安裝的根文件夾下。用於設置HAWQ所需的環境變量。
這些環境變量中最重要的是$GPHOME,它指定了HAWQ安裝的根文件夾。假設安裝的是Pivotal提供的HAWQ安裝版本號,典型的HAWQ根文件夾是/usr/local/hawq。其他環境變量包含用於查找HAWQ相關文件的$PATH、動態鏈接庫路徑$LD_LIBRARY_PATH、python路徑$PYTHONPATH、openssl配置文件$OPENSSL_CONF、HDFS3client配置文件$LIBHDFS3_CONF、YARNclient配置文件$LIBYARN_CONF、HAWQ的配置文件$HAWQSITE_CONF等。缺省設置能夠滿足大多數需求。假設環境有特殊要求。能夠將相關環境變量加入到greenplum_path.sh文件里。
運行以下步驟設置HAWQ操作環境:
(1)用gpadmin登錄HAWQ節點,或者切換到gpadmin,比如:
[root@hdp1 ~]# su - gpadmin [gpadmin@hdp1 ~]$(2)通過運行greenplum_path.sh文件設置HAWQ操作環境:
[gpadmin@hdp1 ~]$ source /usr/local/hawq/greenplum_path.sh(3)編輯.bash_profile或其他shell資源文件在登錄時運行greenplum_path.sh。比如:
[gpadmin@hdp1 ~]$ echo "source /usr/local/hawq/greenplum_path.sh" >> ~/.bash_profile(4)在shell初始化文件里設置與具體部署相關的HAWQ特定環境變量,包含PGAPPNAME、PGDATABASE、PGHOST、PGPORT和PGUSER等(可選)。
比如:
- . 假設定制了HAWQ主節點的port號。在shell初始化文件里加入例如以下一行。設置PGPORT環境變量使該port號成為缺省值:export PGPORT=10432。
設置PGPORT簡化了psql命令行,通過提供缺省port而不用提供-p(port)選項。
- . 假設例行操作一個特定數據庫。在shell資源文件里加入例如以下一行。設置PGDATABASE環境變量使該數據庫成為缺省值:export PGDATABASE=<database-name>。將<database-name>替換成缺省連接的數據庫名。設置PGDATABASE簡化了psql命令行,通過提供缺省port而不用提供-d(數據庫)選項。
2. HAWQ文件與文件夾
表1說明HAWQ缺省安裝的一些文件和文件夾。
文件/文件夾 |
內容 |
$HOME/hawqAdminLogs/ |
缺省的HAWQ管理應用程序日志文件文件夾 |
$GPHOME/greenplum_path.sh |
HAWQ環境設置腳本 |
$GPHOME/bin/ |
HAWQ管理、client、數據庫和管理應用程序 |
$GPHOME/etc/ |
HAWQ配置文件,包含hawq-site.xml |
$GPHOME/include/ |
HDFS、PostgreSQL、libpq的頭文件 |
$GPHOME/lib/ |
HAWQ庫文件 |
$GPHOME/lib/postgresql/ |
PostgreSQL共享庫和JAR文件 |
$GPHOME/share/postgresql/ |
PostgreSQL及其過程化語言的演示樣例與腳本 |
/data/hawq/[master|segment]/ |
HAWQ主節點和段的缺省數據文件夾位置 |
/data/hawq/[master|segment]/pg_log/ |
HAWQ主節點和段的缺省日志文件文件夾位置 |
/etc/pxf/conf/ |
PXF服務的配置文件 |
/usr/lib/pxf/ |
PXF服務插件共享庫 |
/var/log/pxf/ |
PXF日志文件文件夾 |
/usr/hdp/current/ |
HDP運行時和配置文件 |
三、啟動和停止HAWQ
在HAWQ系統中的master節點和全部的segment節點,每一個節點運行一個PostgreSQL數據庫server實例。比如,在hdp3上能夠看到例如以下兩個postgres進程:
/usr/local/hawq_2_1_1_0/bin/postgres -D /data/hawq/master -i -M master -p 5432 --silent-mode=true /usr/local/hawq_2_1_1_0/bin/postgres -D /data/hawq/segment -i -M segment -p 40000 --silent-mode=true全部這些DBMS一起被當做單一的DBMS被啟動和停止。通過這樣的方式能夠統一啟停全部實例。由於HAWQ系統被分布於多個機器上。啟動與停止HAWQ系統的過程又不同於標准的PostgreSQL DBMS的啟動停止過程。
啟動和停止HAWQ的命令各自是hawq start和hawq stop,hawq init命令也會啟動系統。
hawq命令行工具是一個python腳本。位於$GPHOME/bin文件夾下。
能夠在命令行輸入hawq -h、hawq start -h或hawq stop -h等獲得相關命令的聯機幫助。啟動停止HAWQ集群的命令都以gpadmin操作系統用戶運行。
注意,不要使用操作系統的kill命令終止不論什么postgres進程。和其他全部數據庫管理系統一樣,強殺極有可能引起數據不一致的問題。每一個client連接到HAWQ時,會在master節點上產生一個postgres進程,這與Oracle的專用server相似。
終止用戶會話postgres進程的正確方法是使用pg_cancel_backend()數據庫命令。以下是一個樣例:
select datname,procpid,current_query from pg_stat_activity;
當中datname是會話連接的數據庫名,procpid是會話相應的操作系統進程號,current_query是會話當前運行的SQL語句。查詢結果如圖1所看到的。

select pg_cancel_backend(354310);
取消354310進程。
不能取消自己本身的會話。錯誤信息如圖2所看到的。

初始安裝或運行hawq init cluster命令后,HAWQ集群會自己主動啟動。hawq init cluster命令將初始化HAWQ的master實例和每一個segment實例,並將系統配置為一個總體。
該命令要求HAWQ在HDFS上的數據文件夾為空,也就是說要清除掉全部用戶數據,因此一般不要手工運行。
很多其他hawq init的信息參見http://hdb.docs.pivotal.io/211/hawq/reference/cli/admin_utilities/hawqinit.html。
為了啟動已經初始化后的停止了的HAWQ系統,須要在主節點實例上運行hawq start命令。
hawq start cluster啟動一個已經初始化的HAWQ集群,僅僅能在master節點上運行。該命令將啟動HAWQ系統的master和全部segment。並行運行且協調這個過程。
hawq start master僅僅啟動HAWQ的master節點,而不啟動segment節點。
hawq start segment啟動本地segment節點。
hawq start standby啟動standby節點。
hawq start allsegments一次啟動全部segment節點。
假設希望忽略無法ssh連接的主機,能夠使用hawq start --ignore-bad-hosts選項。
很多其他hawq start的信息參見 http://hdb.docs.pivotal.io/211/hawq/reference/cli/admin_utilities/hawqstart.html。
2. 重新啟動HAWQ
hawq restart命令后跟適當的集群或節點類型,將停止HAWQ。然后在全然終止后重新啟動HAWQ。假設master或segment已經停止。重新啟動不受影響。
hawq restart cluster重新啟動HAWQ集群,僅僅能在master節點上運行。
hawq restart master重新啟動master節點。
hawq restart segment重新啟動本地segment節點。
hawq restart standby重新啟動standby。
hawq restart allsegments一次重新啟動全部segments。
很多其他hawq restart的信息參見 http://hdb.docs.pivotal.io/211/hawq/reference/cli/admin_utilities/hawqrestart.html。
3. 僅僅又一次導入改動的配置文件
能夠在不中斷系統的情況下重載HAWQ的配置文件。hawq stop命令能夠在不中斷服務的情況下。重載pg_hba.conf配置文件(連接認證文件),以及hawq-site.xml和pg_hba.conf文件里的運行時參數。配置在新連接中生效。很多server配置參數須要系統全然重新啟動(hawq restart cluster)才干生效。server配置參數的很多其他信息。參考 Server Configuration Parameter Reference。
使用hawq stop命令重載配置文件而不停止系統:
hawq stop cluster --reload或者:
hawq stop cluster -u
4. 以維護模式啟動主節點
能夠僅僅啟動master節點運行維護或管理任務。而不影響segment節點上的數據。
維護模式是一個超級用戶模式。應該僅僅在實施維護任務時使用。比如,在維護模式下,同意連接到master節點實例上的數據庫並編輯系統文件夾設置。
(1)在主節點上使用-m選項運行hawq start:
hawq start master -m(2)為維護系統文件夾,連接到維護模式下的master節點。比如:
PGOPTIONS='-c gp_session_role=utility' psql template1(3)完畢管理任務后,以生產模式重新啟動主節點。
hawq restart master注意:錯誤地使用維護模式連接。可能造成HAWQ系統狀態不一致。
應該僅僅有專家級用戶運行這個操作。
5. 停止HAWQ
hawq stop cluster命令停止HAWQ系統,該命令總是在主節點所在主機上運行。
當此命令運行時。會停止全部系統中的postgres進程。包含master和全部segment實例。hawq stop cluster命令使用缺省的最多64個並行線程停止全部構成HAWQ集群的segment。在停止前,系統會等待不論什么活動的事務結束。為了馬上停止HAWQ,能夠使用fast停止方式。命令hawq stop master、hawq stop segment、hawq stop standby和hawq stop allsegments分別用於停止master節點、本地segment節點、standby節點和集群中的全部segment。
僅僅停止master節點不會終止整個集群。以下是兩個停止HAWQ集群的樣例。
停止HAWQ:
hawq stop cluster以高速模式停止HAWQ:
hawq stop cluster -M fast-M選項提供了smart、fast、immediate三種停止方式,它們相似於Oracle中shutdown命令的normal、immediate和abort。Smart是缺省值,假設發現數據庫中有活動的連接,停止失敗,並發出一個錯誤消息,如圖3所看到的。
Immediate方式終止正在處理的事務,並馬上殺掉全部相關postgres進程。數據庫server不會完畢事務處理,也不會清除不論什么暫時數據或使用中的工作文件。(工作文件的概念與MySQL的暫時文件相似。
查詢運行過程中,假設不能在內存進行,則會在磁盤創建工作文件。)因此。不推薦使用immediate停止方式。在某些情況下,immediate可能造成數據庫損壞。並須要手工恢復。
很多其他hawq stop的信息參見http://hdb.docs.pivotal.io/211/hawq/reference/cli/admin_utilities/hawqstop.html。
6. 啟動/停止HAWQ集群最佳實踐
為了更好地使用hawq start和hawq stop管理系統,HAWQ推薦使用以下的最佳實踐。
- 運行CHECKPOINT命令,將全部數據文件里更新的數據刷新回磁盤。並在停止集群前更新日志文件。與其他數據庫中檢查點的概念同樣,一個檢查點確保在系統崩潰時,文件能夠從檢查點快照中被還原。
- 在master節點所在主機上運行以下命令停止整個HAWQ系統:hawq stop cluster。
- 停止segment。並殺死不論什么運行的查詢,而不造成數據丟失或不一致的問題,在master上使用fast停止模式:hawq stop cluster -M fast。
- 使用hawq stop master僅僅停止master節點。假設由於存在運行着的事務而不能停止master節點,嘗試使用fast方式。假設fast無法工作,再使用immediate方式。使用immediate會引發警告,由於在系統又一次啟動時,會導致運行崩潰恢復:hawq stop master -M fast或hawq stop master -M immediate。
- 假設已經改動並希望重載server參數設置,而且HAWQ數據庫上的有活動連接。使用命令:hawq stop master -u -M fast
- 當停止本地segment或全部segment時。使用smart模式,這也是缺省值。在segment上使用fast或immediate模式是無效的。由於segment是無狀態的:hawq stop segment或hawq stop allsegments。
- 典型地,應該總是使用hawq start cluster或hawq restart cluster啟動集群。假設使用hawq start standby|master|segment的方式分別啟動節點,確保總是在啟動master節點之前啟動standby節點,否則standby可能與master數據不同步。
