AmbariによるStormクラスタのプロビジョニング

この記事は [Hortonworks Advent Calendar 2016](http://qiita.com/advent-calendar/2016/hortonworks) の12/12（月）のエントリーとして投稿しています。

HDP（Hortonworks Data Platform）のコンポーネントの一部である Apache Ambari を利用して、AWSのEC2上で Apache Storm のクラスタをプロビジョニングすることをやってみます。
今回は、Storm を対象にしていますが、Hadoop／Spark／Kafkaなども同様の手順で実施できます。

#概要
まずはじめに、今回利用するコンポーネントの簡単な説明。どちらもHDPに含まれるOSSです。

| 名称 | ロゴ | 説明 |
|:--|:-:|:--|
|Ambari|![ambari_logo.png](https://qiita-image-store.s3.amazonaws.com/0/22893/6811e363-5c9c-c05c-b5ae-701338d59592.png)|HDPにおけるクラスタマネージャ。HadoopだけでなくHDPで扱うコンポーネントに関して、クラスタの作成、設定の管理、モニタリング等の総合的な管理が行える。|
|Storm|![storm_logo.png](https://qiita-image-store.s3.amazonaws.com/0/22893/5e33d547-860e-0fc8-2a66-1363232bcb44.png)|スケーラブルで高速な分散ストリームデータ処理エンジン。Twitter社からOSSとして公開された、分散ストリームデータ処理エンジンの先駆け的存在。|

Ambariを利用することで、Stormを手動でインストールや設定する必要がなくなり、半自動でクラスタの構築や設定の管理を行えるようになります。

##構成
今回は、EC2上に構築しており、以下のような内容としています。

![hdp-cluster (1).png](https://qiita-image-store.s3.amazonaws.com/0/22893/a3e74bdb-d3b0-0647-b905-6a8e2ce86a39.png)

##前提条件
本記事の前提として、以下のことを想定しています。

- AWSのアカウントを持っており、VPCやEC2に関する基本的な知識を有していること。
- Ambari2.4.2を利用する（2016/12/12時点の最新）。
- 本記事の操作環境は、macOS Sierra(10.12)を利用している。

#AWSの事前準備

##VPCの作成

最初にクラスタを所属させるVPCを作成します。
AWSのコンソールから「VPC」の画面へ行き、「VPC ウィザードの開始」ボタンを押下してください。
ウィザードが開始されたら、**「パブリックとプライベート サブネットを持つ VPC」**を選択して、必要な内容を登録します。ここでのアドレスブロックは「10.0.0.0/16」としています。

![vpc01.png](https://qiita-image-store.s3.amazonaws.com/0/22893/6dd841a4-1c80-e548-9e0e-7aba555ce5b1.png)

![vpc02.png](https://qiita-image-store.s3.amazonaws.com/0/22893/2190b2e2-c4cd-4fcd-6ee7-95006beb01a6.png)

##セキュリティグループの作成

セキュリティグループとしては、以下のような内容を指定したものを作成します。

- インバウンド

| タイプ | プロトコル | ポート範囲 | 送信元 |
|:--|:--|:--|:--|
|SSH|TCP|22|MyIP|
|HTTP|TCP|80|MyIP|
|カスタムTCPルール|TCP|8080|MyIP|
|すべてのTCP|TCP|0-65535|同一のセキュリティグループ内|
|すべてのUDP|UDP|0-65535|同一のセキュリティグループ内|

- アウトバウンド

| タイプ | プロトコル | ポート範囲 | 送信元 |
|:--|:--|:--|:--|
|すべてのトラフィック|すべて|すべて|0.0.0.0/0|

#Ambariサーバのインストール

##Ambariサーバ用のインスタンス作成

ここでは、Amazon Linux AMI を利用してインスタンスを作成します。
![ambari-instance01.png](https://qiita-image-store.s3.amazonaws.com/0/22893/1aab8126-4362-fd4d-8c76-00246199fd0f.png)

![ambari-instance02.png](https://qiita-image-store.s3.amazonaws.com/0/22893/a2bfb66c-e9cc-85b3-778a-ac0300b2b25f.png)

ネットワークを指定しますが、予め用意しておいたVPCを利用してください。
また、Ambariサーバは、**パブリックなサブネット**に配置します。
![ambari-instance03.png](https://qiita-image-store.s3.amazonaws.com/0/22893/d33cb51a-3519-4cd6-1049-b52603230d88.png)

ストレージのサイズは、30GBとしていますが、実際の運用では適宜サイズを指定してください。
![ambari-instance04.png](https://qiita-image-store.s3.amazonaws.com/0/22893/41622704-0c0e-564a-80b1-5c0d822d4b8e.png)

分かりやすいように「ambari-server」とタグを付けておきます。
![ambari-instance05.png](https://qiita-image-store.s3.amazonaws.com/0/22893/5ef2e696-455e-160b-b255-62ba4a6bbffb.png)

予め用意しておいたセキュリティグループを指定します。
![ambari-instance06.png](https://qiita-image-store.s3.amazonaws.com/0/22893/346dcc96-e3b1-06a8-e796-dce4b4b0207a.png)

キーペアは、既に作成しているものを選択します。新しく作成しても構いません。
サーバへのログインに必要になるため、大切に保管してください。
![ambari-instance07.png](https://qiita-image-store.s3.amazonaws.com/0/22893/0dd9f5a8-59b9-d109-8e4b-0fb5f7665e88.png)

これで、Ambariサーバ用のインスタンスが作成できました。
![ambari-instance08.png](https://qiita-image-store.s3.amazonaws.com/0/22893/0f5e1b8e-0471-c245-0243-7fb31c81e19f.png)

##ログイン確認・初期設定
作成したインスタンスにSSHログインします。

```bash
local$ ssh -i ./hdp-key.pem ec2-user@35.162.201.125
```

ログインに成功したら、サービスの設定を変更します。

```bash
$ sudo chkconfig iptables off
$ sudo chkconfig ip6tables off
$ sudo chkconfig ntpd on
$ sudo service ntpd start
```

ここで、このインスタンスをベースとしたイメージを作成しておきます。
これは、後でHDPのノードとして利用します。

![ambari-instance09.png](https://qiita-image-store.s3.amazonaws.com/0/22893/61634043-d896-95e0-3e74-fc066c266da7.png)

![ambari-instance10.png](https://qiita-image-store.s3.amazonaws.com/0/22893/6d9602cb-f659-5ea3-0c73-ec9502e652d7.png)

また、HDPのノードから、パスワードなしでログインできるようにしておくため、SCPで秘密鍵をアップロードします。アップロードしたファイルは、「id_rsa」というファイル名に変更して、「.ssh」ディレクトリの配下に配置します。

```bash
local$ scp -i ./hdp-key.pem ./hdp-key.pem ec2-user@35.162.201.125:~/.
local$ ssh -i ./hdp-key.pem ec2-user@35.162.201.125

$ mv ./hdp-key.pem ~/.ssh/id_rsa
```

##Ambariサーバのインストール

やっとAmabariサーバのインストールを開始するところまで来ました。
ここからは、Ambariサーバのインタンスにログインしての操作になります。

まず最初に、Ambariをインストールするために、HDPとして公開されているリポジトリの定義を追加します。

- [HDP 2.4 Repositories](https://docs.hortonworks.com/HDPDocuments/Ambari-2.2.2.0/bk_Installing_HDP_AMB/content/_hdp_24_repositories.html)

```bash
$ sudo wget -nv http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.4.1.0/ambari.repo -O /etc/yum.repos.d/ambari.repo
```

```
$ sudo yum install ambari-server

読み込んだプラグイン:priorities, update-motd, upgrade-helper
Updates-ambari-2.4.1.0                              | 2.9 kB     00:00
Updates-ambari-2.4.1.0/primary_db                   | 8.3 kB     00:00
amzn-main/latest                                    | 2.1 kB     00:00
amzn-updates/latest                                 | 2.3 kB     00:00
依存性の解決をしています
・・・
総ダウンロード容量: 663 M
インストール容量: 754 M

Is this ok [y/d/N]: y

Downloading packages:
・・・
http://public-repo-1.hortonworks.com/ambari/centos7/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins から鍵を取得中です。
Importing GPG key 0x07513CAD:
 Userid     : "Jenkins (HDP Builds) <jenkin@hortonworks.com>"
 Fingerprint: df52 ed4f 7a3a 5882 c099 4c66 b973 3a7a 0751 3cad
 From       : http://public-repo-1.hortonworks.com/ambari/centos7/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins

上記の処理を行います。よろしいでしょうか？ [y/N]y

Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
・・・
完了しました!
```

```
$ sudo ambari-server setup

Using python  /usr/bin/python
Setup ambari-server
Checking SELinux...
SELinux status is 'disabled'
Customize user account for ambari-server daemon [y/n] (n)?  y
input not recognized, please try again: 
Customize user account for ambari-server daemon [y/n] (n)? y
Enter user account for ambari-server daemon (root):
Adjusting ambari-server permissions and ownership...
Checking firewall status...
Checking JDK...
[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): 1

・・・
Successfully downloaded JCE Policy archive to /var/lib/ambari-server/resources/jce_policy-8.zip
Installing JCE policy...
Completing setup...
Configuring database...

Enter advanced database configuration [y/n] (n)? y
Configuring database...
==============================================================================
Choose one of the following options:
[1] - PostgreSQL (Embedded)
[2] - Oracle
[3] - MySQL / MariaDB
[4] - PostgreSQL
[5] - Microsoft SQL Server (Tech Preview)
[6] - SQL Anywhere
[7] - BDB
==============================================================================
Enter choice (1): 1
Database name (ambari): ambari
Postgres schema (ambari): ambari
Username (ambari): ambari
Enter Database Password (bigdata): 
Re-enter password: 

・・・
Adjusting ambari-server permissions and ownership...
Ambari Server 'setup' completed successfully.
```

```
$ sudo ambari-server start
```

Ambariにログインできることを確認します。
```http://<ambari-serverのホスト>:8080```にアクセスしてログイン画面が確認できればOKです。
![ambari-server01.png](https://qiita-image-store.s3.amazonaws.com/0/22893/c3852dee-1795-cd61-7276-67c582de8613.png)

デフォルトのログイン情報は以下になります。

|パラメータ|値|
|:--|:--|
|Username|admin|
|Password|admin|

#Stormのプロビジョニング

##Storm用のインスタンス作成

先程保存したAMIのイメージから、Stormクラスタ用のインスタンスを作成します。

![storm-instance01.png](https://qiita-image-store.s3.amazonaws.com/0/22893/f74e9e9d-cf35-9abf-6eba-00ce77ed92ba.png)

ここでは「t2.medium」を選択していますが、Stormを動作させるので、適宜大きいサイズのインスタンスを指定してください。
![storm-instance02.png](https://qiita-image-store.s3.amazonaws.com/0/22893/c4cef5bd-fa1d-9120-e646-9b51d2f12857.png)

ホストは、全部で5つ作成します。ホストの内容は、最初の構成図の通りです。
また、このホスト群は、**プライベートなサブネット**に配置します。
![storm-instance03.png](https://qiita-image-store.s3.amazonaws.com/0/22893/bacbadb4-cccc-768a-b480-19c459fb1534.png)

![storm-instance04.png](https://qiita-image-store.s3.amazonaws.com/0/22893/dc23c399-07ec-8dd7-e359-fdda111f18a6.png)

![storm-instance05.png](https://qiita-image-store.s3.amazonaws.com/0/22893/4c90fe38-fccd-7255-d74f-004e85cd48ee.png)

![storm-instance06.png](https://qiita-image-store.s3.amazonaws.com/0/22893/46d9d8a8-025e-472d-17e8-3d111a189e16.png)

これで、Stormクラスタ用のインスタンスが作成できました。
ここで作成されたホストの**「プライベートDNS」**をメモしておいてください。後ほど利用します。
![storm-instance07.png](https://qiita-image-store.s3.amazonaws.com/0/22893/2e88e0fc-5619-ec39-7706-82c17cc820b0.png)

##Stormのデプロイ

Ambariにログインして、Storm用のクラスタを作成します。

![ambari-cluster01.png](https://qiita-image-store.s3.amazonaws.com/0/22893/9a19648e-4ff1-76ad-3608-97b0960eb8fa.png)

最新版を選択します。
![ambari-cluster02.png](https://qiita-image-store.s3.amazonaws.com/0/22893/9a5684c2-cbb4-02eb-02c0-88629809897d.png)

**「Target Hosts」**では、Ambariからデプロイを行うHDPのノードを指定します。ここでは、先程メモしたEC2インスタンスのプライベートDNS（AWSのコンソールから確認できる）の値を、ホストの台数分指定してください。
**「Host Registration Information」**では、ホストにアクセスする際の秘密鍵を登録してください。また、ユーザアカウントは、デフォルトでは、"root"となっていますが、"ec2-user"に変更してください。
![ambari-cluster03.png](https://qiita-image-store.s3.amazonaws.com/0/22893/a442b261-f492-1458-8e31-f0b5d2015b53.png)

これで内容を確認したら、各ホストに対して、Ambariのエージェントがインストールされます。
![ambari-cluster04.png](https://qiita-image-store.s3.amazonaws.com/0/22893/6ce21539-0285-f98b-e95c-21e9dca068c4.png)

Ambariのエージェントのインストールが無事に完了したら、次に、クラスタとして必要なOSSを選択します。
ここでは、**「Zookeeper」「Storm」**、および、Amabriよるモニタリングを確認する**「Ambari Metrics」**を選択してください。
![ambari-cluster05.png](https://qiita-image-store.s3.amazonaws.com/0/22893/368beb1c-21b8-907d-5494-030b19d82db8.png)

次に、どのホストに対して、何のプロセスをインストールするかを決定します。
ここでは、Zookeeper用に3台必要なのに加えて、マスターノードである Nimbusや モニタリング用の Storm UI Server なども適宜配置していきます。何をどこに配置するか、ビジュアルに確認できるので分かりやすいですね。
![ambari-cluster06.png](https://qiita-image-store.s3.amazonaws.com/0/22893/3a5daf2e-9931-4541-de96-eb1b525f6f4d.png)

次にスレーブとなるSupervisorの設定を行います。ここでは、5台のホストの内、Zookeeperを配置しない残りの2台を指定します。
![ambari-cluster07.png](https://qiita-image-store.s3.amazonaws.com/0/22893/06022478-93ae-ea96-d01d-2f4b2e39bb1d.png)

設定の内容ですが、まずはデフォルトでOKです。
![ambari-cluster08.png](https://qiita-image-store.s3.amazonaws.com/0/22893/b6dc5787-a4d4-dacc-af29-fe94446ba733.png)

最後、内容を確認したら、デプロイを開始します。
![ambari-cluster09.png](https://qiita-image-store.s3.amazonaws.com/0/22893/5ee1afec-167d-d5b4-98e1-35f88cc264a8.png)

![ambari-cluster10.png](https://qiita-image-store.s3.amazonaws.com/0/22893/e2deefa2-507e-26d2-fa3f-ba5216e13f7b.png)

##動作確認

インストールが完了したら、Ambariの画面で、各サービスやホストの情報が確認できます。
以下のような画面が表示されればOKです。

![ambari-cluster11.png](https://qiita-image-store.s3.amazonaws.com/0/22893/4dd8a6cf-b47e-46c9-7b57-16cbe47cc945.png)

![ambari-cluster12.png](https://qiita-image-store.s3.amazonaws.com/0/22893/8ccdd0e9-4a4b-7afe-676f-fb34d7f4ca0a.png)


##Storm Topologyの実行

以下より、Stormの媒体をダウンロードします。

- http://storm.apache.org/downloads.html

2016/12/12現在での最新版は、1.0.2ですが、AmbariによってインストールされるStormのバージョンが1.0.1のため、一応、1.0.1の媒体をダウンロードします。

- apache-storm-1.0.1.zip

ファイルを展開して、以下にサンプルを同梱したjarがあることを確認します。

```
examples/storm-starter/storm-starter-topologies-1.0.1.jar
```

今回は、Nimbusが動作するホストで、Topologyのデプロイを行いますが、プライベートのサブネットにあるため、以下のような流れでファイルをアップロードします。

local -> ambari-server -> nimbus-server

```bash
local$ scp -i ./hdp-key.pem ./storm-starter-topologies-*.jar ec2-user@35.162.201.125:~/.
local$ ssh -i ./hdp-key.pem ec2-user@35.162.201.125

[ec2-user@ip-10-0-0-135 ~]$ ls
storm-starter-topologies-1.0.1.jar
[ec2-user@ip-10-0-0-135 ~]$ scp ./storm-starter-topologies-*.jar ec2-user@10.0.1.59:~/.
[ec2-user@ip-10-0-0-135 ~]$ ssh ec2-user@10.0.1.59

[ec2-user@ip-10-0-1-59 ~]$ ls
storm-starter-topologies-1.0.1.jar
[ec2-user@ip-10-0-1-59 ~]$ storm jar ./storm-starter-topologies-*.jar org.apache.storm.starter.SlidingWindowTopology slidingwindow
・・・
1701 [main] INFO  o.a.s.StormSubmitter - Finished submitting topology: slidingwindow
```

これで、サンプルのTopologyはアップできたので、StormUIで動作を確認します。
StormUIも、プライベートのサブネットにあるため、ローカルからはポートフォワーディングでアクセスします。

```bash
local$ ssh -N -L 18744:10.0.1.59:8744 -i ./hdp-key.pem ec2-user@35.162.201.125
```

これで、ブラウザから以下のURLにアクセスすることで、StormUIの画面が確認できます。

```
http://127.0.0.1:18744
```

以下のような画面が開き、slidingwindow というTopologyが表示されていればOKです。

![storm-example01.png](https://qiita-image-store.s3.amazonaws.com/0/22893/d3947c15-6928-f724-8a9c-5e43e8c1db85.png)

#まとめ

ネットワークの構成が多少複雑なため、手順としては多いですが、Ambari自体のインストール、そして、Ambariを利用したStormのプロビジョニングはとても簡単に実施できます。
Ambariの良いところは、プラットフォームごとにインストールするのではなく、関連するプラットフォームをまとめてプロビジョニング、モニタリングできるところにあると思います。
HDPを利用することで、簡単にビッグデータのプラットフォームを構築できますね。