データローダ開発マニュアル(Python版)
注意事項
- 本マニュアルに記載したコマンドはCentOS8で確認しています。
動作環境
項目 | 値 |
---|---|
Python version | 3.x系 (2.x系では動作しない) |
追加Pythonライブラリ | psycopg2 (https://pypi.org/project/psycopg2/) |
configparser (https://github.com/python/cpython/blob/3.8/Lib/configparser.py) | |
geojson (https://pypi.org/project/geojson/) | |
requests (https://github.com/kennethreitz/requests/tarball/master) |
Python実行環境の整備
1. Python のインストール
[rt-loader@localhost ~]% sudo yum install python36
2. ライブラリの追加
[rt-loader@localhost ~]% sudo yum install python3-psycopg2
[rt-loader@localhost ~]% sudo pip3 install configparser
[rt-loader@localhost ~]% sudo pip3 install geojson
[rt-loader@localhost ~]% sudo pip3 install requests
データローダAPI(Pythonライブラリ)の入手
この手順書では sample_loader
データローダを作成することを想定しています。
1. データローダAPIファイル群を入手する
データローダAPIを配置する親ディレクトリ名がそのままデータローダ名になります。
[rt-loader@localhost ~]% mkdir sample_loader
[rt-loader@localhost ~]% cd sample_loader
[rt-loader@localhost sample_loader]% git -b release_v0.6 clone http://<git_host>/<group>/<project>.git
データローダAPI(Pythonライブラリ)の構成
sample_loader
|-- bin/
| `-- loader-start.sh <- データローダ起動スクリプト
|-- etc/
| |-- common.ini <- データローダ設定ファイル
| `-- logging.properties <- ログ設定ファイル
|-- loader-api/ <- データローダAPI
| |-- docs/ <- データローダAPIマニュアル
| | |-- md/
| | | |-- add_record.md
| | | |-- api_env.md
| | | |-- api_list.md
| | | |-- api_remarks.md
| | | |-- en/
| | | | |-- add_record.md
| | | | |-- api_env.md
| | | | |-- api_list.md
| | | | |-- api_remarks.md
| | | | |-- error_code.md
| | | | |-- history.md
| | | | |-- index.md
| | | | |-- init_record.md
| | | | |-- register_loader.md
| | | | `-- sample_loader.md
| | | |-- error_code.md
| | | |-- history.md
| | | |-- index.md
| | | |-- init_record.md
| | | |-- register_loader.md
| | | `-- sample_loader.md
| | `-- misc/
| | `-- mkdocs.yml
| |-- etc/
| | `-- loader_api.ini
| `-- src/
| |-- __init__.py
| |-- api_common.py
| |-- loader_api.py
| |-- loader_ctrl.py
| `-- postgresql.py
|-- sample_datasource/ <- sample_loaderで取得するデータを提供するHTTPサーバ
| |-- cgi-bin/
| | `-- datasource.py*
| |-- sample_server.py
| `-- sample_server.sh*
|-- src/
| `-- loader.py <- データローダ本体
`-- var/
`-- loader.log <- ログファイル
データローダの開発手順
1. データローダの設定を変更する
etc/common.ini
[HTTP]
url = http://127.0.0.1:8000/cgi-bin/datasource.py <- データ取得用URL
[WEB_API]
data_name=testloader_zs001 <- イベントテーブルに紐づくユニークネーム
options=override <- レコード追加時に一意キーに相当する属性(start_datetime,end_datetime,geometry)が既に登録されていた際の動作を指定
override:上書き更新
skip :該当行を登録しない
error :全ての行を登録しない
bin/loader-start.sh
#!/bin/bash
#
# proxy settings
#
#export HTTP_PROXY="<proxy_host>:<proxy_port>" <- プロキシ環境下の場合は設定する
#export HTTPS_PROXY="<proxy_host>:<proxy_port>" <- プロキシ環境下の場合は設定する
#
# don't change after this
#
BINDIR=$(cd $(dirname $0); pwd)
UPDIR=`/usr/bin/dirname ${BINDIR}`
export LOADER_NAME=`/usr/bin/basename ${UPDIR}`
export LOADER_HOME=$HOME/$LOADER_NAME
export LOADER_SRC=$LOADER_HOME/src
export LOADER_API=$LOADER_HOME/loader-api/src
export PYTHONPATH=$LOADER_API:$LOADER_SRC:$PYTHONPATH
export LOADER_PROGRAM=$LOADER_SRC/loader.py
export LOADER_INI=$LOADER_HOME/etc/common.ini
#trap 'echo ${PID};kill -SIGTERM ${PID}' SIGTERM
trap 'kill -SIGTERM ${PID}' SIGTERM
PROCESS_COUNT=`ps -aux | grep "$LOADER_PROGRAM" | grep -v grep | wc -l`
if [ ${PROCESS_COUNT} = 0 ]; then
python3 $LOADER_PROGRAM -i $LOADER_INI &
PID=$!
wait
else
echo "Already running $LOADER_NAME"
fi
2. 収集する元データの形式を確認する
sample_loader
の動作確認用にsample_datasource
を準備してあります。sample_datasource
は、時刻・位置情報・1つの数値を返却します。
(参考) sample_datasource
の実行方法とデータ形式の確認方法
1. sample_datasource
を実行する
[rt-loader@localhost ~]% cd sample_loader/sample_datasource
[rt-loader@localhost sample_datasource]% ./sample_server.sh
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...
2. sample_datasource
にアクセスする
[rt-loader@localhost ~]% curl http://127.0.0.1:8000/cgi-bin/datasource.py
2020-08-20 21:36:20+09 <- 時刻
35.000000, 135.000000 <- 位置情報
574 <- 1つの数値(整数)
3. 元データを分解して送信用データを作成する
def __data_collect(ini_info):
req = urllib.request.Request(url=ini_info['HTTP']['url'])
response = urllib.request.urlopen(req)
data = response.read().decode().splitlines()
record_list = []
one_record_dic = {}
one_record_dic['start_datetime'] = data[0]
one_record_dic['end_datetime'] = data[0]
one_record_dic['location'] = {}
one_record_dic['location']['type'] = "Point"
one_record_dic['location']['coordinates'] = list(map(float, data[1].split(',')))
one_record_dic['data'] = data[2]
record_list.append(one_record_dic)
return record_list
データローダを起動してデータを投稿する
[rt-loader@localhost ~/sample_loader]% ./bin/sample_loader_start.sh