AWSのcentos7でClouderaManagerインストール

# 目的
centos7にcloudera managerをインストール〜起動までを検証する。

# 参考
Cloudera Enterprise 6.1.x　Cloudera Installation Guide
https://www.cloudera.com/documentation/enterprise/latest/topics/installation.html

# 検証環境
- AWS Lightsail
- プラットフォーム：Centos7 OSのみ
- リソース
    - CPU: ２ｖCPU、 メモリ：8GB

# インストール

## SELinuxの無効化

```bash:
# SELinuxの状態を確認
$ getenforce
```

- Enforcing：有効
- Disabled：無効

```bash
# SELinuxの設定ファイルを変更
$ sudo vi /etc/selinux/config
```
SELinuxの設定ファイルの内容を変更して保存する。
SELINUX=enforcing
↓
SELINUX=disabled

```bash
# 再起動する
$ sudo reboot

# 再起動後にSELinuxの状態を確認する
$ getenforce
```

## Firewallの無効化
firewalldがインストールされていない場合は省略する

```bash
# 状態確認
$　systemctl status firewalld

# Firewallが動作している場合、停止する
$ sudo systemctl stop firewalld

# 自動起動を無効化
$ sudo systemctl disable firewalld

# 状態確認
$　systemctl status firewalld
```

## NTPの有効化

centos7ではデフォルトのNTPサービスとしてntpに代わりにchronyが採用されている。
ntpとchronyは同時に利用できないのでどちらかを利用することになる。
chronyの場合、システム時刻とハード時刻を自動で同期できるため便利。
今回はntpを利用する手順とした。

```bash
# chronyの状態を確認
$ systemctl status chronyd

# chronyが動作している場合、停止する
$ sudo systemctl stop chronyd

# chronyの自動起動を無効化する
$ sudo systemctl disable chronyd

# chronyの状態を確認
$ systemctl status chronyd

# NTPのインストール
$ sudo yum install ntp -y
# 中略
Installed:
  ntp.x86_64 0:4.2.6p5-28.el7.centos

Dependency Installed:
  autogen-libopts.x86_64 0:5.18-5.el7
  ntpdate.x86_64 0:4.2.6p5-28.el7.centos

Complete!

# NTPの設定
# 設定例:server xxx.xxx.xxx.xxxx iburst
$ sudo vi /etc/ntp.conf

# NTPの開始
$ sudo systemctl start ntpd

#　NTPの自動起動有効化
$ sudo systemctl enable ntpd

# 状態確認
$ systemctl status ntpd

# 時刻の同期
$ sudo ntpdate -u xxx.xxx.xxx.xxx

# システム時刻とハードウェア時刻を同期
$ sudo hwclock --systohc
```

## NSCDの設定（任意）
nscdはDNS問い合わせをキャッシュするデーモン。
DNS問い合わせの負荷が減る一方でよく気をつけて利用しないとネットワーク関連の
トラブルが発生することがあるらしい。
今回はnscdを利用しないが、インストール時の手順は以下の通り。

```bash
# NSCDのインストール
sudo yum install nscd -y
# 中略
Installed:
  nscd.x86_64 0:2.17-260.el7_6.3

Dependency Updated:
  glibc.x86_64 0:2.17-260.el7_6.3
　　　　glibc-common.x86_64 0:2.17-260.el7_6.3          

Complete!

# NSCDの有効化
$ sudo systemctl start nscd

# NSCDの自動起動有効化
$ sudo systemctl enable nscd

# 状態確認
$ systemctl status nscd
```

## スタートアップサービスの確認
よけいなサービスが上がっていないかどうか確認する。
詳しくはインストールガイドを参照。

```bash
$ systemctl list-unit-files --type service | grep active
```

## ディスクの確認
```bash
$ sudo fdisk -l
Disk /dev/xvda: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000acf0a

    Device Boot      Start         End      Blocks   Id  System
/dev/xvda1   *        2048   125829086    62913519+  83  Linux
```

## 【参考】ディスクのフォーマット方法
HDFSで使用するファイルシステムとしてextを利用する場合は
性能劣化を抑止するためにオプション指定してフォーマットすることが推奨されている。
ｘｆｓであればフォーマット時に特別なオプションは必要としない。

```bash
# フォーマット例
mkfs –t xfs /dev/sdb1
```

## ディスクマウントの命名規則
管理を容易にするために、データノードのすべてのディスクは以下のような
名称でマウントすることが推奨されている。
>/data1
>/data2
>/data3
>/data4

## ホスト名の設定
```bash
# ホスト名の確認
$ hostname

# ホスト名の確認２
$ cat /etc/hostname

# ホスト名を設定
# ホスト名をfoo-1.example.comに設定する場合
$ sudo hostnamectl set-hostname foo-1.example.com

# ホスト名を確認
$ hostnamectl
$ cat /etc/hostname
```

## hostsファイルの設定
```bash
# hostsファイルの確認
$ cat /etc/hosts

# hostsファイルにクラスタの設定を追加する
# 各ホストをIPとFQDNで設定する
$ sudo vi /etc/hosts
```

設定例
・/etc/hostsには必ずFQDN名で設定する必要がある
・別名（短い名前）はクラスタ内でユニークとする

>1.1.1.1  foo-1.example.com  foo-1
>2.2.2.2  foo-2.example.com  foo-2
>3.3.3.3  foo-3.example.com  foo-3
>4.4.4.4  foo-4.example.com  foo-4

```bash
# hostnameコマンドの出力と一致することを確認
$ uname -a

# IPを確認する
$ ifconfig
```

参考：centos7のネットワーク設定方法
https://qiita.com/taro0219/items/8d3be39c5cb882d1ba5d

## Pythonの設定
cloudera managerではPython3.xはサポートされていないので
2.7がインストールされていることを確認する。

```bash
# 状態確認
$ python --version

# インストールされていなければインストールする
$ sudo yum install python27
```

## wgetのインストール

```bash
$ sudo yum install wget -y
...
Installed:
  wget.x86_64 0:1.14-18.el7

Complete!
```

## リポジトリの設定
インターネットに接続できない環境では別途イントラ内に
リポジトリサーバを用意する必要がある。
最小限のインストールの場合、cm6とparcelを用意する。
イントラネット内でサーバを用意する方法については公式のインストールガイドに
httpdとSimpleHTTPServerによる方法が紹介されている。
レスポンスの点から推奨はhttpd

```bash
# cloudera-managerのrepoファイルの取得
$ sudo wget https://archive.cloudera.com/cm6/6.1.0/redhat7/yum/cloudera-manager.repo -P /etc/yum.repos.d/

# GPG-KEYのインポート
$ sudo rpm --import https://archive.cloudera.com/cm6/6.1.0/redhat7/yum/RPM-GPG-KEY-cloudera
```

## JDKのインストール
- JDKは64bitのバージョンにする必要がある
- クラスタ内の各ノードは同じバージョンのJDKをインストールする必要がある
- JDKは/usr/java/jdk-versionにインストールする
- 手動でインストールするか、cloudera-managerのリポジトリからJDKをインストールする

```bash
# javaのインストール
# cloudera-mangerのリポジトリからJDKをインストールする
$ sudo yum install oracle-j2sdk1.8 -y
Running transaction
  Installing : oracle-j2sdk1.8-1.8.0+update141-1.x86_64　　1/1 
  Verifying  : oracle-j2sdk1.8-1.8.0+update141-1.x86_64　　1/1 

Installed:
  oracle-j2sdk1.8.x86_64 0:1.8.0+update141-1

Complete!
```

## Cloudera Managerのインストール
```bash
$ sudo yum install cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server -y
Installed:
  cloudera-manager-agent.x86_64 0:6.1.0-769885.el7
  cloudera-manager-daemons.x86_64 0:6.1.0-769885.el7
  cloudera-manager-server.x86_64 0:6.1.0-769885.el7

Dependency Installed:
  MySQL-python.x86_64 0:1.2.5-1.el7
  apr.x86_64 0:1.4.8-3.el7_4.1
  apr-util.x86_64 0:1.5.2-6.el7
  at.x86_64 0:3.1.13-24.el7
  avahi-libs.x86_64 0:0.6.31-19.el7
  bc.x86_64 0:1.06.95-13.el7
  bind-libs.x86_64 32:9.9.4-73.el7_6
  bind-utils.x86_64 32:9.9.4-73.el7_6
  centos-logos.noarch 0:70.0.6-3.el7.centos
  cups-client.x86_64 1:1.6.3-35.el7
  cups-libs.x86_64 1:1.6.3-35.el7
  cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7
  cyrus-sasl-plain.x86_64 0:2.1.26-23.el7
  ed.x86_64 0:1.9-4.el7
  fuse.x86_64 0:2.9.2-11.el7
  fuse-libs.x86_64 0:2.9.2-11.el7
  httpd.x86_64 0:2.4.6-88.el7.centos
  httpd-tools.x86_64 0:2.4.6-88.el7.centos
  keyutils-libs-devel.x86_64 0:1.5.8-3.el7
  krb5-devel.x86_64 0:1.15.1-37.el7_6
  libcom_err-devel.x86_64 0:1.42.9-13.el7
  libkadm5.x86_64 0:1.15.1-37.el7_6
  libselinux-devel.x86_64 0:2.5-14.1.el7
  libsepol-devel.x86_64 0:2.5-10.el7
  libverto-devel.x86_64 0:0.2.5-4.el7
  libxslt.x86_64 0:1.1.28-5.el7
  m4.x86_64 0:1.4.16-10.el7
  mailcap.noarch 0:2.1.41-2.el7
  mailx.x86_64 0:12.5-19.el7
  mod_ssl.x86_64 1:2.4.6-88.el7.centos
  openssl-devel.x86_64 1:1.0.2k-16.el7
  patch.x86_64 0:2.7.1-10.el7_5
  pcre-devel.x86_64 0:8.32-17.el7
  perl.x86_64 4:5.16.3-294.el7_6
  perl-Carp.noarch 0:1.26-244.el7
  perl-Encode.x86_64 0:2.51-7.el7
  perl-Exporter.noarch 0:5.68-3.el7
  perl-File-Path.noarch 0:2.09-2.el7
  perl-File-Temp.noarch 0:0.23.01-3.el7
  perl-Filter.x86_64 0:1.49-3.el7
  perl-Getopt-Long.noarch 0:2.40-3.el7
  perl-HTTP-Tiny.noarch 0:0.033-3.el7
  perl-PathTools.x86_64 0:3.40-5.el7
  perl-Pod-Escapes.noarch 1:1.04-294.el7_6
  perl-Pod-Perldoc.noarch 0:3.20-4.el7
  perl-Pod-Simple.noarch 1:3.28-4.el7
  perl-Pod-Usage.noarch 0:1.63-3.el7
  perl-Scalar-List-Utils.x86_64 0:1.27-248.el7
  perl-Socket.x86_64 0:2.010-4.el7
  perl-Storable.x86_64 0:2.45-3.el7
  perl-Text-ParseWords.noarch 0:3.29-4.el7
  perl-Time-HiRes.x86_64 4:1.9725-3.el7
  perl-Time-Local.noarch 0:1.2300-2.el7
  perl-constant.noarch 0:1.27-2.el7
  perl-libs.x86_64 4:5.16.3-294.el7_6
  perl-macros.x86_64 4:5.16.3-294.el7_6
  perl-parent.noarch 1:0.225-244.el7
  perl-podlators.noarch 0:2.5.1-3.el7
  perl-threads.x86_64 0:1.87-4.el7
  perl-threads-shared.x86_64 0:1.43-6.el7
  postgresql-libs.x86_64 0:9.2.24-1.el7_5
  psmisc.x86_64 0:22.20-15.el7
  python-psycopg2.x86_64 0:2.5.1-3.el7
  redhat-lsb-core.x86_64 0:4.1-27.el7.centos.1
  redhat-lsb-submod-security.x86_64 0:4.1-27.el7.centos.1
  spax.x86_64 0:1.5.2-13.el7
  time.x86_64 0:1.7-45.el7
  zlib-devel.x86_64 0:1.2.7-18.el7

Dependency Updated:
  bind-libs-lite.x86_64 32:9.9.4-73.el7_6
　　　　bind-license.noarch 32:9.9.4-73.el7_6   
  e2fsprogs.x86_64 0:1.42.9-13.el7
　　　　e2fsprogs-libs.x86_64 0:1.42.9-13.el7
  krb5-libs.x86_64 0:1.15.1-37.el7_6
　　　　libcom_err.x86_64 0:1.42.9-13.el7
  libselinux.x86_64 0:2.5-14.1.el7
　　　　libselinux-python.x86_64 0:2.5-14.1.el7
  libselinux-utils.x86_64 0:2.5-14.1.el7
　　　　libsepol.x86_64 0:2.5-10.el7
  libss.x86_64 0:1.42.9-13.el7
　　　　openssl.x86_64 1:1.0.2k-16.el7
  openssl-libs.x86_64 1:1.0.2k-16.el7
　　　　zlib.x86_64 0:1.2.7-18.el7

Complete!
```

## Auto-TLSの設定（任意）
Auto-TLS(https)については、clouderaクラスタ構築後に後から設定することはできない。
Auto-TLSを導入するとcloudera managerへのアクセスがTLSで暗号化された通信となる。
ローカル環境やイントラネット以外では設定すべきだろう。

```bash
# TLSの設定を行う
$ sudo JAVA_HOME=/usr/java/jdk1.8.0_141-cloudera /opt/cloudera/cm-agent/bin/certmanager setup --configure-services
```

## Databaseのインストール
各コンポーネントを動作させるためにはDatabaseのインストールが必要
サポートされているDatabaseは以下。今回はmariaDBを利用する。
- MariaDB
- MySQL
- PostgreSQL
- Oracle Database

```bash
# MariaDBのインストール
$ sudo yum install mariadb-server -y
Installed:
  mariadb-server.x86_64 1:5.5.60-1.el7_5

Dependency Installed:
  libaio.x86_64 0:0.3.109-13.el7
  mariadb.x86_64 1:5.5.60-1.el7_5
  perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7
  perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7
  perl-DBD-MySQL.x86_64 0:4.023-6.el7
  perl-DBI.x86_64 0:1.627-4.el7
  perl-Data-Dumper.x86_64 0:2.145-3.el7
  perl-IO-Compress.noarch 0:2.061-2.el7
  perl-Net-Daemon.noarch 0:0.48-5.el7
  perl-PlRPC.noarch 0:0.2020-14.el7

Dependency Updated:
  mariadb-libs.x86_64 1:5.5.60-1.el7_5

Complete!

# MariaDBが動作していたら停止する
$ sudo systemctl stop mariadb
```

以下のファイルが存在する場合、/var/lib/mysql以外の場所にファイルをバックアップする
>/var/lib/mysql/ib_logfile0
>/var/lib/mysql/ib_logfile1

```bash
# MariaDBのデフォルト設定ファイルをバックアップ
$ sudo cp /etc/my.cnf /etc/my.cnf.bak
```

公式の情報をもとにMariaDBの設定ファイルを更新する
- innodb_buffer_pool_sizeのサイズがメモリサイズ以上だとmariadbの起動に失敗する模様
- AWSのコンソールから貼り付けると設定ファイルの先頭の方が切れることがあるので注意
https://www.cloudera.com/documentation/enterprise/6/6.1/topics/install_cm_mariadb.html

```bash
# MariaDBの設定ファイル更新
$ sudo vi /etc/my.cnf

# 設定ファイル確認
$ cat /etc/my.cnf
```

```bash
# MariaDBの自動起動を有効化する
$ sudo systemctl enable mariadb

# MariaDBを開始する
$ sudo systemctl start mariadb

# MariaDBのセキュリティ設定をする
$ sudo /usr/bin/mysql_secure_installation
...
Set root password? [Y/n] Y
...
Remove anonymous users? [Y/n] Y
...
Disallow root login remotely? [Y/n] n
...
Remove test database and access to it [Y/n] Y
...
Reload privilege tables now? [Y/n] Y
...
```

## MariaDBのためにJDBCドライバをインストールする
cloudera managerではversion 5.1のドライバが推奨されている。

```bash
# JDBCをダウンロードする
$ wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.46.tar.gz

# ダウンロードファイルを展開する
$ tar zxvf mysql-connector-java-5.1.46.tar.gz

# JDBCのjarファイルを移動する
$ sudo mkdir -p /usr/share/java/
$ cd mysql-connector-java-5.1.46
$ sudo cp mysql-connector-java-5.1.46-bin.jar /usr/share/java/mysql-connector-java.jar
```

## MariaDBの設定を行う
```bash
$ mysql -u root -p
```

```sql
-- Databaseの登録状態を確認
SHOW DATABASES;

CREATE DATABASE scm       DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE amon      DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE rman      DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE hue       DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE metastore DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE sentry    DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE nav       DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE navms     DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE oozie     DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

-- 任意のパスワード(<password>を置き換え)でユーザを作成する
GRANT ALL ON scm.* TO 'scm'@'%' IDENTIFIED BY '<password>';
GRANT ALL ON amon.* TO 'amon'@'%' IDENTIFIED BY '<password>';
GRANT ALL ON rman.* TO 'rman'@'%' IDENTIFIED BY '<password>';
GRANT ALL ON hue.* TO 'hue'@'%' IDENTIFIED BY '<password>';
GRANT ALL ON metastore.* TO 'metastore'@'%' IDENTIFIED BY '<password>';
GRANT ALL ON sentry.* TO 'sentry'@'%' IDENTIFIED BY '<password>';
GRANT ALL ON nav.* TO 'nav'@'%' IDENTIFIED BY '<password>';
GRANT ALL ON navms.* TO 'navms'@'%' IDENTIFIED BY '<password>';
GRANT ALL ON oozie.* TO 'oozie'@'%' IDENTIFIED BY '<password>';

-- Database登録結果の確認
SHOW DATABASES;
-- <user>の権限を確認
SHOW GRANTS FOR '<user>'@'%';

exit;
```

## Cloudera Managerデータベースの設定

```bash
$ sudo /opt/cloudera/cm/schema/scm_prepare_database.sh mysql scm scm
```

## SSHの設定
インストールを実行するノードからクラスタの全ノードへSSHアクセスができるように
しておく必要がある。
クラスタ内のパスワードを同じにするか、同じ公開鍵を受け入れるように設定する。
ここで作成した秘密鍵は以降のCloudera Managerのインストール時に使用する。

```bash
# rootユーザで公開鍵を作成する
$ cd

# ssh-keygenを実行した後にパスワードを聞かれるがここではパスワードなしとする
$ ssh-keygen

# homeディレクトリの.sshディレクトリの下にid_rsa(秘密鍵）とid_rsa.pub（公開鍵)が作成される。
$ ls -l ~/.ssh

# id_rsa.pubをクラスタ内の各ノードにコピーする

# 以下はSSHを受け入れる各ノードのrootで実施する
$ cd

# フォルダが無ければ作成する
$ mkdir ~/.ssh

# パーミッションを正しく設定しないとsshが動作しないので設定
$ chmod 700 ~/.ssh

# 公開鍵をauthorized_keysに登録する
$ cat id_rsa.pub >> ~/.ssh/authorized_keys

# 登録結果を確認
$ cat ~/.ssh/authorized_keys

# パーミッションを正しく設定しないとsshが動作しないので設定
$ chmod 600 ~/.ssh/authorized_keys

# SSHの設定ファイルを確認する
# PermitRootLogin yesがコメントアウトされていないことを確認する
$ cat /etc/ssh/sshd_config

# SSHの再起動をする
$ sudo systemctl restart sshd
```

## CDHのインストール

```bash
# Cloudera Manger Serverを開始する
$ sudo systemctl start cloudera-scm-server

# Cloudera Manger Serverが完全に起動するまで数分かかるのでログを確認する
$ sudo tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log
```

以下のログが表示されたら準備が完了
>INFO WebServerImpl:com.cloudera.server.cmf.WebServerImpl: Started Jetty server.

## Cloudera Managerの設定
パブリックIPを確認する
・AWSホーム画面のインスタンス→管理から確認できる

ファイアウォールの設定
・AWSホーム画面のインスタンス→管理→ネットワークタブ→ファイアウォールでアクセスするポート7180を開放

ブラウザからCloudera Manager Serverへアクセスする。
Auto-TLSを設定している場合は、httpsのページにリダイレクトされる。
http://xxx.xxx.xxx.xxx:7180

初期ユーザとパスワードはadmin/admin
ログイン後にパスワードを変更する。