はじめに
このブログでは、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