1. 程式人生 > 其它 >HAWQ技術解析(四) —— 啟動停止

HAWQ技術解析(四) —— 啟動停止

技術標籤:# Greenplum# Hadoop

前面已經完成了HAWQ的安裝部署,也瞭解了HAWQ的系統架構與主要元件,下面開始使用它。HAWQ作為Hadoop上的一個服務提供給使用者,與其它所有服務一樣,最基本的操作就是啟動、停止、重啟服務。要完成這些操作,需要適當的環境設定。下面就HAWQ管理的一些基礎概念、操作環境、啟動停止及其推薦的操作進行討論。

一、基礎概念

如果組織中能夠做到系統管理與開發分離,那這部分內容嚴格說應該是HAWQ系統管理員所關心的。要利用好HAWQ叢集,應該有一些Linux/UNIX系統管理、資料庫管理系統、DBA和SQL等必備知識和經驗。HAWQ伺服器實際上是一個以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預設的管理員使用者名稱/密碼是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、HDFS3客戶端配置檔案$LIBHDFS3_CONF、YARN客戶端配置檔案$LIBYARN_CONF、HAWQ的配置檔案$HAWQSITE_CONF等。預設設定可以滿足大多數需求。如果環境有特殊要求,可以將相關環境變數新增到greenplum_path.sh檔案中。執行以下步驟設定HAWQ操作環境:
(1)用gpadmin登入HAWQ節點,或者切換到gpadmin,例如:

[[email protected] ~]# su - gpadmin
[[email protected] ~]$ 

(2)通過執行greenplum_path.sh檔案設定HAWQ操作環境:[[email protected] ~]$ source /usr/local/hawq/greenplum_path.sh
(3)編輯.bash_profile或其它shell資原始檔在登入時執行greenplum_path.sh。例如:[[email protected] ~]$ echo "source /usr/local/hawq/greenplum_path.sh" >> ~/.bash_profile
(4)在shell初始化檔案中設定與具體部署相關的HAWQ特定環境變數,包括PGAPPNAME、PGDATABASE、PGHOST、PGPORT和PGUSER等(可選)。例如:
. 如果定製了HAWQ主節點的埠號,在shell初始化檔案中新增如下一行,設定PGPORT環境變數使該埠號成為預設值:export PGPORT=10432。設定PGPORT簡化了psql命令列,通過提供預設埠而不用提供-p(埠)選項。
. 如果例行操作一個特定資料庫,在shell資原始檔中新增如下一行,設定PGDATABASE環境變數使該資料庫成為預設值:export PGDATABASE=。將替換成預設連線的資料庫名。設定PGDATABASE簡化了psql命令列,通過提供預設埠而不用提供-d(資料庫)選項。
與HAWQ部署相關的環境變數,參見 Environment Variables。

2. HAWQ檔案與目錄

表1說明HAWQ預設安裝的一些檔案和目錄。

檔案/目錄內容
$HOME/hawqAdminLogs/預設的HAWQ管理應用程式日誌檔案目錄
$GPHOME/greenplum_path.shHAWQ環境設定指令碼
$GPHOME/bin/HAWQ管理、客戶端、資料庫和管理應用程式
$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/[mastersegment]/
/data/hawq/[mastersegment]/pg_log/
/etc/pxf/conf/PXF服務的配置檔案
/usr/lib/pxf/PXF服務外掛共享庫
/var/log/pxf/PXF日誌檔案目錄
/usr/hdp/current/HDP執行時和配置檔案

三、啟動和停止HAWQ

在HAWQ系統中的master節點和所有的segment節點,每個節點執行一個PostgreSQL資料庫伺服器例項,例如,在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程序。和其它所有資料庫管理系統一樣,強殺極有可能引起資料不一致的問題。每個客戶端連線到HAWQ時,會在master節點上產生一個postgres程序,這與Oracle的專用伺服器類似。終止使用者會話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所示。
在這裡插入圖片描述

1. 啟動HAWQ

初始安裝或執行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檔案中的執行時引數。配置在新連線中生效。許多伺服器配置引數需要系統完全重啟(hawq restart cluster)才能生效。伺服器配置引數的更多資訊,參考 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所示。
在這裡插入圖片描述
Fast方式中斷並回滾當前處理的任何事務。
Immediate方式終止正在處理的事務,並立即殺掉所有相關postgres程序。資料庫伺服器不會完成事務處理,也不會清除任何臨時資料或使用中的工作檔案。( 工作檔案的概念與 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。
  • 如果已經修改並希望過載伺服器引數設定,並且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資料不同步。