LoginSignup
10
12

More than 3 years have passed since last update.

だいたいゼロから始めるApache Zeppelin(機能紹介編)

Last updated at Posted at 2019-12-27

シリーズのリンク

  1. 機能紹介編
  2. インストール・起動・停止編
  3. 設定編
  4. Sparkインタープリタ編
  5. その他インタープリタ編(予定)

要約

  • 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 EMRCloud Dataprocといったある程度マネージするものはあります)。
Apache Zeppelinを活用する人が増えたら
フルマネージドのサービスが提供されるかも?
みたいな淡い期待を持ってこのシリーズを初めてみました。
このシリーズを読んでいただいてApache Zeppelinについて
少しでも興味を持っていただけたら幸いです。

Apache Zeppelinとは

Sparkから取得したデータを表やグラフとして表示することを主用途としつつ、
RedshiftやBigQueryなどの他データソースからのデータも同様に表示したり、
Scala、Python、R、Shellコマンドを実行できたりなどと いろいろできる
Scalaで実装された高機能なノートブック
です。
なおライセンスはApache License 2.0です。

ノートブックとは

Apache Zeppelinはノートブックなのですが、
ノートブックとは何かというと以下のものになります。

文芸的プログラムを記述する環境となる仮想的なノート

参照

では文芸的プログラムとは何かというと
簡単に言えば以下のものになります。

ブラウザ等でプログラムコードとコメントを
入力してそれらを別々に処理した結果を出力するもの

参照

このためノートブックのユーザにプログラムコードの出力結果が何かを
コメントによってわかりやすく説明することができます。
プログラムコードとコメントは主にエンジニアが書くものとなりますが
どんなに複雑なプログラムコードであっても付随するコメントにより
非エンジニアがその出力結果を比較的容易に理解・利用できる
ことが
ノートブックを使用する利点だと個人的に考えております。

Apache Zeppelinの機能(一部抜粋)

  1. インタープリタ

    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

    またインタープリタを自作する機能もあります。

  2. セキュリティ

    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)を
    設定できます。
    各種アクセス権限認可の例

    例えばあるパラグラフに対してそれに書き込む権限がないユーザが
    書き込もうとすると下記の画面のようなエラーダイアログが表示されます。
    権限エラーの例

  3. リッチなUI

    Apache Zeppelinでは実行単位である パラグラフ というものを
    ノート というものでグルーピングした状態で管理しております。
    さらに パラグラフ ではコードを記述する コードセクション
    それコードの実行結果を表示する リザルトセクション
    2つに区分けされます。
    このパラグラフは高さの自由な調節と幅の段階的な調節ができます
    (ノート内での位置はパラグラフ間の表示順序を変えられるだけです)。
    以下は機能例です(これはApache Zeppelinのチュートリアルにあったのを
    見やすくするために簡易化したものです)。
    上部にあるパラグラフに対して下部のパラグラフの幅を半分にしてます。
    ノートのUIの例

  4. Dynamic Form

    インタープリタが JDBCSpark SQL のようにSQLを用いるもの、
    MarkdownShellコマンド のように文字列を用いるものには
    コードセクションに${フォーム名}というような記述をして実行すると
    同じパラグラフのリザルトセクションにフォームが出力され、
    コードセクション内のその記述がフォームへの入力値で置き換えられます。
    またインタープリタが 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の実装例です。
    Dynamic Formの実装例

  5. 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つのパラグラフにも反映されます。
    AngularJSの例

  6. バージョン管理

    パラグラフを追加またはパラグラフのコードセクションを変更後に
    下記画面のようにメモのアイコンをクリックすることでその修正を
    組み込みのgitのリポジトリにコミットできます。
    コミットの例

    以前のコミット時の状態を表示(修正・実行はできません)する場合は
    下記画面のようにコミットメッセージの右隣のアイコンをクリックすることで
    選択したコミット時の状態の表示できます。
    コミット時の状態表示の例

    上記で別のコミットを選択した状態で下記画面のように
    右矢印のアイコンをクリックすることで選択したコミット時の状態に
    リセットするかのダイアログが表示され、
    OKボタンをクリックするとリセットできます(リセット前のコミットは
    失われませんが、コミットしていない修正は失われます)。
    リセットの例

    また下記画面のように左右を示している矢印のアイコンをクリックすることで
    コミット間の差分の表示もできます。
    コミット間差分表示の例

  7. スケジュール実行

    この機能を使用するためには以下のコマンドでテンプレートをコピーした後、
    (コマンド等は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形式の文字列をテキストボックスに入力することでできます。
    スケジュール設定後の例

つづき

次回はインストール・起動・停止編です。

10
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12