こんにちは、データ周りを担当してる朴です。
今日はのデータ分析、可視化ツールで注目されているApache ZeppelinとSparkの連携およびZeppelinのマルチユーザー環境の設定について共有したいと思います。
簡単な紹介
簡単にApache zeppelinの紹介をしますと、Apache zeppelinはwebベースのデータ分析、データ可視化をインタラクティブにできるNotebook系のオープンソースです。
似たようなプロジェクトとしてはJupyter Notebookがあります。
主な特徴としては以下のとおりです。
- サポートしているバックエンドが豊富
- ほぼすべてのHadoop エコシステム,JDBCで接続できるRDBをサポート
- 言語もR,Python,Sql,Scalaなどデータ分析で流行ってる言語はほぼサポート
- Pluggableなパッケージ
- 0.7から追加されたHelium機能でサードパーティー制のグラフプラグイン、データインターフェースを追加できる
- データ分析結果を保存共有できる
- BIツールとしても使える
Sparkとの連携
Apache zeppelinは様々なデータソースをサポートしてますが、中でもSparkと連携するのが最もベーシックな使い方です。 今回はSpark2.1@CDH5.7.xと連携することを試したいと思います。
- インストール
公式サイトから2017年6月28日時点での最新バージョン(0.7.2)を落としてくるかソースからコンパイルすることも可能です。
$ wget http://ftp.jaist.ac.jp/pub/apache/zeppelin/zeppelin-0.7.2/zeppelin-0.7.2-bin-all.tgz $ tar -xvf zeppelin-0.7.2-bin-all.tgz
- Spark@CDH接続設定
zeppelin_home/confで以下の設定ファイルをコピー
$ cp zeppelin-site.xml.template zeppelin-site.xml $ cp zeppelin-env.sh.template zeppelin-env.sh
zeppelin-env.shに以下の環境変数を設定
export SPARK_HOME=/opt/cloudera/parcels/SPARK2-2.1.0.cloudera1-1.cdh5.7.0.p0.120904/lib/spark2 // 実際のSparkのホームディレクトリを設定 export SPARK_APP_NAME=zeppelin // これは設定しなくても動く export HADOOP_CONF_DIR=/etc/hadoop/conf export MASTER=yarn // sparkをyarnで動かす場合
- Zeppelinを起動する
zeppelin_home/binで以下のコマンドを叩く
./zeppelin-daemon.sh start
ブラウザでhttp://ホスト名:8080入力して、以下の画面が出ればOK
- interpreterの設定:Spark
Zeppelinではinterpreterを経由して色んなバックエンドに接続してます。
SparkをYarnで動かすためには以下の設定が必要となります。
右上のanonymousをクリックし、intepreterをクリックします。
interpreterからsparkを検索して、出てきたsparkのinterpreter画面でmasterにyarnを設定する
これでSparkをYarn上動かせるようになりました。
- 軽く動作確認
Zeppelinのホーム画面に戻り、NotebookメニューからCreate new noteを選択して新しいnotebookを作成します。 Default Interpreterはsparkを選びます。
以下のコードを入力して、実行します。
sc.version res1: String = 2.1.0.cloudera1 sc.master res1: String = yarn
Spark 2.1がYarnで動いてることを確認しました。
マルチユーザー環境にするには(Multi-user Support)
apache zeppelinは0.6まではマルチユーザー環境のサポートが不十分だったようですが、0.7になってから一気にマルチユーザー関連の機能をいくつかリリースしてありますので、その辺の設定方法を共有したいと思います。
詳細は以下リリースノートのMultiuser Supportをご覧ください。
https://zeppelin.apache.org/releases/zeppelin-release-0.7.0.html
- ユーザ認証を有効に
デフォルトだとanonymousでログインできますが、これだとzeppelin画面に接続できるすべての人が勝手にnotebookを通して、大切なサーバーリソースを使えてしまうので、あまり望ましくありません。 anonymousログインをfalseにすることでユーザごとのID/PWでログインさせます。 zeppelin_home/conf/zeppelin-site.xmlの以下の2つをtrue -> falseにします。
<property> <name>zeppelin.anonymous.allowed</name> <value>true</value> <description>Anonymous user allowed by default</description> </property> <property> <name>zeppelin.notebook.public</name> <value>true</value> <description>Make notebook public by default when created, private otherwise</description> </property>
zeppelin_home/conf/shiro.ini.templateをshiro.iniにコピーします。
$ cp shiro.ini.template shiro.ini
※ZeppelinはApache shiroを使ってユーザ認証を実現しています。https://zeppelin.apache.org/docs/0.7.0/security/shiroauthentication.html
shiro.iniの中身をのぞいてみるとデフォルトで以下のユーザが設定されていることが分かります。
admin = password1, admin user1 = password2, role1, role2 user2 = password3, role3 user3 = password4, role2
※id = password, roleのフォーマットで設定されてます。
roleも設定できるので、柔軟な権限設定が出来そうです。
zeppelin再起動します
$ ./zeppelin-daemon.sh restart
再びzeppelin home画面に入るとanynomous代わりにloginボタンが表示されます。
これでnotebookをユーザごとに作成・管理できるようになりました。
user1とuser2でそれぞれログインしてnotebook作ってお互いに相手が作ったnotebookがメニューから見えないことを確認できればOKです。
- Spark applicationをユーザごとに実行する
上の設定までだとuserは分かれていてもsparkのapplicationは一つを共有することになります。
spark applicationをユーザごとに作成するにはspark interpreterのOptionを
The interpreter will be instantiated Per User in isolated per userに変更する必要があります。
上記設定をsaveしてrestartすれば反映されます。
user1のapplicationIdを確認
sc.applicationId res1: String = application_1498098397540_0004
user2のapplicationIdを確認
sc.applicationId res1: String = application_1498098397540_0005
それぞれ異なるIDが出たので、違うアプリケーションとして動くことが分かります。
以上で、マルチユーザー環境のの設定も完了したので、チームでNotebookを使って作業を進めることができます。