シリーズのリンク
- 機能紹介編
- インストール・起動・停止編
- 設定編
- Sparkインタープリタ編
- その他インタープリタ編(予定)
要約
- Apache ZeppelinはSparkを中心としつつ
Redshift、BigQueryなどの他データソースにも対応できるノートブック。 - Apache Zeppelinはフォーム入力やバージョン管理、
ノートのスケジュール実行ができるなど高機能なノートブック。
このシリーズの対象読者
- データ分析プラットフォームに興味はあるが詳しくは知らない。
- 設定などSparkに関する基本的な事項は把握している。
- Javaで一般的な依存性管理方法は把握している。
注意(必ずお読みください)
- 以下は免責事項です。
- 本シリーズに掲載された内容は投稿者の個人的見解であり、
所属する企業・部門の公式見解ではありません。 - 本シリーズに掲載された内容について
可能な限り正確を期すようにしておりますが、
掲載された内容の正確性、信頼性、完全性を
保証するものではございません。 - 本シリーズに掲載された内容によって生じた
あらゆる損害等に関して投稿者ならびに所属する企業・部門は
一切の責任を負いません。
- 本シリーズに掲載された内容は投稿者の個人的見解であり、
- 将来的に追加、変更、廃止される機能も当然ございますので
Apache Zeppelinを使用する際は公式ページにて確認をお願いいたします。 - このシリーズではSparkやScalaといった
Apache Zeppelin以外の事項に関しては解説いたしません。
それぞれについて解説しているサイトにて確認をお願いいたします。
このシリーズでの環境
- OS
macOS - メモリ
16GB - Java
OpenJDK 64-Bit Server VM, Java 1.8.0_232 - Scala
2.13.1 - Apache Zeppelin
0.8.2 - Apache Spark
2.4.4
シリーズの背景
Apache Zeppelinについては以前から興味があって
個人的にいろいろ試したりしていました。
ただ今の職場では主に省力化の観点からクラウド環境のみ使用する方針なので、
Apache Zeppelinを実際の仕事に用いるにはフルマネージドのサービスとして
提供されてなければ無理かなと思っております
(AWS EMRやCloud Dataprocといったある程度マネージするものはあります)。
Apache Zeppelinを活用する人が増えたら
フルマネージドのサービスが提供されるかも?
みたいな淡い期待を持ってこのシリーズを初めてみました。
このシリーズを読んでいただいてApache Zeppelinについて
少しでも興味を持っていただけたら幸いです。
Apache Zeppelinとは
Sparkから取得したデータを表やグラフとして表示することを主用途としつつ、
RedshiftやBigQueryなどの他データソースからのデータも同様に表示したり、
Scala、Python、R、Shellコマンドを実行できたりなどと いろいろできる
Scalaで実装された高機能なノートブック です。
なおライセンスはApache License 2.0です。
ノートブックとは
Apache Zeppelinはノートブックなのですが、
ノートブックとは何かというと以下のものになります。
文芸的プログラムを記述する環境となる仮想的なノート
では文芸的プログラムとは何かというと
簡単に言えば以下のものになります。
ブラウザ等でプログラムコードとコメントを
入力してそれらを別々に処理した結果を出力するもの
このためノートブックのユーザにプログラムコードの出力結果が何かを
コメントによってわかりやすく説明することができます。
プログラムコードとコメントは主にエンジニアが書くものとなりますが
どんなに複雑なプログラムコードであっても付随するコメントにより
非エンジニアがその出力結果を比較的容易に理解・利用できる ことが
ノートブックを使用する利点だと個人的に考えております。
Apache Zeppelinの機能(一部抜粋)
-
インタープリタ
Apache ZeppelinはSpark、Spark SQLやRedshiftなどの
JDBCを通してアクセスできるものなどの各種データソースや、
Markdownなどのコメントを出力するものなど
多種多様な機能を実行できるノートブックとなっております。
この多種多様な機能
それぞれをできるようにするためのプラグインを
総称して インタープリタ と呼びます。
後述するコードセクションの先頭行に%インタープリタ名
と指定することで
そのインタープリタに対応する機能が実行可能になります。
デフォルトで組み込まれているインタープリタは以下のものになります。機能 インタープリタ名 Alluxio %alluxio AngularJS %angular BigQuery %bigquery Apache Cassandra %cassandra Elasticsearch %elasticsearch HDFS %file Apache Flink %flink Groovy %groovy Apache HBase %hbase Apache Ignite %ignite Redshift/MySQLなど %jdbc Apache Kylin %kylin Apache Lens %lens Apache Livy %livy Markdown %md Neo4j %neo4j Apache Pig %pig Python(2系か3系かは設定による) %python SAP BusinessObjects %sap Shellコマンド %sh Apache Spark %spark PySpark %pyspark SparkR %spark.r Spark SQL %sql またインタープリタを自作する機能もあります。
-
セキュリティ
Apache Zeppelinでは下記に関するセキュリティに関する設定ができます。- NGINXを用いたベーシック認証
- Shiroによるログイン認証
- Shiroによる各種アクセス権限認可
- データソースへのログイン認証
- HTTPレスポンスヘッダによるセキュリティ制御
このうち
Shiroによるログイン認証
とShiroによる各種アクセス権限認可
に関して
追加の説明をします。
この2つで使われるApache ShiroはJava製の
認証・認可・暗号化・セッション管理フレームワークです。
ログイン認証する際には以下のコマンドでテンプレートをコピーした後、
(コマンド等はApache Zeppelin使用環境に応じて適切に変更してください)cp ./conf/shiro.ini.template ./conf/shiro.ini
この
shiro.ini
内の以下のusers
セクションの箇所で
ユーザ名とパスワード、ロールの設定が行えます。[users] # List of users with their password allowed to access Zeppelin. # To use a different strategy (LDAP / Database / ...) check the shiro doc at http://shiro.apache.org/configuration.html#Configuration-INISections # To enable admin user, uncomment the following line and set an appropriate password. #admin = password1, admin user1 = password2, role1, role2 user2 = password3, role3 user3 = password4, role2
設定後にApache Zeppelinを再起動すると下記のログイン画面にて
上記で設定したユーザ名等でログインできるようになります。
各種アクセス権限認可は前提として Shiroによるログイン認証の
設定をすることが必要 となります。
以下の画面にあるようにノートの右上にある鍵のアイコンをクリックすると
表示されるフォームでshiro.ini
で設定した各ユーザに対して
ノートの所有者(Owners)ならびにノートの各パラグラフに対する
書き込み権限(Writers)、実行権限(Runners)、読み込み権限(Readers)を
設定できます。
例えばあるパラグラフに対してそれに書き込む権限がないユーザが
書き込もうとすると下記の画面のようなエラーダイアログが表示されます。
-
リッチなUI
Apache Zeppelinでは実行単位である パラグラフ というものを
ノート というものでグルーピングした状態で管理しております。
さらに パラグラフ ではコードを記述する コードセクション と
それコードの実行結果を表示する リザルトセクション の
2つに区分けされます。
このパラグラフは高さの自由な調節と幅の段階的な調節ができます
(ノート内での位置はパラグラフ間の表示順序を変えられるだけです)。
以下は機能例です(これはApache Zeppelinのチュートリアルにあったのを
見やすくするために簡易化したものです)。
上部にあるパラグラフに対して下部のパラグラフの幅を半分にしてます。
-
Dynamic Form
インタープリタが JDBC や Spark SQL のようにSQLを用いるもの、
Markdown や Shellコマンド のように文字列を用いるものには
コードセクションに${フォーム名}
というような記述をして実行すると
同じパラグラフのリザルトセクションにフォームが出力され、
コードセクション内のその記述がフォームへの入力値で置き換えられます。
またインタープリタが Spark または PySpark の場合には
上記の代わりにz.textbox(・・・)
のようなメソッドを呼び出すと
同様にリザルトセクションにフォームが出力され、
フォームへの入力値がこのメソッドの戻り値として取得できます。
この機能は Dynamic Form というものでコードセクションに
リテラルを書き込む必要性がなくなることで、
例えばコードの処理に対するパラメタとして指定する値を変更する際に
コードに不具合が混入する可能性がなくなります。
Dynamic Formにはいくつか種類があります。
以下はコードセクションにSQL、文字列を記述する
インタープリタの場合です。# テキストボックス ${フォーム名} ${フォーム名=デフォルト値} # セレクトボックス ${フォーム名=デフォルト値,オプション値1|オプション値2|・・・} ${フォーム名=デフォルト値,オプション値1(表示名1)|オプション値2(表示名2)|・・・} # チェックボックス ${checkbox:フォーム名=デフォルト値1|デフォルト値2|・・・,オプション値1|オプション値2|・・・} ${checkbox(区切り文字列):フォーム名=デフォルト値1|デフォルト値2|・・・,オプション値1|オプション値2|・・・}
以下は Spark または PySpark の場合です。
# テキストボックス(Spark/PySpark) z.textbox("フォーム名") z.textbox("フォーム名","入力値がない場合のデフォルト値") # セレクトボックス(Spark) z.select("フォーム名",Seq(("オプション値1","表示名1"),("オプション値2","表示名2"),・・・)) # セレクトボックス(PySpark) z.select("フォーム名",[("オプション値1","表示名1"),("オプション値2","表示名2"),・・・]) # チェックボックス(Spark) z.checkbox("フォーム名",Seq(("オプション値1","表示名1"),("オプション値2","表示名2"),・・・)) .mkString("区切り文字列") # チェックボックス(PySpark) "区切り文字列".join(z.checkbox("フォーム名",[("オプション値1","表示名1"),("オプション値2","表示名2"),・・・]))
なおデフォルトではこれらのフォームの入力値を変更すると
即座にその入力値を元にしてコードセクションの処理内容が実行されます。
即座に実行されないようにするためにはパラグラフの右上にある
歯車のアイコンをクリックすると表示されるRun on selection change
の
チェックボックスのチェックを外す必要があります。
以下はDynamic Formの実装例です。
-
AngularJS
Apache ZeppelinでAngularJSを使用して見栄えがするノートを作成できます。
Dynamic Formと同様にSparkのインタープリタのコードセクションで
特定メソッド呼び出しで用いる方法もありますが、
その場合には大抵Dynamic Formで事足りるため、
実用性を考慮するとAngularJSのインタープリタのコードセクションで
各パラグラフにフォームの入力値を反映させるUIを
作成していくことになると思います。
AngularJSのインタープリタで使用できるAPIは以下のとおりです。
なお下記のパラグラフID
は各パラグラフの右上の歯車のアイコンを
クリックした際に出力されるメニューの一番上に
表示される文字列のことを指します。# Angularオブジェクトに値を設定する z.angularbind(Angularオブジェクト名,初期値,パラグラフID) # Angularオブジェクトを解放する z.angularUnbind(Angularオブジェクト名,パラグラフID) # 別のパラグラフを実行する z.runParagraph(パラグラフID)
他のパラグラフでは各インタープリタにて下記方法でその値を取得できます。
# AngularJS {{Angularオブジェクト名}} # Spark z.angular("Angularオブジェクト名")
以下の画面のようにAngularJSのインタープリタのパラグラフを実行すると
そのパラグラフのリザルトセクションのフォームへの入力値が
他の2つのパラグラフにも反映されます。
-
バージョン管理
パラグラフを追加またはパラグラフのコードセクションを変更後に
下記画面のようにメモのアイコンをクリックすることでその修正を
組み込みのgitのリポジトリにコミットできます。
以前のコミット時の状態を表示(修正・実行はできません)する場合は
下記画面のようにコミットメッセージの右隣のアイコンをクリックすることで
選択したコミット時の状態の表示できます。
上記で別のコミットを選択した状態で下記画面のように
右矢印のアイコンをクリックすることで選択したコミット時の状態に
リセットするかのダイアログが表示され、
OKボタンをクリックするとリセットできます(リセット前のコミットは
失われませんが、コミットしていない修正は失われます)。
-
スケジュール実行
この機能を使用するためには以下のコマンドでテンプレートをコピーした後、
(コマンド等はApache Zeppelin使用環境に応じて適切に変更してください)cp ./conf/zeppelin-site.xml.template ./conf/zeppelin-site.xml
この
zeppelin-site.xml
にて
zeppelin.notebook.cron.enable
プロパティのコメントアウトを外した後で
値をtrue
した後にApache Zeppelinを再起動をすることが必要となります。<property> <name>zeppelin.notebook.git.remote.origin</name> <value>origin</value> <description>Git repository remote</description> </property> --> <property> <name>zeppelin.notebook.cron.enable</name> <value>true</value> <description>Notebook enable cron scheduler feature</description> </property> <!-- <property> <name>zeppelin.notebook.cron.folders</name> <value></value> <description>Notebook cron folders</description> </property> -->
上記手順を踏むと各ノートに下記画面のような時計のアイコンが表示され、
このアイコンをクリックすることでノートに属する全パラグラフに対して
実行スケジュールを設定できるようになります(パラグラフ単位の
実行スケジュールは設定できません)。
実行スケジュールの設定は
1m
などのリンクをクリックするか、
手動でcron形式の文字列をテキストボックスに入力することでできます。
つづき
次回はインストール・起動・停止編です。