こちらの記事はCloudera Manager Advent Calendar 2015の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を使って日々のKPI確認を可視化しようとした場合、グラフや表にIDとその値だけ表示させてもぱっと見で何を表しているのか分かりづらかったりします。なのでMySQLにあるマスターデータとjoinしたいなと考えるとHiveとMySQLを同時にjoinできるPrestoへ白羽の矢が立ちました。
Parcelとは
CMでdeployされるHadoopなどは、rpmやdebパッケージではなく、独自の(といってもtgzで固めたやつ)Parcelというものが使われています。ドキュメントはこちらです。
ParcelはCloudera Manager Serverの/opt/cloudera/parcel-repos
で管理されており、それが各サーバー配布されます。
ちなみに、Parcel解凍先である/opt/cloudera/parcels
を眺めていると、バージョンアップ、ダウングレードの際には解凍したParcelのディレクトリのSymlinkを貼り替えているのだなぁというのが見て取れます。
CSDとは
CSDはCustom Service Descriptorsの略でして、CM上で前述のオリジナルParcelを利用してシステムを起動や停止、再起動を行ったり、設定を行うための内容が定義されたものです。定義はjsonやシェルスクリプトで書いていきます。
ドキュメントはこちら。
Cloudera Manager版Prestoを使ってみる
というわけで、機能はかなり制限されておりますが、拙作のCM版Prestoを実際に使ってみるための手順です。
Presto-Parcelの作成と設置
こちらのリポジトリ(presto-parcel)をcloneしてmvn package
としてあげるとtarget/repository
ディレクトリ以下にparcelができています。
設置
本来であれば何らかのwebサーバをたててあげて、Cloudera公式のように各ディストリビューションのparcelとmanifest.json
を参照できるようにし、CMのRemote Parcel Repository URLs
に追加してあげるとDLが可能となります。
この画面です
わざわざ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に表示されるはずです。
表示されましたら他のparcelと同様に、配布してあげればOKです
Presto-CSDの作成と設置
parcel同様にこちらのリポジトリ(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を再起動すると、サービス追加が可能となります。
Prestoの文字が見えますね。
あとはよしなに設定するとPrestoが実行可能となるはずです。
ParcelとCSDの開発について
Parcelの用意についてはわりと単純で、配布したいプロダクトに必要なものをまるっとgzで固めてあげればOKです。
(ちょっとJSONや環境変数を書く必要がありますが…)
今回Presto用のPacelを作る上で、JDK8が必要だったため、Parcel内にJDK8も同梱するようにしました。
CDH5.3からCDHもJDK8をサポートするようになったので、すでにJDK8下でCloudera Managerが実行されていれば同梱しなくても良いかもしれません。
CSDの準備については、CM上で各種設定などを定義するservice.sdlの作成と各コマンドの内容を定義するシェルスクリプトの作成がかなり複雑になります。
今回作成した際の条件として、元のPrestoをいじらないでどうにかする、というのを掲げていたのでかなり無理をしています。また、現時点でこのPrestoで参照できるCatalogはHiveとMySQLのみなので、もうちょいなんとかしないとなぁという感じです。
なお、CSDのサンプルとしてClouderaのcm_csdsというリポジトリが大変参考になりましたので、見てみると良いかなと思います。
開発中に、作成したParcelとCSDの構成が問題ないかどうかは、Clouderaのcm_extリポジトリのvalidatorが利用可能ですので、ビルド→validateを繰り返して見るといいのではないかと思います。
最後に
今回CMで管理できるPrestoを作ろうと思ったきっかけはCloudera Managerで手軽にNorikraを試す | nagaseyasuhito Daily works.という記事を見て思いつきました。今回のParcel, CSDを作成するにあたってかなり参考にさせていただきまして、この場を借りて御礼申し上げます。
また、最近のCSD事情としてChange Logを見てみると、CM 5.4からモニタリングの定義ができるようになったようですよ!(申し訳ありませんが現時点でこちらは対応していません…)
使ってみた感想、プルリクエストなどお待ちしております。また、StormのParcel, CSDを作った方とかいらっしゃいましたらぜひ教えて下さい!