GCP環境にCloudera Altus Directorを入れてみた話（導入手順編）

[Distributed computing (Apache Spark, Hadoop, Kafka, ...) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/distributed-computing "") の 3日目（12/3）の記事になります！

今日は、 [昨日](https://developers.microad.co.jp/entry/advent-calendar-distributed-computing-1202) の続編として、GCP環境にCloudera Altus Directorを導入する手順となります。
作成する環境はこんな感じです。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209746/18bcc226-efeb-3e9e-bf8a-d5da8024893c.png)
|:-:|



## 手順１）GCPのプロジェクトを準備
GCPコンソールからプロジェクト名を入力して作成します。ここでは「microadprj」とします。

## 手順２）GCPのアカウント周りの準備
* IAMからサービスアカウントを作成し、「キーを作成」します。<br>
秘密鍵を含むファイルをJson指定でダウンロードしておきます。（★）
* 作成したサービスアカウントに、 役割「Compute 管理者」を付与します。 [^1]

[^1]: サービスアカウントには権限をつける必要があるはずなのですが、Clouderaのドキュメントには言及が見当たりませんでした。AWSの[Creating AWS Identity and Access Management (IAM) Policies | 6.3.x | Cloudera Documentation](https://docs.cloudera.com/documentation/director/latest/topics/director_iam_methods.html) を参考にし、GCEの管理者権限を持たせれば十分と判断し付与しています。が厳密には権限オーバーと思われます。


* ssh-keygenコマンドでキーペア（★★）を作成し、作成した公開鍵はGCEのメタデータに登録しておきます。

## 手順３）Director用GCEインスタンスを作成
GCPコンソールからGCEインスタンスを一つ作成します。

* スペック： お試しにはn1-standard-1以上、本番ならn1-standard-2以上が推奨されています。
* ブートディスク：　お試しには標準の永続ディスク、本番ならSSDが推奨です。
* プリエンプティブルVMの利用：　 必ずオフ（デフォルト）にしましょう。


という訳で、下記のようなインスタンスを作成しました。

``` 
名前 : cloudera-director
リージョン：asia-northeast1
ゾーン：　　asia-northeast1-b
マシンタイプ：n1-standard-2　（vCPU x 2、メモリ 7.5 GB）
ブートディスク：CentOS7　標準の永続ディスク10GB
IDとAPIへのアクセス：デフォルト（Compute Engine default service account)
ファイアウォール：HTTPもHTTPSもチェックなし
プリエンプティブルVMの利用：オフ
```


## 手順４）Director用GCEインスタンスにDirectorServerとClientをインストール
前項で作成したインスタンスにSSHログインしOpenJDKをインストールします。

```
$ sudo yum install java-1.8.0-openjdk
```

DirectorServerとClientをインストールしてDirectorServerを起動します。

```
$ sudo yum -y install wget
$ cd /etc/yum.repos.d/ 
$ sudo wget "http://archive.cloudera.com/director6/6.2/redhat7/cloudera-director.repo"
$ sudo yum install cloudera-director-server cloudera-director-client
$ sudo systemctl start cloudera-director-server
$ sudo systemctl disable firewalld 
$ sudo systemctl stop firewalld
```

無事起動すれば、7189ポートがListenします。起動しない場合は次のようにしてログを見ると良いです。

```
$ sudo less /var/log/cloudera-director-server/application.log
```

## 手順５）ローカルPCからSOCKSプロキシ経由でDirector画面を見る
セキュリティへの配慮でClouderaはSOCKSプロキシ経由でDirector画面を見る事を推奨しています。<br>

まずはMacのTerminalからSOCKSプロキシ起動 [^2]

```
$ gcloud compute --project "microadprj" ssh --zone "asia-northeast1-b" "cloudera-director" --ssh-key-file=~/ClouderaDirector/ssh/cloudera-director --ssh-flag="-D" --ssh-flag="1080" --ssh-flag="-N"'
```

MacのTerminalからChrome起動 [^2]

```
$ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --user-data-dir="$HOME/chrome-proxy-profile" --proxy-server="socks5://localhost:1080"
```

このChrome画面からhttp://（Director用インスタンスのローカルIP）:7189/ のURLを叩くと、 ``Welcome to Cloudera Altus Director`` 画面が表示されます。 


[^2]: 毎回長いコマンドを叩くのは面倒ですのでエイリアスを設定すると便利です。

## 手順６）DirectorおよびCM用のデータベースサーバを準備
Director及びCMのサービスと、そこで情報を保持するためのデータベースのリソースを分離したいので、外部データベースサーバを準備します。今回はMySQLを利用しました。

* GCEインスタンスを作成
下記のように作成しました。

``` 
名前 : cloudera-db
リージョン：asia-northeast1
ゾーン：　　asia-northeast1-b
マシンタイプ：n1-standard-2（vCPU x 2、メモリ 7.5 GB）
ブートディスク：CentOS7　標準の永続ディスク20GB
IDとAPIへのアクセス：デフォルト（Compute Engine default service account)
ファイアウォール：HTTPもHTTPSもチェックなし
プリエンプティブルVMの利用：オフ
```

* MySQLをインストールし起動
手順は[Install and Configure MySQL for Cloudera Software | 6.3.x | Cloudera Documentation]
(https://docs.cloudera.com/documentation/enterprise/6/latest/topics/cm_ig_mysql.html#cmig_topic_5_5) の通りです。

* MySQLに特権DBアカウントを作成（デプロイ用）
DirectorがCMやCDHクラスタをデプロイする際には、DirectorがMySQLにDBを自動作成するので、特権アカウントを利用します。

``` 
mysql> grant all on *.* to 'privilegeduser'@'%' identified by '適宜';
``` 

* MySQLにDirector用DBとDBアカウントを作成
Director用に、専用アカウントとDBを用意します。

``` 
mysql> create database director_db DEFAULT CHARACTER SET utf8;
mysql> grant all on director_db.* TO 'directoruser'@'%' IDENTIFIED BY '適宜';
``` 

##  手順７）DirectorからCMをデプロイ
ここからDirectorを使ってデプロイを進めます。

###  Environment の作成
手順５） で表示された``Welcome to Cloudera Altus Director``画面にて、チェックを入れて``Continue``を押下します。ログイン画面が出てきたら、Username、Passwordともadminでログインし、``Add Environment`` ボタンを押下します。``Add Environment``画面になりますので、以下のように入力します。

* Environment name：　環境名を適宜入力します。
* Project ID 　　：　手順１）で作成したプロジェクト名「microadprj」を入力。
* Cloud provider：　Google Cloud Platform
* Client ID JSON Key ：
手順２）でダウンロードしたJsonファイル（★）を選択します。この中にはサービスアカウントの秘密鍵が含まれます。
* SSH credentials：　
	* ``Username``はこれからDirectorが作成するインスタンスにSSHログインする際のアカウント名です。適当なものを入力します。
	* ``Private Key``は手順２）で作成したキーペア（★★）の秘密鍵です。（GCEのメタデータ に登録した公開鍵と対になるもの）

``Continue``を押下すると、Environmentが作成されます。

###  Deployment＝CM の作成
次に、``Advanced Setup``を選択します。[^3]
[^3]: Simple SetupはGCPではサポートされていませんでした。
すると``Add Deployment``画面になります。
Deployment名を「CM62」など適宜入力後、``Instance Template``で``Create New Instance Template``を選択しインスタンステンプレートを作成します。

|![AddDeployment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209746/c3139ad7-b407-bd2b-d556-9dba8e5df1d8.png)
|:-:|



CM用のインスタンステンプレートとして、下記の設定で作成します。

* Instance Template name：　template_CM　など適宜
* Machine Type ：　　　n1-standard-4 を選択
* Image Alias or URL：「https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-7-v20190515」 [^4]

[^4]: Director6.2.0では、Image Aliasの選択肢にはcentos6とrhel6しか出て来なかったので、URLを指定しています。6.3系では解消されていると思われます。<br>参考：[Solved: Re: Deploying Centos 7 on GCE - Cloudera Community](https://community.cloudera.com/t5/Cloudera-Altus-Director/Deploying-Centos-7-on-GCE/m-p/41501#M639)

* Tags　：　centos7 など適当に
* Zone　：　asia-northeast1-a などインスタンスを展開したいゾーンを指定
* Instance name prefix：　cloudera-manager などGCEインスタンス名のプレフィクスを指定
* Boot Disk Type  ：　　Standard   ※デフォルトだとローカルSSDなので注意！
* Data Disk Count：　　0
* Use Preemptible Instances：　　オフ

|![CreateNewInstanceTemplate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209746/6f09b0ae-82fd-1024-45bd-5b321bf41c84.png)
|:-:|



「Save Changes」を押下すると``Add Deployment``画面に戻ります。 

* License Type： Expressを選択

* Database Server：``Register Existing Database Server`` を選択し、手順６）で準備したデータベースサーバ、特権アカウントの情報を入力
``Save Database Server``を押下すると``Add Deployment``画面に戻ります。 

``Cloudera Manager Configurations``ボタンを押下すると``Cloudera Manager Configurations``画面が出ます。下記のように設定します。

* Host Monitor        firehose_heapsize　1073741824
* Service Monitor   firehose_heapsize　1073741824

``Save Changes``を押下すると``Add Deployment``画面に戻ります。 
CMログイン画面に設定したいユーザ名とパスワードを入力します。

``Continue``を押し同意画面を同意すると、GCEインスタンスの生成とCMのインストールが始まります。画面は``Add Cluster``画面に遷移します。
GCEインスタンスが追加され、Cloudera ExpressのDirectorバージョン6.2 に合わせた最新版 が入ります。[^5]

[^5]: CMのバージョンを指定したい場合は、「Override default Cloudera Manager repository」にチェックを入れ、RepositoryのURLを入力します。

## 手順８）DirectorからCDHクラスタをデプロイ
* ``Add Cluster``画面でCluster名を入力、CDHのバージョンを入力します。「6」と入れておくと、Directorバージョンに合わせた最新版 が入ります。[^６]

[^６]: CDHのバージョンを指定したい場合は、画面下方の「Configurations (optional)」を展開し、「Override default parcel repositories」にチェックを入れ、RepositoryのURLを入力します。

* ``Services``から入れたいサービスを選びます。
* ``Instance groups``エリアで、インスタンス作成する台数とインスタンステンプレートを選択します。インスタンステンプレートを作成する場合は``Create New Instance Template``を選択し、手順７）で実施した要領でインスタンステンプレートを作成します。
* ``Continue``を押し同意画面を同意すると、GCEインスタンスが追加され、CDHクラスタのデプロイが始まります。

|![AddCluster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209746/84fea8d1-2eca-abeb-cb2b-afd0176baa17.png)
|:-:|


## 手順９）CDHクラスタの接続確認

Gatewayからhdfsやbeelineコマンドで確認します。

## 手順１０）DirectorのDBをMySQLに載せ替える

デフォルトだと、組み込みのH2というDBに情報を持っていますが、本番利用では推奨されていません。
手順６）で用意したMySQLのDBに載せ替えます。

* cloudera-directorのインスタンスにSSHしDirectorを停止します。

```
# systemctl stop cloudera-director-server
```

* MySQL JDBC Driver のインストール
[Installing the MySQL JDBC Driver - Using MySQL for Altus Director Server \| 6\.3\.x \| Cloudera Documentation](https://docs.cloudera.com/documentation/director/latest/topics/director_use_ext_db_for_director_data.html#concept_fw5_lx2_zq) の通りです

* /etc/cloudera-director-server/application.properties を編集
[Configuring Altus Director Server to use the MySQL Database - Using MySQL for Altus Director Server \| 6\.3\.x \| Cloudera Documentation](https://docs.cloudera.com/documentation/director/latest/topics/director_use_ext_db_for_director_data.html#config_director_to_use_mysql) の通りです

* cloudera-directorでDBコピースクリプトを流す
[Migrating the Altus Director Database \| 6\.3\.x \| Cloudera Documentation](https://docs.cloudera.com/documentation/director/latest/topics/director_storage_copy_db.html) の通りです

* Directorを起動します

```
# systemctl start cloudera-director-server
```

あとはDirectorの動作確認をします。


手順としては以上になります。お役に立てれば幸いです。
ここまでお読み頂き有り難うございました。