Impalaクラスターを立ててRedshiftをやめる (1)

# まえおき
- Redshiftは楽らしい。Redshift spectrumもできて、ファイルに直接クエリをかけられる。
- ただ高いし、同時接続数に限りがある。
- Cloudera寄りな感じするけど、[こんな記事] (https://blog.cloudera.co.jp/apache-impala-incubating-%E3%81%A8amazon-redshift%E3%82%92%E6%AF%94%E8%BC%83%E8%A9%95%E4%BE%A1-aws%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bs3%E3%81%A8%E3%81%AE%E7%B5%B1%E5%90%88-%E5%BC%BE%E5%8A%9B%E6%80%A7-%E3%82%A2%E3%82%B8%E3%83%AA%E3%83%86%E3%82%A3-%E3%81%9D%E3%81%97%E3%81%A6%E3%82%B3%E3%82%B9%E3%83%88%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%AE%E5%84%AA%E4%BD%8D%E6%80%A7%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-1c4fa0a0601b)もあって、本当に早いの？という気持ちで、使ってみたかった。
- EMRはImpalaのサポートを、1.2.4の時点で打ち切った（EMRのバージョンは3.9.0）。今のImpala最新バージョンは2.11.0 (2018/4/18)。Redshiftを使ってもらえなくなるから？
- EMRは使えないので、ClouderaDirectorなるサービスでImpalaクラスターを立てる。

# シリーズの構成（予定）
- Impalaクラスターを立ててRedshiftをやめる (1) <- これ
    - クラスターを立てる
- Impalaクラスターを立ててRedshiftをやめる (2)
    - S3にあるファイルにクエリを投げる
- Impalaクラスターを立ててRedshiftをやめる (3)
    - 実際にRedshiftと比較

# クラスターの全体像
- [これ](https://image.slidesharecdn.com/introducingclouderadirector-150928004333-lva1-app6892/95/introducing-cloudera-director-at-big-data-bash-6-638.jpg?cb=1443401190)
- 一つのEC2インスタンスにClouderaDirectorなるクラスター管理サービスをインストールする。
- ClouderaManagerなるツールはクラスターに一つ。ClouderaManagerがworkerノードを管理する。

# 手順
### 基本は全部ここに載ってる通りに進めていく。
- https://www.cloudera.com/documentation/director/latest/topics/director_get_started_aws.html

##  1. AWS環境のセットアップ
#### [参考リンク](https://www.cloudera.com/documentation/director/latest/topics/director_aws_setup_client.html#concept_epj_1lt_nv)
- VPCの作成
- SGの作成
- キーペアの作成
    - EC2にSSHで入るため
- IAMロールの作成
    - [参考](https://www.cloudera.com/documentation/director/latest/topics/director_iam_methods.html#xd_583c10bfdbd326ba-590cb1d1-149e9ca9886--6f69)
    - [JSON](https://www.cloudera.com/documentation/director/latest/topics/director_iam_methods.html#xd_583c10bfdbd326ba-590cb1d1-149e9ca9886--6f69__section_akx_gf4_vs)を貼り付けて、ポリシーを作成。
    - 作成したポリシーを持つIAMロールを作成しておく。2で使う。（cloudera-directorという名前で作成）

## 2. ClouderaDirector用EC2のセットアップ
#### [参考リンク](https://www.cloudera.com/documentation/director/latest/topics/director_deployment_start_launcher.html)
- 書いてあるとおり、コミュニティAMIタブで、`rhel-7.3 HVM` と検索すると、色々なAMIがでてくる。よくわからないが名前中のタイムスタンプが新しそうな `RHEL-7.3_HVM-20170613-x86_64-4-Hourly2-GP2 - ami-5c9a933b` を選択。
- c4.large/c3.largeが推奨とのことなのでc4.largeを選択。
- インスタンスのいろいろ設定
    - ここで、スポットインスタンスをリクエストすると、作成する最後になって以下のエラーが表示される。
![スクリーンショット 2018-04-18 14.00.11.png](https://qiita-image-store.s3.amazonaws.com/0/127879/9e363649-1f86-fe9e-cf1f-80f2dd84b69d.png)
なのでオンデマンドのままでインスタンスを生成。
    - 1で作ったIAMロールをアタッチする。
    - 自動割り当てパブリックIPを、 `サブネットほにゃらら` → `有効化`に変更
    - `誤った..` にもチェック
- SGは、`自分のIPからのSSH`と `自分のSGからのすべてのトラフィック`をつけると書いてあるが、新規作成時には自分自身(のSG)からのアクセスを選択できない。インスタンス生成後に、SGの編集画面から設定する。

## 3. ClouderaDirectorのインストール
#### [参考リンク](https://www.cloudera.com/documentation/director/latest/topics/director_get_started_aws_install_dir_server.html#concept_oyz_tkt_nv)
- `ClouderaDirectorServer`/ `ClouderaDirectorClient`があるが、今回はServerのみインストールする。
- 2で立てたEC2にSSHで入る。
    - (よくわからない) privateIPでは入れず、publicIPで入った。
- java8最新版のインストール（2018/4/18)

```sh
$ sudo yum install -y wget
$ sudo wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.rpm
$ sudo yum localinstall -y jdk-8u171-linux-x64.rpm
$ java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
```
- ClouderaDirectorのインストールは、参考リンクのを辿っていけばおk。

```sh
$ sudo service cloudera-director-server start
Started Cloudera Director Server (cloudera-director-server)[  OK  ]
```
- firewallは、入ってないのかな？特にstopする必要なし。

```sh
$ sudo systemctl status firewalld
Unit firewalld.service could not be found.
```

## 4. SOCKSプロキシの設定
#### [参考リンク](https://www.cloudera.com/documentation/director/latest/topics/director_security_socks.html)
- EMRでも同様のプロキシ設定が必要になるが、この場合ではClouderaDirectorが立ってるEC2にトンネルを掘ることでクラスター内にアクセスする。
- トンネルを掘る。

```sh
$ nohup ssh -i "your-key-file.pem" -CND 8157 ec2-user@instance_running_director_server &
```
- EMRで推奨されているように、ChromeのExtensionでプロキシしても良いが、Chrome自体にプロキシの設定を入れて立ち上げることができるらしいので、やってみる。下記はMac用。

```sh
$ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--user-data-dir="$HOME/chrome-with-proxy" \
--proxy-server="socks5://localhost:8157"
```

- 立ち上げたChromeで `http://instance_running_director_server:7189`にアクセスして、ClouderaDirectorのWelcome画面が表示されればおk。アクセス先のIPはプライベートIP。

<img width="636" alt="スクリーンショット 2018-04-18 14.52.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/127879/70cc18d8-e667-f8c5-ed5c-536a9a8e1060.png">

## 5. Cloudera Managerのデプロイ
#### [参考リンク](https://www.cloudera.com/documentation/director/latest/topics/director_get_started_aws_install_cm_cdh.html#concept_qdt_jgb_3t)
- ClouderaManager, workerノードを立ち上げる。
- 参考リンク通りに進んでいけばおk。
- IAMロールを付与しているので、AccessKeyの入力は不要。
- インスタンスタイプはm4.xlargeを選択。ClouderaManagerも、workerノードも、このテンプレートを元にして立ち上げる。
- **チュートリアルの画像では、テンプレートのtagで`Name`を設定しているが、これが入ってるとエラーになる** (ちゃんと文章では注意されているのだけれど)
- ClouderaManagerが立ち上がったら、クラスターのworkerノードを作成する。
- 今回はImpalaクラスターを立てるので、 `Core Hadoop with Impala`を選択。
- どんなものかわからないので、インスタンス数は `m-w-g`は `1-3-1`で立てる。
- ここまでで立ち上げは終わり。

## X1. Impalaが立ち上がらない
- ClouderaManagerを見ていると、Impalaが立ち上がらない！
![スクリーンショット 2018-04-18 16.42.40.png](https://qiita-image-store.s3.amazonaws.com/0/127879/ae144118-ba84-1ab2-2da2-4d5cc3044db0.png)
- impala daemonが立ち上がるはずのサーバに入り、`/var/log/impalad/impalad.INFO`を覗くと、以下のエラーが出力されている。

```
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGBUS (0x7) at pc=0x00007f7160afa47d, pid=15976, tid=140125096192384
#
# JRE version:  (7.0_67-b01) (build )
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.65-b04 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# j  java.lang.Object.<clinit>()V+0
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting
Java again
#
# An error report file with more information is saved as:
# /run/cloudera-scm-agent/process/70-impala-IMPALAD/hs_err_pid15976.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
```

- さっぱりわからないが、http://community.cloudera.com/t5/Interactive-Short-cycle-SQL/Impala-daemon-fail-to-start-CDH-5-11-1-unable-to-start-it-even/td-p/56304 によると

> Add the following to /usr/lib/cmf/service/impala/impala.sh, right above "set impala configuration directory":
export JAVA_TOOL_OPTIONS="-Xss2m"

とのことなので、クラスター内のサーバーを回り、`/usr/lib64/cmf/service/impala/impala.sh`（回答とはちょっと違う場所にある）を上記のように編集してClouderaManagerからImpalaサービスを再起動。

めでたくクラスターは立ち上がった🎉
![スクリーンショット 2018-04-18 17.31.38.png](https://qiita-image-store.s3.amazonaws.com/0/127879/3a950f63-c7f7-dde5-d95b-3c6cb9ed5e82.png)