Cloudera CDH 6.2でHBaseの完全分散環境を構築する

# はじめに

Cloudera CDH 6.2でHBaseの完全分散環境をお試しで構築してみます。
CDHはApache Hadoopと、HBaseやSpark等の関連したプロジェクトの有償ディストリビューションです（Expressという無償版もあり）。
CDHを利用することによりこれらのプロジェクトを用いた環境を簡単に構築でき、ホストの運用も統合的に実施することができます。


# 環境

使用する環境は以下のとおりです。

- CentOS 7.5
- Cloudera CDH 6.2

Cloudera Manager用のサーバ1台とClouderaのノード（ホスト）4台の計5台を使用しています。
諸事情でクラスタ作成時はノード3台で、クラスタ作成後に1台追加しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/f971d1cf-5b2d-4d72-3566-5c2f4d9e84d5.png)


# インストール

CDHのインストールは以下の公式サイトを参考に実施しました。

- [Cloudera Installation Guide](https://www.cloudera.com/documentation/enterprise/6/6.2/topics/installation.html)


## ネットワーク設定

まず、ホスト名をFQDNで設定します。
以下は1号機の場合で、5号機まで同様に実行します。

```
sudo hostnamectl set-hostname hbaseserver1.example.com
```

全てサーバのhostsファイルを修正します。

```
vi /etc/hosts

192.168.10.91  hbaseserver1.example.com  hbaseserver1
192.168.10.92  hbaseserver2.example.com  hbaseserver2
192.168.10.93  hbaseserver3.example.com  hbaseserver3
192.168.10.94  hbaseserver4.example.com  hbaseserver4
192.168.10.95  hbaseserver5.example.com  hbaseserver5
```

/etc/sysconfig/networkも全てのサーバで修正します。

```
vi /etc/sysconfig/network
HOSTNAME=hbaseserver1.example.com
```

## Firewallを無効化

Firewallを無効化します。

```
systemctl disable firewalld
systemctl stop firewalld
```

## SELinuxを無効化

SELinuxも無効化

```
setenforce 0

# vi /etc/selinux/config
SELINUX=disabled
```

ここでサーバを再起動しています。
確認のため、以下のコマンドを実行します。


```
# host -v -t A $(hostname)
Trying "hbaseserver4.example.com"
Received 99 bytes from 10.0.2.3#53 in 140 ms
Trying "hbaseserver4.example.com.example.com"
Host hbaseserver4.example.com not found: 3(NXDOMAIN)
Received 111 bytes from 10.0.2.3#53 in 141 ms
```


## NTPを有効にする

1台目（NTPサーバ）
→1台目をNTPサーバにしようかと思いましたが、結局実施せず、外部NTPサーバを利用しました。

```
# yum install -y ntp
# systemctl start ntpd
# systemctl enable ntpd

# vi /etc/ntp.conf
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

server 127.127.1.0
fudge 127.127.1.0 stratum 10
```

2-4台目

```
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap

server 192.168.10.91 iburst
```

nptdを再起動し、ntpqコマンドで同期されている事を確認します。
サーバ名の左に「*」が表示されていればOKです。

```
# systemctl restart ntpd
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*192.168.10.91   LOCAL(0)        11 u    2   64    1    0.299    3.536   2.178


# systemctl stop ntpd
# ntpdate 192.168.10.91
# systemctl start ntpd
```


## clouderaユーザの作成

今後の作業ではclouderaユーザを使用するので、まずはclouderaユーザを作成します。

```
groupadd cloudera
useradd -g cloudera cloudera
passwd cloudera

echo 'cloudera ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/cloudera
chmod 400 /etc/sudoers.d/cloudera
```

管理ノードから他の3サーバにsshで接続できることを確認する。

```
# ssh cloudera@hbaseserver2.example.com
# ssh cloudera@hbaseserver3.example.com
# ssh cloudera@hbaseserver4.example.com
```

## Cloudera Manager用のリポジトリの登録

管理ノードでCloudera Manager用のリポジトリをダウンロードし、インストールします。

```
wget https://archive.cloudera.com/cm6/6.2.0/redhat7/yum/cloudera-manager.repo -P /etc/yum.repos.d/

rpm --import https://archive.cloudera.com/cm6/6.2.0/redhat7/yum/RPM-GPG-KEY-cloudera
```


## JDKインストール

管理ノードにJDKをインストールします。

```
yum install -y oracle-j2sdk1.8
```


## Cloudera Manager Serverインストール

管理ノードにCloudera Managerパッケージをインストールします。

```
yum install -y cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server
```

## PostgreSQLインストール

Cloudera Managerは、Cloudera Managerの設定情報等を保存するためにデータベースを利用します。
データベースは、Oracle、PostgreSQL、MySQLなど様々なDBが利用できます。今回はPostgreSQLをインストールしました。
※今回はお試しでPostgreSQLのバージョンは気にしていなかったので、リポジトリに登録されているバージョンを利用しています。

```
# yum install -y postgresql-server
# curl -kL https://bootstrap.pypa.io/get-pip.py | python
# pip install psycopg2==2.7.5 --ignore-installed
```

データベースを初期化します。

```
# echo 'LC_ALL="en_US.UTF-8"' >> /etc/locale.conf
# su -l postgres -c "postgresql-setup initdb"
# systemctl start postgresql
```


```
# passwd postgres

# su - postgres -c psql
ALTER USER postgres WITH PASSWORD 'postgres';
\q
```

pg_hba.confを修正し、MD5認証を有効にします。

```
# su - postgres -c "vi /var/lib/pgsql/data/pg_hba.conf"

local   all             all                                     md5
host all all 127.0.0.1/32 md5
->peer,ident を trustに変更
host    all             all             192.168.10.0/24            md5

# systemctl restart postgresql
```

postgresql.confに対して、最低限の修正を行います。


```
$ vi /var/lib/pgsql/data/postgresql.conf

listen_addresses = '*'
max_connection=100
shared_buffers = 256MB
wal_buffers = 8MB
checkpoint_segments = 16
checkpoint_completion_target = 0.9
```
※checkpoint_segments 設定はPostgreSQL 9.5以降で削除されています。

PostgreSQLを自動起動するように設定します。ついでに再起動しています。

```
# systemctl enable postgresql
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql.service to /usr/lib/systemd/system/postgresql.service.

# systemctl restart postgresql
```


## データベース作成

各種データベースを作成します。

```
# sudo -u postgres psql

CREATE ROLE scm LOGIN PASSWORD 'scm';
CREATE ROLE amon LOGIN PASSWORD 'amon';
CREATE ROLE rman LOGIN PASSWORD 'rman';
CREATE ROLE hue LOGIN PASSWORD 'hue';
CREATE ROLE hive LOGIN PASSWORD 'hive';
CREATE ROLE sentry LOGIN PASSWORD 'sentry';
CREATE ROLE nav LOGIN PASSWORD 'nav';
CREATE ROLE navms LOGIN PASSWORD 'navms';
CREATE ROLE oozie LOGIN PASSWORD 'oozie';
CREATE DATABASE scm OWNER scm ENCODING 'UTF8';
CREATE DATABASE amon OWNER amon ENCODING 'UTF8';
CREATE DATABASE rman OWNER rman ENCODING 'UTF8';
CREATE DATABASE hue OWNER hue ENCODING 'UTF8';
CREATE DATABASE metastore OWNER hive ENCODING 'UTF8';
CREATE DATABASE sentry OWNER sentry ENCODING 'UTF8';
CREATE DATABASE nav OWNER nav ENCODING 'UTF8';
CREATE DATABASE navms OWNER navms ENCODING 'UTF8';
CREATE DATABASE oozie OWNER oozie ENCODING 'UTF8';

ALTER DATABASE metastore SET standard_conforming_strings=off;
ALTER DATABASE oozie SET standard_conforming_strings=off;
```


## Cloudera Manager Databaseのデータベースを設定する

Cloudera Managerのデータベースを設定するためのscm_prepare_database.shを実行します。

```
# /opt/cloudera/cm/schema/scm_prepare_database.sh postgresql scm scm scm
JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
Verifying that we can write to /etc/cloudera-scm-server
Creating SCM configuration file in /etc/cloudera-scm-server
Executing:  /usr/java/jdk1.8.0_181-cloudera/bin/java -cp /usr/share/java/mysql-connector-java.jar:/usr/share/java/oracle-connector-java.jar:/usr/share/java/postgresql-connector-java.jar:/opt/cloudera/cm/schema/../lib/* com.cloudera.enterprise.dbutil.DbCommandExecutor /etc/cloudera-scm-server/db.properties com.cloudera.cmf.db.
[                          main] DbCommandExecutor              INFO  Successfully connected to database.
All done, your SCM database is configured correctly!
```

存在していたら以下のファイルを削除する。（ただし、存在していなかった）

```
# rm /etc/cloudera-scm-server/db.mgmt.properties
```

cloudera-scm-serverを起動します。

```
# systemctl start cloudera-scm-server

以下はログの確認方法です。
tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log
```


# CDHのインストール

以下のURL（私の環境）でCloudera Manager管理コンソールにログインします。

- http://192.168.10.91:7180/

デフォルトの管理者のユーザ名とパスワードは以下になっています。

Username: admin
Password: admin

ログイン画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/3d57b203-1ee9-56ea-e2e4-cc9c02ce233a.png)

ようこそページでは、「続行」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/aaaf9e00-a205-bf5b-42dc-61c0ee539c88.png)

Accept Licenseページでは、チェックボックスにチェックを入れて「続行」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/4bc98834-51a8-015e-2a52-00ab5b341405.png)

Select Editionページでは、Cloudera Enterpriseのトライアルが選択されています。「続行」ボタンを押します。
トライアルで使用できるのは60日間です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/f1a97d19-5e4b-6a45-d0ed-668c46eaf2ee.png)

続いて、クラスタの作成に移ります。
ようこそページでは、「続行」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/639c53db-482b-2a92-df21-dbdaa18462d8.png)

Cluster Basicsページでは作成するクラスタ名を入力します。デフォルトで「Cluster 1」と入力されており、変更しないならそのまま「Continue」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/09dec026-d411-b2b8-c25a-a1a8555412b9.png)

Cloudera Managerの管理対象のホスト名を指定します。言い方を変えれば、HDFSやHBase等のサービスをインストールするホスト名のことです。
以下は「hbaseserver[2-4].example.com」と入力し、「検索」ボタンを押下した後の画面コピーです。
対象のホストのリストが問題なければ、「続行」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/5b3ca445-4d50-d65a-a55a-31431c89f044.png)

リポジトリの選択ページでは、Cloudera Manager Agent、CDH、その他のソフトウェアのリポジトリを指定できます。
メソッドの選択、CDHのバージョンは特に変更は必要ありません。
追加のParcelは必要があれば変更します。今回はデフォルトのまま進めています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/2409d5b2-eb35-af5e-3af2-bcaafd408a94.png)

JDKインストールオプションでは、管理対象のノードにインストールするJDKのライセンスを確認します。商用利用でなければ特に気にせず、チェックを入れて「続行」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/1298e740-1918-b3ae-546b-dd23fc202a38.png)

SSHログインの資格情報では、作成していたclouderaユーザを指定し、パスワードを入力します。
※パスワードなしでログインできるように設定しておくほうが良いです（今回は手抜きです）
同時インストールの数は、ネットワークの速度に応じて設定して下さい。今回は"1"を設定しました。（画面コピーでは"10"になっています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/28f65aa1-241a-4def-f2c2-785a3c7dfdce.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/c1021d05-b53b-2e95-7246-0cf1353067d1.png)


Install AgentページにAgentのインストールの進行状況が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/7e1ff263-74a0-4b89-bdc0-49e61d3f4c26.png)

Install Parcelsページに選択したParcelのインストールの進行状況が表示されます。
ダウンロード、配布、アンパック、アクティブ化の段階があり、サーバのスペックやネットワークの状況にもよりますが、時間がかかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/e91e9db3-0100-ba7f-3494-218caffe36f7.png)

Inspect Clusterページでは、ネットワークとホストの一般的な設定の検査を実行します。
まず、「Inspect Network Performance」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/f818f2a7-6ef9-3d64-c12b-6250fcc0ff1d.png)

Inspect Hostsボタンを押下すると検査が始まり、実行が終わると以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/34cfe3f0-e19d-99ce-9839-7d2fea9fd596.png)

インスペクタの結果を表示ボタンを押すと、以下のように結果が表示されます。
今回はSwappinessを10以下に設定してくださいなどの警告がでていますが、無視して進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/62ae8535-f1e0-a76e-1e2d-782e3c86e925.png)

Inspect Network Performanceボタンを押下すると検査が始まり、実行が終わると以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/a44f67b7-8e9f-a18c-a2aa-daab796e6568.png)

インスペクタの結果を表示ボタンを押すと結果が表示されます。今回は特にエラー、警告はでませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/b35370ea-f37a-cf00-2c7e-05a27855f477.png)

このようにいくつか警告がでるかもしれませんが、致命的なものがなければ「I understand the risks, let me continue with cluster creation」を選択し、クラスタインストールを終了します。

クラスタインストールを終了すると、次はクラスタのセットアップに移ります。


# クラスタのセットアップ

Select Servicesページでは、インストールしたいサービスを選択できます。
今回はカスタムサービスで、HBase, HDFSを選択しています。チェックを入れなくても依存するサービスは自動でインストールされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/8b56553b-1070-e316-33a7-678b82e9e9ed.png)

ロール割り当てのカスタマイズページでは、クラスタ内のホストに対するロールの割り当てが表示されます。
各ホストに対するロールは自動で割り当てられており、必要があればカスタマイズします。
今回は特に変更せずに進めています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/c20d1727-e7e5-dbf3-acfd-780bc7ae19c9.png)

ホスト別に表示ボタンを押すと、ホスト別にNameNode, DataNodeなどの割り当てられたロールが表示されるため見やすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/a4f08c77-af61-534a-4de5-a3860d724bd4.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/d9ccb00d-08c8-ddf9-54fd-bab5c0094a30.png)



変更の確認ページでは、データディレクトリを含む設定パラメータのデフォルト設定と推奨設定が一覧で表示されます。
今回は変更せず、Continueで次へ進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/16e6d842-910f-d6f3-1932-665cd0639699.png)

コマンドの詳細



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/0e2a7ac1-9881-247d-ec68-a8ed343a7261.png)

1回やり直しており上のようにエラーが出たので、以下のように一旦ディレクトリを移動させた。

```
# mv /dfs /dfs.back
```

その後にやり直すと、以下のように成功。
続行ボタンを押して次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/ae3d7ee5-7db6-2b0b-7c42-3b028c088f49.png)

サマリページが表示されるので、完了ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/3b5ce396-9dce-00ed-67a1-58f37d6976de.png)

完了ボタンを押すと、以下のように作成したクラスタのステータスが表示される画面へ遷移します。クラスタの設定はこれで完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/9b728096-0b26-90a0-c9fa-270c1555f352.png)



swappinessで警告が出ていたので、以下のように"10"を設定しています。サーバのロールによって適正値が異なりますが、これで警告はなくなります。

```
# vi /etc/sysctl.conf
vm.swappiness = 10

# sysctl -p
```



# Cloudera Manager Agentのログ

Agentのログは以下にディレクトリに出力されます。管理画面から見ることもできます（はず）。

/var/log/cloudera-scm-agent/cloudera-scm-agent.log

ログは基本的に/var/log以下に出力されているようです。
基本は管理画面からログを見れますが、直接の方が確認しやすいかと思います。


# HBaseの動作確認

インストールしたHBaseに対して、テーブル作成、put/scanを実行してみます。

```
#hbase shell

hbase(main):023:0> create 'test2', {NAME => 'data1'}, {NAME => 'data2'}
Created table test2
Took 1.9793 seconds                                                                           
=> Hbase::Table - test2

hbase(main):024:0> list
TABLE                                                                                         
test2                                                                                         
1 row(s)
Took 0.0328 seconds                                                                           
=> ["test2"]

hbase(main):026:0> put 'test2','key1','data2','value1'
Took 0.1505 seconds 

hbase(main):027:0> scan 'test2'
ROW                      COLUMN+CELL                                                          
 key1                    column=data2:, timestamp=1562277728928, value=value1                 
1 row(s)
Took 0.0318 seconds                                                                           
```

[追記]HBaseのバージョンを確認するとv2.1.0でした。

```
hbase(main):002:0* version
2.1.0-cdh6.2.0, rUnknown, Wed Mar 13 23:39:58 PDT 2019
Took 0.0182 seconds                                                                                                
```

バージョンは以下のサイトからも確認できます。

https://www.cloudera.com/documentation/enterprise/6/release-notes/topics/rg_cdh_62_packaging.html
https://archive.cloudera.com/cdh6/6.2.0/parcels/manifest.json



# クラスタの停止

クラスタを停止させる場合は、クラスタを選択した後で、[アクション] - [停止]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/67fabd12-74ad-ebc9-e384-11188b8a602a.png)


# Cloudera Managerの停止

Cloudera Managerを停止させる場合は、管理ノードで以下のコマンドを実行します。

- [Starting, Stopping, and Restarting the Cloudera Manager Server](https://www.cloudera.com/documentation/enterprise/6/6.2/topics/cm_ag_server.html)

```
systemctl stop cloudera-scm-server
systemctl stop postgresql
```

# 新規ホストを追加する

諸事情で管理対象のノードが3台しかなかったため、新規ホストを追加し4台構成にします。

まず、[ホスト] - [Add Hosts]を選択します。
以下は画面ハードコピーのみ載せておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/26d4ea7b-b75f-45d0-59e8-93c1957846c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/353c5538-afab-a278-fb7e-33f91b9c42ed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/3dc2e993-efea-51c2-78c7-87e0eca62a0d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/909f2198-2a8f-7100-d56e-d6a790bf3572.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/79f2ea55-f4f6-875f-1b36-47ec80000f1e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/46898c2f-9e91-2a3d-90d4-dc338fd7a101.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/76e983b9-cb06-24fa-3e15-741aeb148092.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/544d0c62-e246-6479-e513-272c0e6a62ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/c452d3fd-f8c9-abdb-c1ce-41c43de3344e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/e7e92858-dcb4-7010-bf56-112a61a06881.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/ea79c85d-245c-435d-a36f-210e4e5e1349.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/b69c36ea-ec9e-14ba-e941-b69e2ef553c6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/6f3be497-886b-998f-251e-6d8e39428e02.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/636fbdfa-c3cd-d625-33eb-0f6003d34d38.png)


# 参考

- [Cloudera Installation Guide](https://www.cloudera.com/documentation/enterprise/6/6.2/topics/installation.html)