Apache ZeppelinコンテナとPythonでデータを可視化してみた

2021.06.17

データアナリティクス事業本部の鈴木です。今回は、Apache Zeppelin(以下、Zeppelin)という、ウェブアプリケーションベースのノートブックを紹介します。

本記事の目的

AWSの開発環境において、Zeppelinは以下のような場面で利用されています。

  • インタラクティブな Glue scripts(pyspark)の開発環境
  • Amazon Kinesis Data Analytics Studio

私はJupyter Notebookに馴染みがあるものの、Zeppelinは使ったことがありませんでした。上記のような機能を使うために、まずは自分のPCでZeppelinを練習できないかと思い、試してみました。

今回は、Zeppelinの機能をフル活用するより、まずはPythonで一般的な操作を行い、UIの操作感に慣れることを目指しました。

具体的には、Zeppelinコンテナを自分のPCで立て、サンプルデータを渡して、Pythonで可視化しました。

私と同じような方もいらっしゃると思うので、検証内容を共有します。

Apache Zeppelinとは

ブラウザ上でプログラムをインタラクティブに記述・実行できるノートブックの一つです。バックエンドにはPython、SQL、Scalaなどなど、20言語以上も対応しています。

公式ドキュメントは以下です。

Apache Zeppelin

検証環境

  • macOS Catalina version 10.15.7
  • docker desktop Version 3.4.0

やってみる

docker-compose.ymlの作成

Zeppelinコンテナを作成します。apacheが公開しているDockerイメージがあるので、それを利用しました。検証時点で最新のバージョン0.9.0を使い、docker-compose.ymlを以下のように作成しました。

このイメージはサイズが大きめなのでご注意ください。Docker Hubに記載されたCOMPRESSED SIZEが2.2GB、ローカルでdocker image lsで確認したSIZEが4.11GBでした。

docker-compose.yml

version: "3"
services:
    zepplelin-notebook:
        image: apache/zeppelin:0.9.0
        volumes: 
            - ./logs:/logs
            - ./notebook:/notebook
            - ./work:/work
        environment:
            - ZEPPELIN_LOG_DIR='/logs'
            - ZZEPPELIN_NOTEBOOK_DIR='/notebook'
        ports:
            - 8080:8080
        container_name: zeppelin-notebook-container

ノートブックやログ用の設定については、Apache Zeppelin Releases Docker Imagesを参考にしました。

また、ローカルとデータの連携ができるよう、workというディレクトリを作り、コンテナにマウントしました。jupyterのdatascience-notebookの公式ドキュメントに、データ連携用のディレクトリをコンテナの~/workにマウントする例が紹介されており、それを参考にしました。

検証データの作成

scikit-learnのIris DatasetをCSVで出力し、workディレクトリに配置しました。scikit-learnのバージョンは0.24.2です。アイリスデータセットは言わずと知れた有名なデータセットで、3種のアヤメの情報が合計150サンプル分入っています。

CSVの作成に使ったコードは以下です。

import pandas as pd
from sklearn import datasets

# irisデータをsklearnから読み出す。
iris = datasets.load_iris()

# pandasのデータフレームに変換する。
# カラム名にスペースが入っていたので、扱いやすい名前に変えた。
feature_names = ["sepal_length", "sepal_width", "petal_length", "petal_width"]
df_iris = pd.DataFrame(iris["data"], columns=feature_names)
df_iris['species'] = iris.target_names[iris["target"]]

# 検証データのCSVエクスポート
df_iris.to_csv("./iris.csv", index=False)

コンテナの起動とブラウザからの接続

作成したdocker-compose.ymlがあるディレクトリに移動し、docker-composeで起動します。

docker-compose up

ブラウザを起動し、localhost:8080にアクセスします。以下の画面が表示されれば起動完了です。 zeppelinトップ画面

検証データの可視化

サンプルデータで可視化を進めます。

まず、「Create new note」ボタンからノートブックを新規作成しました。 zeppelin_create_notebook

ノートの名前と、デフォルトのインタプリタを設定します。 create_new_note_setting

ノートが作成できました。 ノートの作成完了

画面トップのバーの「Run all paragraphs」ボタンを押すと全パラグラフを実行できます。パラグラフ個別には、各パラグラフの「▷」マークを押すか、Shift + Enterで実行できます。 セルの実行

セルとセルの間にカーソルを合わせると「+ Add Paragraph」が表示されるので、クリックするとパラグラフが追加されます。 パラグラフの追加

パラグラフにコードを書き、ライブラリとデータを読み込んでみます。

パラグラフの最初の行に「%python.ipython」と書くことで、%python.ipythonインタプリタを使うことを指定しています。%pythonインタプリタもありますが、バージョン0.9.0のドキュメントによると、より強力な%python.ipythonインタプリタを推奨しているようです。

例えば、以下のようにコードを入力し、実行します。

ライブラリ・データの読み込み

データが読み込めていることが分かりました。

matplotlibで散布図を描いてみます。 matplotlibでの散布図の例

冒頭で"%matplotlib inline"を指定しているので、パラグラフのアウトプットに図が表示されました。

seabornでも散布図を描いてみます。 seabornでの作図の例

こちらも期待通り作図ができました。

感想

Zeppelinコンテナに入っているPythonインタプリタとライブラリを使って、サンプルデータを可視化することができました。この調子で、Pythonを使った操作が行えそうです。

今回は紹介できていませんが、Zeppelinの特徴の1つに、SQLは自動的に表やグラフの形式で出力し、それをインタラクティブに操作できる点があります。

AWSの開発環境としての用途であれば、どちらかというと、それらの機能の利用が多いと思うので、チャレンジしていきたいです。

また、環境コンテナはサンプルのノートブックも含まれていました。チュートリアルのノートブックにはPythonやRのほか、FlinkやSparkのノートもあります。 私の場合は、Sparkを最初に勉強するときに、どのコンテンツから手をつければ良いか分からず困ったので、学習コンテンツと実行環境が一緒に手に入るZeppelinコンテナはとても良いなと思いました。

参考