PythonとJayDeBeApiを使ってJDBC経由でGridDBとインターフェースをとる方法

はじめに

このブログでは、GridDB の Java Database Connectivity (JDBC) 接続機能を、人気の高い JDBC Python モジュールと一緒に紹介します。この例では、JayDeBeApiというモジュールを使用することで、開発者はPythonのコードベースをJDBCに接続することができます。これにより、開発者が使用するデータベース API とのインターフェースを行う際に、Java を使用しなければならないという制限がなくなります。

下にスキップして先にDockerのインストール手順を確認する場合はこちら

前提条件

$ pip3 install griddb-python --user

GridDBクラスタが起動していることを確認したら、次にGridDB JDBCドライバのダウンロードを行います。ダウンロード方法は こちらのブログを参照してください。

以下に、簡単にまとめました。

$ wget https://repo1.maven.org/maven2/com/github/griddb/gridstore-jdbc/4.5.0/gridstore-jdbc-4.5.0.jar

JayDeBeApi のインストール

ここから本題に入ります。JayDeBeApiをインストールするには、JPype1と一緒にパッケージ自体をインストールする必要があります。

$ pip3 install JayDeBeApi --user
$ pip3 install JPype1==0.6.3 --user

過去のブログで紹介したJDBCのインストラクション通りに設定をしている場合、CLASSPATHはすでにJDBCドライバを指しているはずです。

$ export CLASSPATH=${CLASSPATH}:/user/share/java/gridstore-jdbc-4.5.0.jar

次はサンプルを実行して正しく接続されているかどうかを確認します。そこで、GridDB JDBC リポジトリに含まれるサンプルを実行してみましょう。

注意点として、以下のコードを見てください。gridstore-jdbc.jarファイルへのパスがあるので、/usr/share/javaディレクトリを指すようにパスを変更する必要があります。


import jaydebeapi
import sys

argv = sys.argv

multicast_address = argv[1] # default : 239.0.0.1
port_no = argv[2] # default : 41999
cluster_name = argv[3]
username = argv[4]
password = argv[5]

url = "jdbc:gs://" + multicast_address + ":" + port_no + "/" + cluster_name
conn = jaydebeapi.connect("com.toshiba.mwcloud.gs.sql.Driver",
    url, [username, password], "./gridstore-jdbc.jar")

curs = conn.cursor()

curs.execute("DROP TABLE IF EXISTS Sample")
curs.execute("CREATE TABLE IF NOT EXISTS Sample ( id integer PRIMARY KEY, value string )")
print('SQL Create Table name=Sample')
curs.execute("INSERT INTO Sample values (0, 'test0'),(1, 'test1'),(2, 'test2'),(3, 'test3'),(4, 'test4')")
print('SQL Insert')
curs.execute("SELECT * from Sample where ID > 2")
print(curs.fetchall())

curs.close()
conn.close()
print('success!')
$ cp jdbc/sample/en/python-db-api/DBAPISelect.py .

このサンプルコードは、PythonのコードをJDBCで実行できるかどうかを確認することを目的としています。ここでは、PythonのコードはSampleと呼ばれるコンテナを作成し、いくつかのデータを挿入します。

さて、実際にサンプルを実行してみましょう。python DBAPISelect.py

$ python3 DBAPISelect.py 239.0.0.1 41999 defaultCluster admin admin
SQL Create Table name=Sample
SQL Insert
[(3, 'test3'), (4, 'test4')]
success!

これで、PythonでJDBC/GridDBをインターフェースすることができるようになりました。

Jupyter Notebook の使用

一度jdbcを立ち上げて実行したら、Jupyter Notebookをインストールして、全体のエクスペリエンスをより良くすることができます。

$ pip3 install jupyterlab --user

Jupyterを開きます。

$ jupyter notebook

これで完了です。

Docker

他の方法として、 Docker を使ってJDBCとJayDeBeApiを実行することもできます。こちらのブログに、GridDBサーバとPythonクライアントの両方のコンテナが含まれています(ソースファイルはブログの一番下にあります)。上記のブログに沿って進める場合は、Dockerfileを更新して、最新のGridDB サーバーをダウンロードしてください。

RUN rpm -Uvh https://github.com/griddb/griddb/releases/download/v4.5.0/griddb-4.5.0-1.linux.x86_64.rpm
 RUN yum -y install iproute

システムの通知アドレスを更新するために、start_griddb.sh スクリプトを変更してください (10080 –> 10040)。

cat << EOF > /var/lib/gridstore/conf/gs_cluster.json
 {
        "dataStore":{
                "partitionNum":128,
                "storeBlockSize":"64KB"
        },
        "cluster":{
                "clusterName":"defaultCluster",
                "replicationNum":2,
                "notificationInterval":"5s",
                "heartbeatInterval":"5s",
                "loadbalanceCheckInterval":"180s",
                "notificationMember": [
                        {
                                "cluster": {"address":"$IP", "port":10010},
                                "sync": {"address":"$IP", "port":10020},
                                "system": {"address":"$IP", "port":10040}, #change here
                                "transaction": {"address":"$IP", "port":10001},
                                "sql": {"address":"$IP", "port":20001}
                       }
                ]
        },
        "sync":{
                "timeoutInterval":"30s"
        }
 }
 EOF

GridDBサーバのDockerコンテナが起動している場合、以下のコマンドでIPアドレスを取得することができます。

$ docker inspect griddb-server | grep "IPAddress"

あるいは

$ CONT=`docker ps | grep griddb-server | awk '{ print $1 }'`; docker exec $CONT cat /etc/hosts | grep $CONT | awk '{ print $1 }'

Jupyter (Docker)

Dockerコンテナを経由してJupyterをインストールする方法を紹介します。

$ docker run --name jupyternotebook --network griddb-net -p 8888:8888 jupyter/scipy-notebook

その後、URL(https://127.0.0.1:8888/?token=xxxx)をコピーしてブラウザに貼り付けると、jupyter notebookが起動します。

新たに作成したDockerコンテナにログインします。

$ docker exec -u 0 -it jupyternotebook /bin/bash 

以下のコマンドを実行して新たな依存関係を解決します。

$ apt update
$ apt install default-jre
$ wget https://repo1.maven.org/maven2/com/github/griddb/gridstore-jdbc/4.5.0/gridstore-jdbc-4.5.0.jar
$ cp gridstore-jdbc-4.5.0.jar /usr/share/java/
$ pip install jaydebeapi

あとはブラウザのJupyterを使って、残りの手順を終わらせれば完了です。まず、必要なライブラリをインポートします。

import pandas as pd
 import jaydebeapi

GridDBコンテナに接続します。

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

時系列テーブル、コンテナを作成し、JDBC経由でクエリを実行します。

curs = conn.cursor()
 curs.execute('CREATE TABLE Sensor1(datetime TIMESTAMP PRIMARY KEY, payload FLOAT)
 curs.execute("INSERT into Sensor1 values (now(), 45.6)")
 curs.execute("SELECT * FROM Sensor1")
 curs.fetchall()
 curs.close()
 conn.close()

Pandasライブラリを使うこともできます。

sql = ("SELECT * FROM Sensor1";)
 sql_query = pd_read_sql_query(sql, conn)
 sql_query

結論

このように、時系列データベースとの連携するために、GridDBサーバーにJupyterと JayDeBeApi をインストールして使用する2つの方法を紹介しました。

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

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