Skip to content

データローダ開発マニュアル(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