GridDB、Docker Container、そしてZeppelin:3つのツールの連携について

はじめに

Zeppelinは、オープンソースのデータサイエンス・データビジュアライゼーションツールです。以前の記事で何度か使用したJupyter Notebookと多くの共通点があります。Zeppelinは、データサイエンスのためのすべてのPythonパッケージで動作します。

私たちはまだJupyterの力に確信を持っていますが、人目を引くビジュアルレポートを作成する必要がある人には、Zeppelinの方が優れたインターフェースを提供していることを認めざるを得ません。Jupyterでは、コードブロック、その出力、フリーテキストのメモなど、それぞれのメモが互いに上に配置されています。これでは、必要なエントリを見つけるまで、ノートブックを延々とスクロールしなければならないこともあります。Zeppelinでは、これらを隣り合わせに配置して、レポートやエンドユーザーのモニタリングに特に役立つダッシュボードを作成することができます。

さらに、Zeppelinでは、チャートをコーディングする必要はなく、グラフィカル・ユーザー・インターフェースを使用して作成することができます。

ユースケース

ここではIoTデバイスからのデータを使用します。これらのデバイスは、タイムスタンプ、アラートなどのイベント、およびいくつかの測定値を含むデータを定期的に送信します。

目的

このチュートリアルの目的は、GridDB ユーザーにとっての Zeppelin の利点を紹介することです。

前提条件

このチュートリアルを実行するには、過去のブログ記事に記載されている手順を実行する必要があります(簡単な手順ですのでご安心ください)。このチュートリアルでは、DockerコンテナでGridDBを実行する方法を説明しています。また、Dockerのインストール方法も紹介しています。

Zeppelinを始めよう

Zeppelin のダウンロードとインストール

お使いのマシンで、Windows の場合は shell、Mac の場合は Terminal などのコマンドラインツールを開きます。

以下のコマンドを入力します。

git clone https://github.com/roenschg/griddb-zeppelin-quikstart.git

マシン上にターゲットフォルダが作成され、その中にGitHubリポジトリからZeppelinのダウンロードが開始されます。

コマンドラインツールで進行状況を確認してください。ダウンロードが完了したら、ZeppelinをDockerコンテナにラッピングする作業に進みます。Docker Desktopが起動していることを確認します。

お気に入りのコマンドラインツールで、ターゲットフォルダに行くように指示するコマンドを入力します(念のため、デフォルトですでにそこにいない場合もありますが、これは起こりえます)。

cd griddb-zeppelin-quikstart/

次に、これらのコマンドを使用してコンテナを構築します。2つ目のコマンドは、1つ目のコマンドの実行が正常に終了した場合にのみ入力してください。

docker-compose build docker-compose up

この段階で、準備は完了です。コンテナが構築され、実行されている。以下のURLをブラウザで開くことで、解析を開始することができます。http://localhost:8080

例のノートに着地します。Zeppelinでは、ノートはJupyterのノートブックと同じです。ノートにはパラグラフが含まれていますが、これはJupyterのセルと同じです。Jupyterをご存じない方のために、別の説明をします。ノートは、データ、コードチャンク、そしてデータチャートを含む結果を含むファイルです。パラグラフは、上記のいずれかを含むビジュアル要素です。

ノートに名前をつけて、以下の説明に進みます。

GridDB への接続

PythonのJayDeBeApiコネクタを使用して、GridDBデータベースに接続することができます。


import jaydebeapi

conn = jaydebeapi.connect("com.toshiba.mwcloud.gs.sql.Driver",
                           "jdbc:gs://griddb:20001/defaultCluster/public?notificationMember:127.0.0.1:20001",
                           ["admin", "admin"],
                          "/usr/share/java/gridstore-jdbc-4.5.0.jar",)
  

ノートの最初の段落に挿入し、Runを押すか、Shift+Enterを使用します。

ダッシュボードの構築

データ分析と可視化に進み、他の段落の作成から始める前に、整理の仕方を学びましょう。

このビジュアル要素の上端または下端にカーソルを合わせると、+段落追加が表示されます。クリックすると、さらに段落が追加されます。

段落の右上にカーソルを合わせると、歯車のアイコンが表示されます。これをクリックします。フォーマットやコードを実行するためのオプションがいくつか表示されます。は、ノートをダッシュボードのように見せるためのパラメータです。幅の最大値は12です(どんな尺度であっても関係ありません)。ですから、あなたのスクリーンの幅に応じて、最大幅をある程度小さくすることができます。例えば、6にしてみましょう。そうすると、段落は半分に縮小され、左側に移動して右側に空きスペースができます。

この段落の上下にある段落にも同じことをします。このように調整すると、段落の1つが、12より小さいもう1つの段落の隣の空きスペースに飛び込んできます。このようにして、段落を一列に並べることができます。幅のパラメータを適宜小さくすると、3つまたは4つの段落を同じ列に入れることができます。本来の分析の途中で後戻りしないように、2列、3列と作っていきましょう。

データ分析

Zeppelin にデータを取り込む

さて、最初のダッシュボードを作成しましょう。ここでは、pandas の関数を使った SQL クエリで GridDB テーブルにアクセスし、データフレームに直接データを入力します。


sql = ("SELECT * FROM iotdata WHERE TIMESTAMP(timestamp) < TIMESTAMP_ADD(DAY, NOW(), -5)")
iotdf = pd.read_sql_query(sql, conn)
  

次のコマンドを使って、データフレームの最初の行を表示します。

z.show(iotdf)

このように表示されます。

初めてのチャート作成

Jupyterとは異なり、Zeppelinでチャートを作成するのにPythonコードを書く必要はありません。お気づきかもしれませんが、z.show()では、テーブルビューと異なるチャートタイプを切り替えることができる最初のビジュアライゼーションを作成しました。

設定をクリックすると、コードなしでデータを集計できるビューが表示されます。数値以外の次元(ここではイベントイベントの数)を持つ列をグループスペースにドラッグ&ドロップすることでデータを集計できます。

これにより、データの中からパターンを探し出し、それが期待通りのものであるかどうかをチェックすることができます(この例では、繰り返されるパターン)。

実際、GUI機能では必要な集計ができない場合、Pythonコードを使ってデータをグループ化し、視覚化することができます。このコードでは、データフレームをごとに集計し、イベント数をカウントして、データをプロットします。


dayevents = iotdf.groupby(by = ['date']).count()
dayevents = dayevents.reset_index()
dayevents = dayevents.drop(columns = ['event', 'simid', 'randNumCol'])

import matplotlib.pyplot as plt
a = dayevents.date
b = dayevents.timestamp
plt.plot(a, b, 'ro')
plt.xticks(rotation=90)
z.show(plt)
  

他の関数(sum、meanなど)を使って集計をカスタマイズできます。そうしないと、グループ化された列が行インデックスとして表示され、プロットに使用できなくなります。

後日談

今日の分析が終わったら、コマンドラインツールで以下のコマンドを使って、実行中のDockerコンテナを閉じることを忘れないでください。

docker-compose stop

再開する場合は、次のようにします。

cd griddb-zeppelin-quikstart/ docker-compose up -d

結論

ローコードとヘビーコードのどちらのデータ可視化ツールを好むかに関わらず、Zeppelinを使えば両方を手に入れることができます。

Leave a Reply

Your email address will not be published. Required fields are marked *