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的一個獨立的資料庫系統,若需要訪問