HAWQとは
HAWQはPivotalが開発したHadoop上で動作するSQL実行エンジンです。
現在はApacheに寄贈され、Apache HAWQとして公開されています。
HAWQに近い位置付けのものには、Clouderaが主導するImpalaがあります。
HAWQの中身はPostgreSQLをベースに分散環境に対応したGreenplumをHadoopに対応したものと考えればよいと思います。
PostgreSQLをベースにしていることから、数あるSQL on Hadoopの中でもSQLへの準拠レベルが高いことが特徴になっています。
詳細はEnterprise SQL on Hadoop with Pivotal HDBが参考になります。
PivotalとODPi
ODPiはHadoopの相互運用性を目的としてHortonworks、Pivotalを中心に設立された団体です。
Hadoopはディストリビューションが乱立していて、それぞれが独自の機能を組み込むため、相互運用性が危うくなっています。
そのような状況の中、コア仕様を定義することで相互運用性を維持しようというのがODPiの趣旨です。
しかし実態は、ODPiの各社がHortonworksのHDPをOEMとして採用する状況にあり、マーケティング戦略であるとの批判があります。
実際、Pivotalは自身のディストリビューションであるPivotal HDをHDPベースに切り替えています。
そのような事情から、HAWQはPivotal HDやHDPへ容易にインストールすることができます。1
インストールはプロビジョニング/管理ツールであるAmbariを使用して、ウィザードに従ってクリックしていくだけです。
HAWQをインストールする前に
HAWQはHadoop上で動作するSQL実行エンジンなので、ClouderaのCDHでも動作するはずです。
しかし、AmbariがHDPにしか対応していないため2、Ambariを使ってCDHのHadoopクラスタにインストールすることができません。
そこで今回はHAWQを手動でインストールすることにします。
HAWQはビルド環境を整えるのも一苦労なので、Pivotalが配布しているPivotal HDBを使用します。
なお、ダウンロードにはPivotal Networkへの登録が必要です。
HAWQのインストール
HAWQを手動でインストールする方法はInstalling HAWQ from the Command Lineに書かれています。
多少、空気を読んで手順を飛ばしたり、追加したりしながら進めます。
まず始めに、マスタに最低限の環境を構築します。
これはマスタの資材を、pssh/pscpのようなツールを用いて、スレーブにインストールするためです。
このツールを使うために、最初のインストールが必要なわけです。
ダウンロードしたtarファイルを解凍してrpmをインストールします。
gpadminユーザー/グループが無いという警告は無視して構いません。
# tar xvf PADS-1.3.1.1-19631-rhel5_x86_64.tgz
# rpm -ivh PADS-1.3.1.1/hawq-1.3.1.1-19631.x86_64.rpm
HAWQのスクリプトを.bash_profileに追加します。
# echo . /usr/local/hawq/greenplum_path.sh >> .bash_profile
# . .bash_profile
全ノードにHAWQをインストールします。ホスト名の一覧を用意して、まとめてインストールを行います。(マスタにHAWQを2回インストールしていますが、気にしないことにします...)
この過程で、鍵交換によりrootユーザーのパスワードレスログインが許可されます。
# mkdir /opt/servers
# vi /opt/servers/all_hosts
hawq-ma01 # マスタ
hawq-sl01 # スレーブ
hawq-sl02 # 〃
:
# gpssh-exkeys -f /opt/servers/all_hosts
# gpscp -f /opt/servers/all_hosts PADS-1.3.1.1/hawq-1.3.1.1-19631.x86_64.rpm =:~/
# gpssh -f /opt/servers/all_hosts -e "rpm -ivh hawq-1.3.1.1-19631.x86_64.rpm"
gpadminユーザーを作成します。
Hadoopと連携して動かす場合は、hadoopグループに所属したほうが使い勝手がよいです。
パスワードはご自由に変更してください。
# gpssh -f /opt/servers/all_hosts -e 'useradd -d /home/gpadmin -s /bin/bash -g hadoop -m gpadmin'
# gpssh -f /opt/servers/all_hosts -e 'echo -e "gpadmin\ngpadmin" | passwd gpadmin'
gpadminユーザーにsuして.bash_profileにパスの設定を行います。
ここでgpadminユーザーのパスワードレスログインが許可されます。
# su - gpadmin
$ source /usr/local/hawq/greenplum_path.sh
$ gpssh-exkeys -f /opt/servers/all_hosts
$ gpssh -f /opt/servers/all_hosts -e "echo . /usr/local/hawq/greenplum_path.sh >> .bash_profile"
インストールができたか確認しましょう。
$ gpssh -f /opt/servers/all_hosts -e "ls -l $GPHOME"
bin
:
ディレクトリの作成
HAWQが使用するローカルディレクトリを作成します。
-
マスタのディレクトリ
NameNodeのメタデータを格納しているディレクトリに、HAWQ用のディレクトリを用意します。# vi /opt/servers/master_hosts hawq-ma01 # マスタ # gpssh -f /opt/servers/master_hosts -e 'mkdir -p /hadoop/data/hawq/master' # gpssh -f /opt/servers/master_hosts -e 'chown -R gpadmin /hadoop/data/hawq/master'
-
スレーブのディレクトリ
DataNodeのデータディレクトリに、HAWQ用のディレクトリに用意します。
スレーブのディスク数に合わせてディレクトリを作成します。# vi /opt/servers/slave_hosts hawq-sl01 # スレーブ hawq-sl02 # 〃 : # gpssh -f /opt/servers/slave_hosts -e 'mkdir -p /hadoop/data{0,1,2,3}/hawq/tmp' # gpssh -f /opt/servers/slave_hosts -e 'chown -R gpadmin /hadoop/data{0,1,2,3}/hawq/tmp' # gpssh -f /opt/servers/slave_hosts -e 'mkdir -p /hadoop/data{0,1,2,3}/hawq/primary' # gpssh -f /opt/servers/slave_hosts -e 'chown -R gpadmin /hadoop/data{0,1,2,3}/hawq/primary'
作成したディレクトリを確認します。
# gpssh -f /opt/servers/master_hosts -e "ls -l /hadoop/data/hawq"
master
# gpssh -f /opt/servers/slave_hosts -e "ls -l /hadoop/data{0,1,2,3}/hawq"
primary
tmp
:
OSの設定
Set the OS Parametersを参考に、全ノードに対してOSの設定を変更します。
マスタの設定を変更してからスレーブにコピーします。
# vi /etc/sysctl.conf
kernel.shmmax = 500000000
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 = 1025 65535
net.core.netdev_max_backlog = 200000
vm.overcommit_memory = 2
fs.nr_open = 3000000
kernel.threads-max = 798720
kernel.pid_max = 798720
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
# gpscp -f /opt/servers/slave_hosts /etc/sysctl.conf =:/etc
# vi /etc/security/limits.d/hawq.conf
gpadmin soft nofile 65536
gpadmin hard nofile 65536
gpadmin soft nproc 131072
gpadmin hard nproc 131072
# gpscp -f /opt/servers/slave_hosts /etc/security/limits.d/hawq.conf =:/etc/security/limits.d/
設定を反映するにはOSの再起動が必要です。
なお、OSの設定を変更したくない場合でも、"kernel.sem"だけは設定します。
これは「could not create semaphores: No space left on device」を避けるためです。(PostgreSQLのドキュメントが詳しいです)
HAWQの初期化
初期設定ファイルをインストールディレクトリからコピーして修正します。
# su - gpadmin
$ mkdir gpconfigs
$ cp /usr/local/hawq/docs/cli_help/gpconfigs/gpinitsystem_config ~/gpconfigs/
$ chmod u+w ~/gpconfigs/gpinitsystem_config
$ vi ~/gpconfigs/gpinitsystem_config
:
declare -a DATA_DIRECTORY=(/hadoop/data0/hawq/primary /hadoop/data0/hawq/primary /hadoop/data1/hawq/primary /hadoop/data1/hawq/primary /hadoop/data2/hawq/primary /hadoop/data2/hawq/primary /hadoop/data3/hawq/primary /hadoop/data3/hawq/primary)
# HAWQのデータディレクトリ。スレーブの台数 x ディレクトリ数分繰り返す
MASTER_HOSTNAME=hawq-ma01 # HAWQのマスタのホスト名
MASTER_DIRECTORY=/hadoop/data/hawq/master # HAWQのマスタのディレクトリ
DFS_URL=hawq-ma01:8020/hawq # HAWQのHDFS上のディレクトリへのURL
DATABASE_NAME=hawq_db # HAWQのDB名。後でcreatedbで作成することもできる
MACHINE_LIST_FILE=/opt/servers/slave_hosts # スレーブの一覧を記述したファイル
NameNode HAを使用している場合は、初期化の前に設定を変更します。
なお、HAWQ自身はHAの仕組みがなく、PostgreSQLと同じ方式で実現するようです。1
$ vi ~/gpconfigs/gpinitsystem_config
DFS_URL=nn-cluster/hawq # NameServiceIDに変更する
# vi /usr/local/hawq/etc/hdfs-client.xml
<!-- HA -->
<property>
<name>dfs.nameservices</name>
<value>nn-cluster</value>
</property>
<property>
<name>dfs.ha.namenodes.nn-cluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nn-cluster.nn1</name>
<value>hawq-ma01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nn-cluster.nn2</name>
<value>hawq-ma02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.nn-cluster.nn1</name>
<value>hawq-ma01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.nn-cluster.nn2</name>
<value>hawq-ma02:50070</value>
</property>
# gpscp -f /opt/servers/all_hosts /usr/local/hawq/etc/hdfs-client.xml =:/usr/local/hawq/etc
HDFS上にHAWQのディレクトリを用意します。
# su - hdfs
$ hdfs dfs -mkdir /hawq
$ hdfs dfs -chown gpadmin /hawq
$ hdfs dfs -mkdir /user/gpadmin
$ hdfs dfs -chown gpadmin /user/gpadmin
いよいよHAWQの初期化を実行します!
# su - gpadmin
$ gpinitsystem -c ~/gpconfigs/gpinitsystem_config
:
Continue with Greenplum creation Yy/Nn>
y
ちなみに初期化の破棄は以下のコマンドです。
エラーが発生して初期化をやり直す場合に使用します。
$ /bin/bash /home/gpadmin/gpAdminLogs/backout_gpinitsystem_gpadmin_yyyyMMdd_hhmmss # yyyyMMdd_hhmmssは初期化した日付
初期化後の設定
.bash_profileに環境変数を追加します。
# su - gpadmin
$ vi ~/.bash_profile
export MASTER_DATA_DIRECTORY=/hadoop/data/hawq/master/gpseg-1
Prepare HDFSを参考にHadoopクラスタの設定を見直します。
ポイントはショートサーキットリードを有効にするところです。
中でも最近のHadoopでは不要な"dfs.block.local-path-access.user"が必要です。
# vi /etc/hadoop/conf/hdfs-site.xml
:
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.block.local-path-access.user</name>
<value>gpadmin</value>
</property>
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>750</value>
</property>
任意のクライアントからHAWQのマスタへの接続を許可する場合はpg_hba.confを修正します。
PostgreSQLと同じですね。
# vi /hadoop/data/hawq/master/gpseg-1/pg_hba.conf
:
#host all gpadmin 172.27.1.102/32 trust
host all gpadmin 172.27.1.0/24 trust
HAWQの利用
初期化のタイミングでHAWQが起動しているので、すでに利用できます。
hawq_dbデータベースも作成されています。
# su - gpadmin
$ vi t_user.csv
1 ajis_ka
2 adachij2002
3 takeuchikzm
$ psql hawq_db
hawq_db=#
CREATE TABLE t_user
(
id INTEGER,
name TEXT
)
WITH (appendonly=true) DISTRIBUTED RANDOMLY;
CREATE TABLE
hawq_db=# COPY t_user FROM '/home/gpadmin/t_user.csv' DELIMITER E'\t';
COPY 3
hawq_db=# SELECT * FROM t_user ORDER BY id;
id | name
----+-------------
1 | ajis_ka
2 | adachij2002
3 | takeuchikzm
(3 rows)
動きました!
次回予告
ここまでで気付いた人もいると思うのですが、HAWQはHDFS上の特定のディレクトリ(今回なら/hawq)を専用に使用します。
# sudo -u hdfs hdfs dfs -ls /hawq
drwx------ - gpadmin supergroup 0 2016-04-22 22:23 /hawq/gpseg0
drwx------ - gpadmin supergroup 0 2016-04-22 22:23 /hawq/gpseg1
:
HDFSの他のファイルは読めないのでしょうか?
Hiveとの連携は?
その答えはPXF(Pivotal eXtension Framework)にあります。
次回はPXFをインストールして、HDFS上のファイルやHiveとの連携を試してみたいと思います。
追記
PXFについて続きを書きました。