Apache Ambari を Docker でインストール

Hadoop クラスタの環境を個人で実サーバで持つのはコストがかかるため、多少低スペックでも構わないので、個人のローカルPC上で出来る範囲で構築したいところです。
今回は以下の記事を元に Dockerfile を書いて Docker コンテナ上で Ambari を起動するところまでやってみます。
[Apache Ambari Installation
](https://docs.cloudera.com/HDPDocuments/Ambari-2.6.2.0/bk_ambari-installation/content/ch_Installing_Ambari.html)

#### Dockerfile を書く
1. centos7 を使ってみます。
2. いくつか使いそうなコマンドをインストールします。
3. centos7 で service コマンドを使えるようにするため、initscripts をインストールします。
4. Ambari repository をダウンロードしておきます。
5. Ambari Server をインストールします。

```bash:Dockerfile
# 1
FROM centos:centos7
LABEL maintainer "blueskyarea"

USER root

# 2. Install commands
RUN yum install -y curl tar rsync wget

# 3. Install initscripts for service command
RUN yum -y install initscripts && yum clean all

# 4. Download Ambari repository
RUN wget -nv http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.6.2.0/ambari.repo -O /etc/yum.repos.d/ambari.repo

# 5. Install Ambari server
RUN yum install -y ambari-server
```

#### Docker イメージを作る
今回はイメージ名として、"ambari262" と指定しておきます。

```bash
$ docker build -t ambari262 .
double free or corruption (out)
SIGABRT: abort
PC=0x7fe1348bde97 m=0 sigcode=18446744073709551610
signal arrived during cgo execution
（中略）
Complete!
Removing intermediate container 7b98ea9a218a
 ---> 7003da2b64b7
Successfully built 7003da2b64b7
Successfully tagged ambari262:latest
```
Docker イメージが作成されました。

```bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ambari262           latest              7003da2b64b7        4 minutes ago       1.27GB
```

#### コンテナを起動する
Ambari server では、デフォルトで組み込みの postgres を使用するようです。
postgres を起動するためには、systemctl コマンドが必要になりそうですが、centos7では、/sbin/init を実行する必要があるようです。
（追記）クラスタの構築時にホスト名を指定する箇所があるため、ホスト名を定義しておきます。また、Ambari Server がデフォルトで使用するポートを念のためバインドしておきます。
8440 : Handshake Port for Ambari Agents to Ambari Server
8441 : Registration and Heartbeat Port for Ambari Agents to Ambari Server

```bash
$ docker run -d -h host01.blueskyarea -p 8440:8440 -p 8441:8441 --privileged ambari262 /sbin/init
84c36c37ff468532962121011002ecb324f3df8edf3f16ae0e7016ac1dcd3033
```
そして、そのコンテナに対して、bash を起動します。

```bash
$ docker exec -it 84c36c37ff46 /bin/bash
```

#### Ambari server の setup
マニュアルに沿ってセットアップしていきます。
注意しておきたいのは、"Enter advanced database configuration [y/n] (n)? "の質問に対して、No(n) で回答するところです。
Yes(y) を選択して、使用するDBを手動で選択した場合、自分でDBを起動し、スキーマの作成など行う必要があります。
※私はそれで詰まってしまったため、コンテナの再作成からやり直ししました

```bash
[root@84c36c37ff46 /]# ambari-server setup
Using python  /usr/bin/python
Setup ambari-server
Checking SELinux...
WARNING: Could not run /usr/sbin/sestatus: OK
Customize user account for ambari-server daemon [y/n] (n)? 
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): 
To download the Oracle JDK and the Java Cryptography Extension (JCE) Policy Files you must accept the license terms found at http://www.oracle.com/technetwork/java/javase/terms/license/index.html and not accepting will cancel the Ambari Server setup and you must install the JDK and JCE files manually.
Do you accept the Oracle Binary Code License Agreement [y/n] (y)? 
Downloading JDK from http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-8u112-linux-x64.tar.gz to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz
jdk-8u112-linux-x64.tar.gz... 100% (174.7 MB of 174.7 MB)
Successfully downloaded JDK distribution to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz
Installing JDK to /usr/jdk64/
Successfully installed JDK to /usr/jdk64/
Downloading JCE Policy archive from http://public-repo-1.hortonworks.com/ARTIFACTS/jce_policy-8.zip to /var/lib/ambari-server/resources/jce_policy-8.zip

Successfully downloaded JCE Policy archive to /var/lib/ambari-server/resources/jce_policy-8.zip
Installing JCE policy...
Checking GPL software agreement...
GPL License for LZO: https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html
Enable Ambari Server to download and install GPL Licensed LZO packages [y/n] (n)? y
Completing setup...
Configuring database...
Enter advanced database configuration [y/n] (n)? 
Configuring database...
Default properties detected. Using built-in database.
Configuring ambari database...
Checking PostgreSQL...
Running initdb: This may take up to a minute.
Initializing database ... OK

About to start PostgreSQL
Configuring local database...
Configuring PostgreSQL...
Restarting PostgreSQL
Creating schema and user...
done.
Creating tables...
done.
Extracting system views...
.........ambari-admin-2.6.2.0.155.jar
..
Adjusting ambari-server permissions and ownership...
Ambari Server 'setup' completed successfully.
```

#### Ambari server の起動
```bash
[root@84c36c37ff46 /]# ambari-server start
Using python  /usr/bin/python
Starting ambari-server
Ambari Server running with administrator privileges.
Organizing resource files at /var/lib/ambari-server/resources...
Ambari database consistency check started...
Server PID at: /var/run/ambari-server/ambari-server.pid
Server out at: /var/log/ambari-server/ambari-server.out
Server log at: /var/log/ambari-server/ambari-server.log
（中略）
```

コンテナのIPアドレスを調べて、8080 ポートでアクセスしてみます。

```
$ docker inspect --format '{{.NetworkSettings.IPAddress}}' 84c36c37ff46
172.17.0.2
```

ユーザ(admin)/パスワード(admin) でログインします。
![ambari-login.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63951/f826b85b-2a19-765c-25dd-2b028c78dc4a.png)

ログイン出来ました。
とりあえず、目的は達成できたので、ここからクラスタを作って色々と試していきたいと思います。
![ambari-dashboard.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63951/9bc5d386-9ec7-ddbf-aa83-26137ae181f7.png)