Pivotal HDP + HAWQ上で機械学習ライブラリMADlibを試してみる（１）

##はじめに##
機械学習ライブラリであるMADlibを試すために、Pivotal HDP + HAWQの環境を準備します。
Pivotalは、2016/3でPivotal HDの提供を終了し、HortonworksのHDPを提供していくようです。
HAWQ(β)、MADlibともにHDPに対応した新バージョンが提供されています。

今回は下記バージョンを導入します。HDP、HAWQのデプロイには自動デプロイ&管理ツールであるAmbariを使用しました。サポートマトリクスは下記URLにあります。
https://network.pivotal.io/products/pivotal-hdp

OS:CentOS 6.7
Ambari:2.2.2
HDP:2.4
HAWQ:2.0.0
MADlib:1.9

##Ambariインストール##
ntp,hosts,selinux,iptables,ulimit,sshなどの事前準備は
ドキュメントに書いてあるので省略します。
ambariレポジトリを追加した後、yumコマンドでインストールします。

```
wget -nv http://public-repo-1.hortonworks.com/ambari/centos6/2.x/updates/2.2.2.0/ambari.repo -O /etc/yum.repos.d/ambari.repo

cat /etc/yum.repos.d/ambari.repo
#VERSION_NUMBER=2.2.2.0-460

[Updates-ambari-2.2.2.0]
name=ambari-2.2.2.0 - Updates
baseurl=http://public-repo-1.hortonworks.com/ambari/centos6/2.x/updates/2.2.2.0
gpgcheck=1
gpgkey=http://public-repo-1.hortonworks.com/ambari/centos6/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins
enabled=1
priority=1

yum install ambari-server
```

依存関係でpostgresqlもインストールされます。

```
 postgresql
 postgresql-libs
 postgresql-server 
```

インストールが終わったらambariサーバのセットアップを行います。
今回は、インターネットに接続できる環境でしたのでJDKはセットアップコマンド内で自動的に選択したバージョンがダウンロード、インストールされます。
インターネットに接続していない場合は、JDKとJCEを事前にダウンロードし、/var/lib/ambari-server/resourcesに保存して、「[3] Custom JDK」を選択するようです。postgresqlもデフォルトのままインストールしました。

```
ambari-server setup

Customize user account for ambari-server daemon [y/n] (n)? 

[1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8
[2] Oracle JDK 1.7 + Java Cryptography Extension (JCE) Policy Files 7
[3] Custom JDK
Enter choice (1): 

Enter advanced database configuration [y/n] (n)? 

```

Ambariのセットアップ後、Ambariを起動します。

```
ambari-server start
```

##HDPインストール##
http://≪ambari-server≫:8080にアクセスし、デフォルトの場合はadmin/adminでログインできます。
![WS000000.png](https://qiita-image-store.s3.amazonaws.com/0/121147/31273aa6-c7fa-ba56-1f7f-31e37b2ed2b0.png)

「Launch Install Wizard」にてCluster名を入力、インストールするバージョン(今回はHDP2.4を選択)とOSに合わせてリポジトリを指定後に下記のようにクラスタを組むTarget Hostを指定し、Private Keyを入力します。
その後、Target Hostのレジストリが開始されます。
今回は、NameServer 2台、DataNode 3台、Ambari 1台という構成です。
![WS000006.png](https://qiita-image-store.s3.amazonaws.com/0/121147/1c518494-b639-ea21-a952-a95c27e51409.png)

Clusterにインストールするサービスを選択します。
Pivotal HDPになったことでHortonworksのサービス名とSparkなどが新たに選択できるサービスとして増えた印象です。
この時点では、まだHAWQはサービス一覧にありません。

![WS000010.png](https://qiita-image-store.s3.amazonaws.com/0/121147/47ab735b-1142-c993-8a84-90daebc4f61f.png)

サービスの選択後は、各MasterやStandby MasterをどのTarget Hostに配置させるか構成を選択することができます。
Ambari 2.2.2からはGrafanaが追加されていました。
![WS000012.png](https://qiita-image-store.s3.amazonaws.com/0/121147/0aebdf43-fefe-2869-ebb5-908a966ff37e.png)

Clientの選択は、次の設定画面で選択できます。
![WS000015.png](https://qiita-image-store.s3.amazonaws.com/0/121147/1745b8c7-665d-da1d-1a16-c612b8a22cff.png)

各サービスが指定したTarget Hostに自動インストールされます。
インストールに失敗した場合は、ログも確認できます。
![WS000020.png](https://qiita-image-store.s3.amazonaws.com/0/121147/72e576de-64e9-1c4e-912e-75fdb11e945d.png)

インストールが完了するとClusterのダッシュボードが表示されます。
自動デプロイも簡単ですが、運用も楽ですね。
パラメータ変更、サービス再起動、ホストのローリングリスタートもAmbariから行えます。
![WS000021.png](https://qiita-image-store.s3.amazonaws.com/0/121147/bdc00e1e-cc2c-ee7b-554e-680933486dad.png)

##HAWQインストール##
次にHAWQのインストール準備をします。
事前にHAWQ、HAWQ-pluginをダウンロードした上でAmbariサーバ上でHAWQレポジトリの作成を行います。

```
tar -zxvf /tmp/hdb-2.0.0.0-22126.solitairetheme8 -C /staging/
./setup_repo.sh

tar -zxvf /tmp/hdb-ambari-plugin-2.0.0-448.solitairetheme8 -C /staging/
./setup_repo.sh

ls -l /etc/yum.repos.d/
 -rw-r--r--  1 root root  108 Apr 25 17:11 hawq-plugin-hdp-2.0.0.repo
 -rw-r--r--  1 root root   78 Apr 25 17:11 PIVOTAL-HDB.repo

yum install haqwq-plugin
./var/lib/hawq//add_hdb_repo.py -u admin -p admin
 The repo information was updated successfully in the Ambari database.
 Please restart ambari-server for the repo settings to take effect.

ambari-server restart
```

ブラウザでAmbariにログインし、「Action」→「Add Service」を選択すると
サービス一覧で下記のように「HAWQ」と「PXF」が選択できるようになります。
![WS000023.png](https://qiita-image-store.s3.amazonaws.com/0/121147/d8ecf59c-7297-a375-56d8-be1a99856fae.png)

HAWQ MasterとHAWQ Segmentの配置は、Cluster作成時と同様に選択できます。
Ambari上にHAWQ、PXFサービスが表示されます。
HAWQ、PXFインストール後は、HDFS、MapReduce2、YARNを再起動します。
（私の環境ではサービスコンポーネントは、HDFS、MapReduce2、YARN、HAWQ、PXF、Zookeeper、AmbariMetricsのみです）
HAWQ起動時にエラーで起動できなかったのですが、HDFSサービスのconfigを修正する必要があります。修正、追加するパラメータはドキュメントに一覧になっています。
dfs.allow.truncateは、defaultでtrueだったような。。。明示的に追加してあげないとエラーで起動しませんでした。
HAWQ 2.0 Release版からは、「Advanced hdfs-site」にdfs.allow.truncate=trueが自動で入るようになりました。

![WS000031.png](https://qiita-image-store.s3.amazonaws.com/0/121147/5bb5b533-7993-87c9-5465-a156efe3066f.png)

HAWQ、PXFインストール後にHAWQ Masterにてgpadminで環境変数をセットします。
えらい大量の環境変数がセットされています。

```
su - gpadmin

source /usr/local/hawq/greenplum_path.sh

printenv
HOSTNAME=namenode-02.inv
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
LIBYARN_CONF=/usr/local/hawq/./etc/yarn-client.xml
GPHOME=/usr/local/hawq/.
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
USER=gpadmin
LD_LIBRARY_PATH=/usr/local/hawq/./lib:/usr/local/hawq/./ext/python/lib:
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
LIBHDFS3_CONF=/usr/local/hawq/./etc/hdfs-client.xml
HAWQSITE_CONF=/usr/local/hawq/./etc/hawq-site.xml
MAIL=/var/spool/mail/gpadmin
PATH=/usr/local/hawq/./bin:/usr/local/hawq/./ext/python/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/gpadmin/bin
PWD=/home/gpadmin
LANG=en_US.UTF-8
PYTHONHOME=/usr/local/hawq/./ext/python
HISTCONTROL=ignoredups
SHLVL=1
HOME=/home/gpadmin
OPENSSL_CONF=/usr/local/hawq/./etc/openssl.cnf
PYTHONPATH=/usr/local/hawq/./lib/python:/usr/local/hawq/./lib/python/pygresql:
LOGNAME=gpadmin
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
LESSOPEN=||/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/usr/bin/printenv

psql -d postgres
psql (8.2.15)
Type "help" for help.
```

Ambariは、APIによる設定、情報取得も可能です。

```
curl -u admin:admin -i -H 'X-Requested-By: ambari' -X GET http://≪ambari-server≫:8080/api/v1/
clusters/test/services/HDFS

 HTTP/1.1 200 OK
 X-Frame-Options: DENY
 X-XSS-Protection: 1; mode=block
 User: admin
 Set-Cookie: AMBARISESSIONID=2r2kmwisk3138p2aj32qedsg;Path=/;HttpOnly
 Expires: Thu, 01 Jan 1970 00:00:00 GMT
 Content-Type: text/plain
 Vary: Accept-Encoding, User-Agent
 Content-Length: 10668
 Server: Jetty(8.1.17.v20150415)

{
  "href" : "http://≪ambari-server≫:8080/api/v1/clusters/test/services/HDFS",
  "ServiceInfo" : {
    "cluster_name" : "test",
    "maintenance_state" : "OFF",
    "service_name" : "HDFS",
    "state" : "STARTED"
  },
  "alerts_summary" : {
    "CRITICAL" : 0,
    "MAINTENANCE" : 0,
    "OK" : 25,
    "UNKNOWN" : 0,
    "WARNING" : 0
  },

・・・
```

```
curl -u admin:admin -i -H 'X-Requested-By: ambari' -X GET http://≪ambari-server≫:8080/api/v1/clusters/test/services/HAWQ

 HTTP/1.1 200 OK
 X-Frame-Options: DENY
 X-XSS-Protection: 1; mode=block
 User: admin
 Set-Cookie: AMBARISESSIONID=qtl1iogbmji81utym29vk2lvs;Path=/;HttpOnly
 Expires: Thu, 01 Jan 1970 00:00:00 GMT
 Content-Type: text/plain
 Vary: Accept-Encoding, User-Agent
 Content-Length: 1196
 Server: Jetty(8.1.17.v20150415)

{
  "href" : "http://≪ambari-server≫:8080/api/v1/clusters/test/services/HAWQ",
  "ServiceInfo" : {
    "cluster_name" : "test",
    "maintenance_state" : "OFF",
    "service_name" : "HAWQ",
    "state" : "STARTED"
  },
  "alerts_summary" : {
    "CRITICAL" : 0,
    "MAINTENANCE" : 0,
    "OK" : 0,
    "UNKNOWN" : 0,
    "WARNING" : 0
  },

・・・
```

長くなりましたので、次回MADlibインストールから記述したいと思います。
続きは、[Pivotal HDP + HAWQ上で機械学習ライブラリMADlibを試してみる（２）](http://qiita.com/K_wata/items/4ea34bdc707b8478caa4)です。