Hadoopクラスタの構築（Cloudera Manager on Ubuntu 18.04）

# TL;DR
* Hadoopクラスタを構築する
* Clouderaを利用してクラスタの構築とエコシステムを導入する

# 環境
管理ノードおよびマスターノードを兼任するサーバ1台と他7台のサーバの合計8台でクラスタを構築します．
OSやバージョンは次のとおりです．

- Ubuntu 18.04 LTS
- Cloudera Express 6.3.x

Cloudera Managerや多くのロールを割り当てる管理ノードは，多くのメモリを消費するので可能な限り増設することをおすすめします．もしくは専用のノードで分けるべきです．

本稿では，マスターノードを`amdahl01.example.jp`，その他スレーブノードを`amdahl[02-08].example.jp`で示します．

# インストール
作業は基本的に[Cloudera Installation Guide](https://docs.cloudera.com/documentation/enterprise/6/latest/topics/installation.html)に基づきます．

ユーザはインストール時に`cloudera`というアカウントを作成しています．sudo権限を持ったアカウントなら何でもよいです．
sudo権限はパスワードなしで実行できるようにしてください．

```shell
sudo update-alternatives --config editor # デフォルトエディタの変更
sudo visudo # clouderaユーザをパスワード無しでsudo実行可能にする
```

```:/etc/sudoers
cloudera ALL=(ALL) NOPASSWD: ALL
```

全てのノードにUbuntu 18.04 Serverをインストールします．ネットワーク設定等は環境に合わせてください．本稿では`netplan`を利用しています．ミラーサーバは`http://jp.archive.ubuntu.com/ubuntu/`を設定しています．インストール後はパッケージを最新のものに更新しておきます．

```shell
sudo apt update -y && sudo apt upgrade -y
```

## ネットワーク
各ノードには適切にホスト名とFQDNを設定してください．ホスト名はインストール時に指定するか，コマンドで設定します．

```shell
sudo hostnamectl set-hostname amdahl01.example.jp
```

各ノードのIPアドレスとFQDNを解決できるようにします．外部公開の必要もないので`/etc/hosts`を編集して関連付けます．ホスト名とlocalhostとの関連付けは削除しといたほうがいいかもしれません．

```:/etc/hosts
127.0.0.1 localhost

192.168.141.141 amdahl01.example.jp amdahl01
192.168.141.142 amdahl02.example.jp amdahl02
192.168.141.143 amdahl03.example.jp amdahl03
192.168.141.144 amdahl04.example.jp amdahl04
192.168.141.145 amdahl05.example.jp amdahl05
192.168.141.146 amdahl06.example.jp amdahl06
192.168.141.147 amdahl07.example.jp amdahl07
192.168.141.148 amdahl08.example.jp amdahl08
```

## インストール準備
ファイアウォールを無効化します．今回はsystemdなので次のコマンドで停止できます．

```shell
sudo systemctl stop ufw
sudo systemctl disable ufw
```

SELinuxが有効になっている場合は無効化してください．今回は未インストール状態なので省略します．

既にsystemd下で時刻管理がなされているはずなので，ntpに切り替えます．

```shell
sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd
```

ntpをインストールします．
`/etc/ntp.conf`を編集してntpサーバを設定します．無難に`ntp.nict.jp`を設定しています．

```shell
sudo apt install -y ntp ntpdate
sudo systemctl start ntp
sudo systemctl enable ntp

vi /etc/ntp.conf
ntpdate -u ntp.nict.jp
hwclock --systohc
```

必要なソフトウェアをインストールします．

```shell
sudo apt install -y vim tmux git curl wget build-essential
sudo apt install -y make xz-utils file liblzma-dev patch zlib1g-dev g++ gcc 
```

# MariaDB/MySQL/PostgreSQLのインストール（オプション）
データベースソフトウェアをインストールします．Cloudera Managerインストール時に組み込みのPostgreSQLサーバが構築されるため，利用環境に合わせてセットアップしてください．詳しくは[公式ガイド](https://docs.cloudera.com/documentation/enterprise/6/latest/topics/cm_ig_installing_configuring_dbs.html)を参照してください．

以下はMySQLをセットアップする例です．表に示すデータベースおよびユーザを作成しています．

| Service                 | Database | User  | 
| ----------------------- | -------- | ----- | 
| Cloudera Manager Server | scm      | scm   | 
| Acrivity Monitor        | amon     | amon  | 
| Hue                     | hue      | hue   | 
| Hive                    | hive     | hive  | 
| Oozie                   | oozie    | oozie | 


```shell
sudo apt install -y mysql-server libmysql-java
sudo /usr/bin/mysql_secure_installation
mysql -u root -p
```

```sql
create database <database> default character set utf8 default collate utf8_general_ci;
GRANT ALL ON <database>.* TO '<user>'@'%' IDENTIFIED BY '<password>';
```

Cloudera Managerに利用するデータベースは以下のスクリプトで設定します．その他エコシステムのデータベースはクラスタ作成時にWeb GUIで設定します．

```shell
/opt/cloudera/cm/schema/scm_prepare_database.sh mysql scm scm scm
```

組み込みのデータベースを利用しない場合，以下のサービスは不要です．起動している場合は停止しておいてよいでしょう．

```shell
sudo systemctl stop cloudera-scm-server-db.service
sudo systemctl disable cloudera-scm-server-db.service
```

# Cloudera Managerのインストール

Cloudera Managerをインストールします（管理ノードのみ）．
インストーラをダウンロードして，実行権限を与えます．実行するとTUIインストーラが立ち上がりますが，特に迷う部分もないため，そのまま進めてください．正常にインストールが完了すれば，ブラウザから`amdahl01.example.jp:7180`でアクセスが可能になります．

```shell
wget https://archive.cloudera.com/cm6/6.3.0/cloudera-manager-installer.bin
chmod u+x cloudera-manager-installer.bin
sudo ./cloudera-manager-installer.bin
```

# クラスタのインストール
Cloudera Managerのウェブコンソールにログインします．ユーザ名/パスワードはデフォルトでは`admin/admin`です．
画面の指示に従い，セットアップを進めてください．設定を変更しなければ，特段迷う点はないかと思います．

管理対象のホスト（エコシステムをインストールする対象）はFQDNで指定します．今回は全てのノードにインストールするため，`amdahl[01-08].example.jp`で検索，および選択しました．
各ノードにソフトウェアをインストールするため，管理ノードから他ノードにSSHできるようにし，またパスワードなしでsudoコマンドを実行できるようにする必要があります．最初に作成した`cloudera`アカウントを利用するとよいでしょう．SSH資格情報はパスワードおよび公開鍵を設定します．

その他，欲しい環境に合わせてエコシステムやデータベース等を指定してください．エコシステムのダウンロードおよびインストールにかなり時間を要するため，ネットワーク速度は早いほうがよいです．

セットアップが完了すると，ダッシュボード画面に遷移します．恐らく多くの警告が表示されていると思うので，1つずつ設定を見直してください．

![2020-09-12_064436_221584607.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405311/20f52b78-9fe1-3c83-40d9-84f712dccfb2.png)

クラスタのセットアップは以上になります．お疲れ様でした．