この記事は Hortonworks Advent Calendar 2016 の12/12(月)のエントリーとして投稿しています。
HDP(Hortonworks Data Platform)のコンポーネントの一部である Apache Ambari を利用して、AWSのEC2上で Apache Storm のクラスタをプロビジョニングすることをやってみます。
今回は、Storm を対象にしていますが、Hadoop/Spark/Kafkaなども同様の手順で実施できます。
#概要
まずはじめに、今回利用するコンポーネントの簡単な説明。どちらもHDPに含まれるOSSです。
名称 | ロゴ | 説明 |
---|---|---|
Ambari | HDPにおけるクラスタマネージャ。HadoopだけでなくHDPで扱うコンポーネントに関して、クラスタの作成、設定の管理、モニタリング等の総合的な管理が行える。 | |
Storm | スケーラブルで高速な分散ストリームデータ処理エンジン。Twitter社からOSSとして公開された、分散ストリームデータ処理エンジンの先駆け的存在。 |
Ambariを利用することで、Stormを手動でインストールや設定する必要がなくなり、半自動でクラスタの構築や設定の管理を行えるようになります。
##構成
今回は、EC2上に構築しており、以下のような内容としています。
##前提条件
本記事の前提として、以下のことを想定しています。
- 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」としています。
##セキュリティグループの作成
セキュリティグループとしては、以下のような内容を指定したものを作成します。
- インバウンド
タイプ | プロトコル | ポート範囲 | 送信元 |
---|---|---|---|
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 を利用してインスタンスを作成します。
ネットワークを指定しますが、予め用意しておいたVPCを利用してください。
また、Ambariサーバは、パブリックなサブネットに配置します。
ストレージのサイズは、30GBとしていますが、実際の運用では適宜サイズを指定してください。
分かりやすいように「ambari-server」とタグを付けておきます。
キーペアは、既に作成しているものを選択します。新しく作成しても構いません。
サーバへのログインに必要になるため、大切に保管してください。
これで、Ambariサーバ用のインスタンスが作成できました。
##ログイン確認・初期設定
作成したインスタンスにSSHログインします。
local$ ssh -i ./hdp-key.pem ec2-user@35.162.201.125
ログインに成功したら、サービスの設定を変更します。
$ sudo chkconfig iptables off
$ sudo chkconfig ip6tables off
$ sudo chkconfig ntpd on
$ sudo service ntpd start
ここで、このインスタンスをベースとしたイメージを作成しておきます。
これは、後でHDPのノードとして利用します。
また、HDPのノードから、パスワードなしでログインできるようにしておくため、SCPで秘密鍵をアップロードします。アップロードしたファイルは、「id_rsa」というファイル名に変更して、「.ssh」ディレクトリの配下に配置します。
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として公開されているリポジトリの定義を追加します。
$ 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です。
デフォルトのログイン情報は以下になります。
パラメータ | 値 |
---|---|
Username | admin |
Password | admin |
#Stormのプロビジョニング
##Storm用のインスタンス作成
先程保存したAMIのイメージから、Stormクラスタ用のインスタンスを作成します。
ここでは「t2.medium」を選択していますが、Stormを動作させるので、適宜大きいサイズのインスタンスを指定してください。
ホストは、全部で5つ作成します。ホストの内容は、最初の構成図の通りです。
また、このホスト群は、プライベートなサブネットに配置します。
これで、Stormクラスタ用のインスタンスが作成できました。
ここで作成されたホストの**「プライベートDNS」**をメモしておいてください。後ほど利用します。
##Stormのデプロイ
Ambariにログインして、Storm用のクラスタを作成します。
**「Target Hosts」**では、Ambariからデプロイを行うHDPのノードを指定します。ここでは、先程メモしたEC2インスタンスのプライベートDNS(AWSのコンソールから確認できる)の値を、ホストの台数分指定してください。
**「Host Registration Information」**では、ホストにアクセスする際の秘密鍵を登録してください。また、ユーザアカウントは、デフォルトでは、"root"となっていますが、"ec2-user"に変更してください。
これで内容を確認したら、各ホストに対して、Ambariのエージェントがインストールされます。
Ambariのエージェントのインストールが無事に完了したら、次に、クラスタとして必要なOSSを選択します。
ここでは、「Zookeeper」「Storm」、および、Amabriよるモニタリングを確認する**「Ambari Metrics」**を選択してください。
次に、どのホストに対して、何のプロセスをインストールするかを決定します。
ここでは、Zookeeper用に3台必要なのに加えて、マスターノードである Nimbusや モニタリング用の Storm UI Server なども適宜配置していきます。何をどこに配置するか、ビジュアルに確認できるので分かりやすいですね。
次にスレーブとなるSupervisorの設定を行います。ここでは、5台のホストの内、Zookeeperを配置しない残りの2台を指定します。
##動作確認
インストールが完了したら、Ambariの画面で、各サービスやホストの情報が確認できます。
以下のような画面が表示されればOKです。
##Storm Topologyの実行
以下より、Stormの媒体をダウンロードします。
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
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も、プライベートのサブネットにあるため、ローカルからはポートフォワーディングでアクセスします。
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です。
#まとめ
ネットワークの構成が多少複雑なため、手順としては多いですが、Ambari自体のインストール、そして、Ambariを利用したStormのプロビジョニングはとても簡単に実施できます。
Ambariの良いところは、プラットフォームごとにインストールするのではなく、関連するプラットフォームをまとめてプロビジョニング、モニタリングできるところにあると思います。
HDPを利用することで、簡単にビッグデータのプラットフォームを構築できますね。