PrestoをCloudera Manager上で管理できるようにしてみた話

こちらの記事は[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の13日目です。

# はじめに

Cloudera Manager（以下CMと記述）を利用するとHadoopやHive, HBaseはもちろん、SparkやKafkaなどHadoopエコシステムを支える様々なプロダクトを簡単にインストール、運用できて大変便利ですね。
とはいえ、Hadoop上で動くプロダクトはどんどん新しい物が出ておりまして、中には使ってみたいものがCMでインストール出来ないものがあるのも事実です。
例えばPrestoなんかとても便利に使えますが、CMでは管理ができません。まぁChefやPuppetなどを使って構成管理をするのもいいのですが、普段からCMを使っているとそこでなんでも管理したくなるものではないでしょうか？
実はCloudera Managerではそのような要望を満たすために、独自のParcel、CSDを作成できる機能を擁しています。
今回、簡単ではありますがPrestoをCM上で運用できるようにしてみたので、そちらを紹介します。

## なぜPrestoを使いたくなったか

ふだんHadoopに蓄積したログなどを分析するのにはHue上からHive、Impala等を利用して分析するので十分なのですが、[re:dash](http://redash.io/)を使って日々のKPI確認を可視化しようとした場合、グラフや表にIDとその値だけ表示させてもぱっと見で何を表しているのか分かりづらかったりします。なのでMySQLにあるマスターデータとjoinしたいなと考えるとHiveとMySQLを同時にjoinできるPrestoへ白羽の矢が立ちました。

# Parcelとは

CMでdeployされるHadoopなどは、rpmやdebパッケージではなく、独自の（といってもtgzで固めたやつ）Parcelというものが使われています。ドキュメントは[こちら](https://github.com/cloudera/cm_ext/wiki/Parcels%3A-What-and-Why%3F)です。
ParcelはCloudera Manager Serverの`/opt/cloudera/parcel-repos`で管理されており、それが各サーバー配布されます。
ちなみに、Parcel解凍先である`/opt/cloudera/parcels`を眺めていると、バージョンアップ、ダウングレードの際には解凍したParcelのディレクトリのSymlinkを貼り替えているのだなぁというのが見て取れます。

# CSDとは

CSDはCustom Service Descriptorsの略でして、CM上で前述のオリジナルParcelを利用してシステムを起動や停止、再起動を行ったり、設定を行うための内容が定義されたものです。定義はjsonやシェルスクリプトで書いていきます。
ドキュメントは[こちら](https://github.com/cloudera/cm_ext/wiki/CSD-Overview)。

# Cloudera Manager版Prestoを使ってみる

というわけで、機能はかなり制限されておりますが、拙作のCM版Prestoを実際に使ってみるための手順です。

## Presto-Parcelの作成と設置

こちらのリポジトリ（[presto-parcel](https://github.com/s-wool/presto-parcel)）をcloneして`mvn package`としてあげると`target/repository`ディレクトリ以下にparcelができています。

### 設置

本来であれば何らかのwebサーバをたててあげて、[Cloudera公式のように](http://archive.cloudera.com/cdh5/parcels/latest/)各ディストリビューションのparcelと`manifest.json`を参照できるようにし、CMの`Remote Parcel Repository URLs`に追加してあげるとDLが可能となります。
この画面です
<img width="640" alt="54836557abceff6480e8258fd256f478.png" src="https://qiita-image-store.s3.amazonaws.com/0/4286/d3eddf27-17ed-5dfe-a4b9-897230b5a459.png">

わざわざwebサーバをたてるのが面倒な場合、Cloudera Manager Serverの`/opt/cloudera/parcel-repo/`に自分のディストリビューションのparcelと、`ファイル名.sha`という`sha1sum`が書かれたファイルの2つを設置すれば、CMのParcel一覧画面に表示されます。

```
$ ls -lah /opt/cloudera/parcel-repo/
略
-rw-rw-r-- 1 cloudera-scm cloudera-scm 576M Dec 13 22:18 PRESTO-0.125.presto0.1-el6.parcel
-rw-rw-r-- 1 cloudera-scm cloudera-scm   41 Dec 13 22:39 PRESTO-0.125.presto0.1-el6.parcel.sha
$ cat PRESTO-0.125.presto0.1-el6.parcel.sha
489a91986a6dc8c27d3317bc61adc3cc157da85d
```

追加がうまくいくと下記のように配布可能Parcelに表示されるはずです。
<img width="794" alt="1fd89bb5cad447e6396ef1cc8fac0526.png" src="https://qiita-image-store.s3.amazonaws.com/0/4286/1b7a46c9-87df-c4ee-9be2-275d0fad8bcb.png">

表示されましたら他のparcelと同様に、配布してあげればOKです

## Presto-CSDの作成と設置

parcel同様にこちらのリポジトリ（[presto-csd](https://github.com/s-wool/presto-csd)）をcloneして`mvn package`してあげると`target`ディレクトリ以下にCSD用のJARが出来上がります。

###

CSDは`/opt/cloudera/csd`にJARを設置し、`cloudera-scm`ユーザーで読み込み可能にしてあげます。

```
$ ls -la /opt/cloudera/csd/
total 16
drwxr-xr-x 2 cloudera-scm cloudera-scm 4096 Dec 13 06:34 .
drwxr-xr-x 6 cloudera-scm cloudera-scm 4096 Dec 13 06:34 ..
-rwxr-x--- 1 cloudera-scm cloudera-scm 5515 Dec 13 06:34 PRESTO-0.1.jar
```

Cloudera Manager Serverを再起動すると、サービス追加が可能となります。

<img width="581" alt="10a9cae57fc0e51d159639ade23b50e8.png" src="https://qiita-image-store.s3.amazonaws.com/0/4286/36354e88-47d1-f190-165c-1fd7f8093462.png">

Prestoの文字が見えますね。
あとはよしなに設定するとPrestoが実行可能となるはずです。

# ParcelとCSDの開発について

Parcelの用意についてはわりと単純で、配布したいプロダクトに必要なものをまるっとgzで固めてあげればOKです。
（ちょっと[JSONや環境変数を書く必要があります](https://github.com/s-wool/presto-parcel/tree/master/src/main/resources/meta)が…）
今回Presto用のPacelを作る上で、JDK8が必要だったため、Parcel内にJDK8も同梱するようにしました。
CDH5.3からCDHもJDK8をサポートするようになったので、すでにJDK8下でCloudera Managerが実行されていれば同梱しなくても良いかもしれません。
CSDの準備については、CM上で各種設定などを定義する[service.sdl](https://github.com/s-wool/presto-csd/blob/master/src/main/resources/descriptor/service.sdl)の作成と各コマンドの内容を定義する[シェルスクリプト](https://github.com/s-wool/presto-csd/blob/master/src/main/resources/scripts/control.sh)の作成がかなり複雑になります。
今回作成した際の条件として、元のPrestoをいじらないでどうにかする、というのを掲げていたのでかなり無理をしています。また、現時点でこのPrestoで参照できるCatalogはHiveとMySQLのみなので、もうちょいなんとかしないとなぁという感じです。
なお、CSDのサンプルとしてClouderaの[cm_csds](https://github.com/cloudera/cm_csds)というリポジトリが大変参考になりましたので、見てみると良いかなと思います。
開発中に、作成したParcelとCSDの構成が問題ないかどうかは、Clouderaの[cm_ext](https://github.com/cloudera/cm_ext)リポジトリの[validator](https://github.com/cloudera/cm_ext/tree/master/validator)が利用可能ですので、ビルド→validateを繰り返して見るといいのではないかと思います。

# 最後に

今回CMで管理できるPrestoを作ろうと思ったきっかけは[Cloudera Managerで手軽にNorikraを試す | nagaseyasuhito Daily works.](http://www.nagaseyasuhito.net/2014/07/28/434/)という記事を見て思いつきました。今回のParcel, CSDを作成するにあたってかなり参考にさせていただきまして、この場を借りて御礼申し上げます。
また、最近のCSD事情として[Change Log](https://github.com/cloudera/cm_ext/wiki/Change-Log)を見てみると、CM 5.4からモニタリングの定義ができるようになったようですよ！（申し訳ありませんが現時点でこちらは対応していません…）
使ってみた感想、プルリクエストなどお待ちしております。また、StormのParcel, CSDを作った方とかいらっしゃいましたらぜひ教えて下さい！