1. 程式人生 > >Hawq學習筆記 --- 構建於HDFS之上的Greenplum(實時查詢引擎)

Hawq學習筆記 --- 構建於HDFS之上的Greenplum(實時查詢引擎)

2. HAWQ 結構

  HAWQ在結構仍然是Master-Slave的主從模式,典型的部署方式仍然是在Master伺服器上部署:HAWQ Master, HDFS Master, YARN ResouceManager, 在每一個SLAVE機器上部署: HAWQ segment, DataNode, NodeManager。具體結構看圖: 


下面是一張HAWQ的軟體元件圖: 


可以看出HAWQ包含了好幾個重要的元件,分別是: 
1. HAWQ Master 
  HAWQ Master是整個系統的介面,它負責接收客戶端查詢請求,解析SQL,優化查詢,分發和協調查詢的執行。當然作為老大,任務肯定不是這麼簡單的,它還得負責global system catalog

的管理工作。 
2. HAWQ Segment 
  Segments是並行處理資料的單元。每一個Slave機器上部署的HAWQ程式叫作物理Segment,而且第一臺Slave上只能部署一個物理Segment。一個物理Segment上可以執行多個虛擬Segment(一個查詢解析後的並行分片就是虛擬Segment).虛擬Segment的數量決定了一個查詢的並行度。 
3. HAWQ Interconnect 
  Segment之間的高速通訊網路,預設採用UDP協議,並且HAWQ軟體提供了針對UDP額外的資料包驗證。使其可靠性接近於TCP,但效能和可擴充套件性又比TCP好。HAWQ也可以使用TCP進行通訊,但有最大1000個Segment的限制。而使用UDP則沒有該限制。 
4. HAWQ Resource Manager 
  HAWQ資源管理用於從YARN獲取資源並響應資源請求。同時HAWQ會快取資源用於低延遲的查詢請求。除了使用YARN來管理資源外,HAWQ還可以使用自帶的資源管理器,而不需要YARN. 
5. HAWQ Catalog Service 
  元資料服務存在於HAWQ Master中。作用肯定就是用於儲存metadata.比如UDF,表資訊等。以及提供元資料的查詢服務。 
6. HAWQ Fault Tolerance Service 
  容錯服務自然就是針對各個Segment節點的狀態監控和失敗處理等工作。 
7. HAWQ Dispatcher 
  HAWQ分發器是則是分發查詢到指定的Segment上和coordinates上進行執行。

3. HAWQ 安裝


  如果你安裝過Greenplum,那麼你會發現HAWQ的安裝過程與Greenplum是極期相似,必竟它們兩可以說是不同儲存的版本。而整個安裝過程相對其它實時元件來說,還是比較繁瑣的。同時也可以看出來HAWQ是基於HDFS的獨立資料庫。而不像其它實時查詢元件除了HDFS,可能還需要依賴於其它Hadoop元件。 
  本文的測試環境為基於CDH 5.5的Hadoop叢集環境的安裝和測試。HAWQ的版本為:2.0.0, 另外HAWQ還可以使用Ambari圖形介面安裝。發竟安裝過程請看:


 1. 設定系統引數,更改檔案/etc/sysctl.conf,增加內容:

kernel.shmmax
= 1000000000 kernel.shmmni = 4096 kernel.shmall = 4000000000 kernel.sem = 250 512000 100 2048 kernel.sysrq = 1 kernel.core_uses_pid = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.msgmni = 2048 net.ipv4.tcp_syncookies = 0 net.ipv4.ip_forward = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_max_syn_backlog = 200000 net.ipv4.conf.all.arp_filter = 1 net.ipv4.ip_local_port_range = 1281 65535 net.core.netdev_max_backlog = 200000 vm.overcommit_memory = 50 fs.nr_open = 3000000 kernel.threads-max = 798720 kernel.pid_max = 798720 # increase network net.core.rmem_max=2097152 net.core.wmem_max=2097152
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

   然後使用命令sysctl -p生效 
 2. 更改檔案/etc/security/limits.conf,增加內容:

* soft nofile 2900000
* hard nofile 2900000
* soft nproc 131072
* hard nproc 131072
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
rpm -ivh epel-release-latest-6.noarch.rpm
  • 1
  • 1

 4. 選擇一臺伺服器上,配置HAWQ安裝的YUM源

#啟動httpd 服務,如果沒有安裝使用yum安裝並啟動:
service httpd start

#解壓hdb 包:
tar -xzvf hdb-2.0.0.0-22126.tar.gz
cd hdb-2.0.0.0 #進到解壓後的目錄
./setup_repo.sh #執行指令碼建立YUM源

#將生成的/etc/yum.repos.d/HDB.repo原始檔拷由到每臺叢集節點上
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

 5. 先只在主節點上安裝HAWQ:

yum install hawq
  • 1
  • 1

 6. 在主節點上建立主機名檔案

建立檔案 hostfile包含叢集所有主機(包含MASTER),如:
[root@master hzh]# cat hostfile 
master
slave2
slave3
slave4
5.建立檔案僅包含seg(Slave)主機,如:
[root@master hzh]# cat seg_hosts 
slave2
slave3
slave4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

 7. 打通各主機root使用者ssh

source /usr/local/hawq/greenplum_path.sh
hawq ssh-exkeys -f hostfile  #這裡的hostfile就是上面建立的那個檔案
  • 1
  • 2
  • 1
  • 2

 8. 然後在每個節點上安裝hawq:

source /usr/local/hawq/greenplum_path.sh
hawq ssh -f hostfile -e "yum install -y epel-release"
hawq ssh -f hostfile -e "yum install -y hawq"
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

 9. 在每個節點上增加gpadmin使用者,並設定密碼

hawq ssh -f hostfile -e '/usr/sbin/useradd gpadmin'
hawq ssh –f hostfile -e 'echo -e "changeme\changeme" | passwd gpadmin'
  • 1
  • 2
  • 1
  • 2

 10. 在主節點上切換到gpadmin 使用者,打通每個節點的ssh

su - gpadmin
source /usr/local/hawq/greenplum_path.sh
hawq ssh-exkeys -f hostfile
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

 11. 檢查安裝是否完成,在gpadmin使用者下執行:

hawq ssh -f hostfile -e "ls -l $GPHOME" #如有輸出目錄檔案則安裝成功
  • 1
  • 1

 12. 建立hawq的資料儲存目錄:

hawq ssh -f hostfile -e 'mkdir -p /hawq/master' #主節點目錄資料存放位置
hawq ssh -f hostfile -e 'mkdir -p /hawq/segment' #segment 節點資料存放目錄
hawq ssh -f hostfile -e 'mkdir -p /hawq/tmp' #spill臨時資料存放目錄,每臺伺服器可以建多個
hawq ssh -f hostfile -e 'chown -R gpadmin /hawq'
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

 13.編輯hawq-site.xml檔案在 $GP_HOME/etc/, 如果檔案不存在,直接從template-hawq-site.xml複製一個出來就是,屬性設定包括:

<property>
        <name>hawq_dfs_url</name>
        <value>localhost:8020/hawq</value> # hdfs的URL, 也可以設定成HDFS HA: <value>hdpcluster/hawq</value>
                                #注意前面不要帶hdfs://字首
        <description>URL for accessing HDFS.</description>
    </property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

另外還要包括屬性:

Property Example Value
hawq_master_address_host mdw
hawq_master_address_port 5432
hawq_standby_address_host smdw
hawq_segment_address_port 40000
hawq_master_directory /data/master
hawq_segment_directory /data/segment
hawq_master_temp_directory /data1/tmp,/data2/tmp
hawq_segment_temp_directory /data1/tmp,/data2/tmp
hawq_global_rm_type none

* 注意如果你需要安裝HAWQ在 secure mode (Kerberos-enabled),則需要設定hawq_global_rm_type為none,來避開已知的安裝問題。 這裡設定為none,就是沒有采用YARN來作資源管理,而使用了自帶的標準模式。

 14. 建立HDFS /hawq資料目錄

hadoop fs -mkdir /hawq
hadoop fs -chown gpadmin /hawq
  • 1
  • 2
  • 1
  • 2

 15. 建立 $GPHOME/etc/slaves檔案包含所有segment機器的主機名,如:

[root@master etc]# cat slaves 
slave2
slave3
slave4
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

 16.如果HDFS是使用的HA模式,則需要在${GPHOME}/etc/hdfs-client.xml下配置一個hdfs-client.xml檔案。幸好這裡是單機,少配一個.

 17. 將以上的hawq-site.xml slaves hdfs-client.xml檔案拷貝到叢集的每個節點上。

 18. 準備工作終於作完了,接下來開始幹正事了,初始化HAWQ

chown -R gpadmin /usr/local/hawq-2.0.0.0  #先要給安裝目錄授權,在每一臺
#僅在主節點上,使用gpadmin 使用者執行:
hawq init cluster
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

  初始後後,HAWQ就安裝完成啦,你可以使用以下命令檢查叢集狀態:

[gpadmin@master ~]$ hawq state
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--HAWQ instance status summary
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:------------------------------------------------------
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Master instance                                = Active
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   No Standby master defined                           
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total segment instance count from config file  = 3
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:------------------------------------------------------ 
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Segment Status                                    
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:------------------------------------------------------ 
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total segments count from catalog      = 3
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total segment valid (at master)        = 3
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total segment failures (at master)     = 0
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total number of postmaster.pid files missing   = 0
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total number of postmaster.pid files found     = 3

4. 使用HAWQ

  在HAWQ的使用上跟Greenplum基本就一樣一樣的了。比如: 
 1. 建立表空間

#選建立filespace,生成配置檔案
[gpadmin@master ~]$ hawq filespace -o hawqfilespace_config
Enter a name for this filespace
> hawqfs
Enter replica num for filespace. If 0, default replica num is used (default=3)
> 0

Please specify the DFS location for the filespace (for example: localhost:9000/fs)
location> master:8020/fs
#執行建立
[gpadmin@master ~]$ hawq filespace --config ./hawqfilespace_config 
Reading Configuration file: './hawqfilespace_config'

CREATE FILESPACE hawqfs ON hdfs 
('slave2:8020/fs/hawqfs')
20161121:11:26:25:122509 hawqfilespace:master:gpadmin-[INFO]:-Connecting to database
20161121:11:27:38:122509 hawqfilespace:master:gpadmin-[INFO]:-Filespace "hawqfs" successfully created

#再建立表空間
[gpadmin@master ~]$ psql template1
psql (8.2.15)
Type "help" for help.

template1=# 
template1=# CREATE TABLESPACE hawqts FILESPACE hawqfs;
CREATE TABLESPACE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

 2. 建立資料庫

template1=# CREATE DATABASE testdb WITH TABLESPACE=hawqts; #指定儲存表空間為hawqts
CREATE DATABASE
  • 1
  • 2
  • 1
  • 2

 3. 建立表到新的資料庫中

[[email protected] ~]$ psql testdb  //這裡指定連線到新的資料庫中
testdb=# create TABLE books( 
testdb(#   id integer
testdb(#   , isbn varchar(100)
testdb(#   , category varchar(100)
testdb(#   , publish_date TIMESTAMP
testdb(#   , publisher varchar(100)
testdb(#   , price money 
testdb(# ) DISTRIBUTED BY (id);  #指定表的資料打雜湊 
CREATE TABLE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  建立的表預設都建立在了public schema中,也就是所有使用者都可以訪問,但可以在建表時指定schema. 如: testschema.books 
 4. 載入資料檔案到表中

testdb=# COPY books(id,isbn,category,publish_date,publisher,price) 
testdb-# FROM '/tmp/books'
testdb-# WITH
testdb-# DELIMITER AS '|'
testdb-# ;
COPY 15970428
Time: 41562.606 ms
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  載入速度達到了 380248條/秒. 還是不錯的 
 5. 查詢表, HAWQ作為主用於資料倉庫的資料庫在SQL支援方面非常豐富,在標準SQL基礎上,還支援OLAP的視窗函式,視窗函式等。

testdb=# SELECT COUNT(*) FROM books;
  count   
----------
 15970428
(1 row)

Time: 4750.786 ms
//求每個類別下的最高價,最低價
testdb=# SELECT category, max(price) max_price, min(price) min_price
testdb-# FROM books
testdb-# group by category
testdb-# LIMIT 5;
    category    | max_price | min_price 
----------------+-----------+-----------
 COMPUTERS      |   $199.99 |     $5.99
 SELF-HELP      |   $199.99 |     $5.99
 COOKING        |   $199.99 |     $5.99
 SOCIAL-SCIENCE |   $199.99 |     $5.99
 SCIENCE        |   $199.99 |     $5.99
(5 rows)

Time: 4755.163 ms
//求每類別下的最高,最小价格,及對應的BOOK ID
testdb=# SELECT category
testdb-#  , max(case when desc_rn = 1 then id end) max_price_id, max(case when desc_rn = 1 then id end) max_price
testdb-#  , max(case when asc_rn = 1 then id end) min_price_id, max(case when asc_rn = 1 then id end) min_price
testdb-# FROM (
testdb(#  SELECT id, category, price
testdb(#   , row_number() over(PARTITION BY category ORDER BY price desc) desc_rn
testdb(#   , row_number() over(PARTITION BY category ORDER BY price asc) asc_rn
testdb(#  FROM books
testdb(# ) t
testdb-# WHERE desc_rn = 1 or asc_rn = 1
testdb-# GROUP BY category
testdb-# limit 5;
    category    | max_price_id | max_price | min_price_id | min_price 
----------------+--------------+-----------+--------------+-----------
 CRAFTS-HOBBIES |        86389 |   $199.99 |      7731780 |     $5.99
 GAMES          |      5747114 |   $199.99 |     10972216 |     $5.99
 STUDY-AIDS     |      2303276 |   $199.99 |     13723321 |     $5.99
 ARCHITECTURE   |      9294400 |   $199.99 |      7357451 |     $5.99
 POETRY         |      7501765 |   $199.99 |       554714 |     $5.99
(5 rows)

Time: 23522.772 ms

5. 使用HAWQ查詢HIVE資料

  HAWQ是一個基於HDFS的一個獨立的資料庫系統,若需要訪問