Apache ZeppelinコンテナとPythonでデータを可視化してみた
データアナリティクス事業本部の鈴木です。今回は、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言語以上も対応しています。
公式ドキュメントは以下です。
検証環境
- 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でした。
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にアクセスします。以下の画面が表示されれば起動完了です。
検証データの可視化
サンプルデータで可視化を進めます。
まず、「Create new note」ボタンからノートブックを新規作成しました。
ノートの名前と、デフォルトのインタプリタを設定します。
ノートが作成できました。
画面トップのバーの「Run all paragraphs」ボタンを押すと全パラグラフを実行できます。パラグラフ個別には、各パラグラフの「▷」マークを押すか、Shift + Enterで実行できます。
セルとセルの間にカーソルを合わせると「+ Add Paragraph」が表示されるので、クリックするとパラグラフが追加されます。
パラグラフにコードを書き、ライブラリとデータを読み込んでみます。
パラグラフの最初の行に「%python.ipython」と書くことで、%python.ipythonインタプリタを使うことを指定しています。%pythonインタプリタもありますが、バージョン0.9.0のドキュメントによると、より強力な%python.ipythonインタプリタを推奨しているようです。
例えば、以下のようにコードを入力し、実行します。
データが読み込めていることが分かりました。
matplotlibで散布図を描いてみます。
冒頭で"%matplotlib inline"を指定しているので、パラグラフのアウトプットに図が表示されました。
seabornでも散布図を描いてみます。
こちらも期待通り作図ができました。
感想
Zeppelinコンテナに入っているPythonインタプリタとライブラリを使って、サンプルデータを可視化することができました。この調子で、Pythonを使った操作が行えそうです。
今回は紹介できていませんが、Zeppelinの特徴の1つに、SQLは自動的に表やグラフの形式で出力し、それをインタラクティブに操作できる点があります。
AWSの開発環境としての用途であれば、どちらかというと、それらの機能の利用が多いと思うので、チャレンジしていきたいです。
また、環境コンテナはサンプルのノートブックも含まれていました。チュートリアルのノートブックにはPythonやRのほか、FlinkやSparkのノートもあります。 私の場合は、Sparkを最初に勉強するときに、どのコンテンツから手をつければ良いか分からず困ったので、学習コンテンツと実行環境が一緒に手に入るZeppelinコンテナはとても良いなと思いました。