S-JIS[2023-10-08/2024-04-11] 変更履歴

Embulk Tsurugiへの出力

EmbulkTsurugi書き込みプラグインのメモ。


概要

RDBのTsurugiへデータを書き込むプラグインを作ってみた。
プラグイン名はembulk-output-tsurugidb。

このプラグインはEmbulk 0.10以降で、Java11以降に対応。(TsurugiのJava通信ライブラリーであるTsubakuroがJava11以降な為)

TsurugiはJDBCを提供していないので、embulk-output-postgresqlを元にしてTsubakuroを使うよう変更した。
基本的な使用方法はembulk-output-postgresqlと同じにしたつもりだが、対応していない機能もある。


このプラグインを使う為には、embulk-output-tsurugidbプラグインをインストールしておく必要がある。


インストール方法

Embulk 0.10以降ではgemを使わないインストール方法になったが、公式なインストール方法は発表されていない。
とりあえず以下のようにすればインストールできる。(最新バージョンはMavenセントラルリポジトリーで確認できる)

  1. プラグイン本体と依存ライブラリーをMavenローカルリポジトリーにインストールする。
    $ export m2_repo=〜
    $ mvn dependency:get -Dartifact=io.github.hishidama.embulk:embulk-output-tsurugidb:0.1.5
  2. Embulkのプロパティーファイル(Linuxの場合は$HOME/.embulk/embulk.properties、Windowsの場合は%USERPROFILE%\.embulk\embulk.properties)に設定を追加する。
    plugins.output.tsurugidb=maven:io.github.hishidama.embulk:tsurugidb:0.1.5
対応バージョン
プラグイン Tsubakuro Tsurugiサーバー Embulk 更新日
0.1.0〜0.1.1 1.0.1 1.0.0-BETA1 v0.11.1付近 2023-10-09
0.1.2〜0.1.3 1.1.0 1.0.0-BETA2 v0.11.2付近 2023-12-10
0.1.4 1.2.0 1.0.0-BETA3 2024-01-29
0.1.5 1.3.0 1.0.0-BETA4 v0.11.3付近 2024-04-11

insertする例

SQLのinsert文を使ってテーブルにデータを書き込む例。

config.yml:

in:
  type: file
  path_prefix: 〜/input/intput.csv
  parser:
    type: csv
    columns:
    - {name: foo, type: long}   # int
    - {name: bar, type: long}   # bigint
    - {name: zzz, type: string} # varchar

out:
  type: tsurugidb
  endpoint: tcp://localhost:12345
  table: test

endpointにTsurugiのエンドポイントを指定する。

tableでテーブル名を指定する。
inのcolumnsでは、テーブルのカラム名と同じ名前を指定する。(大文字小文字は区別されない)

ver0.1.0ではmodeは「mode: direct_insert」(対象テーブルに直接書き込む)のみなので、modeは省略可。


putする例

KVSのput命令を使ってテーブルにデータを書き込む例。

Tsurugiの内部ではKVS(Key Value Store)でデータを保持している。
SQLでアクセスするより、KVSとして直接アクセスする方が速いことが期待される。

config.yml:

in:
  type: file
  path_prefix: 〜/input/intput.csv
  parser:
    type: csv
    columns:
    - {name: foo, type: long}   # int
    - {name: bar, type: long}   # bigint
    - {name: zzz, type: string} # varchar

out:
  type: tsurugidb
  endpoint: tcp://localhost:12345
  table: test
  tx_type: OCC
  method: put

methodにputを指定すると、KVSのput命令を使ってデータを書き込む。
ver0.1.0では、KVSは「tx_type: OCC」でしか動作しない。


データ精査

ver0.1.3では、文字列データにヌル文字(文字コード0)が含まれているかどうかをチェックするようになった。[2023-12-10]
デフォルトでは、ヌル文字が含まれていると、該当レコードのinsert/putをスキップする。
validate_nul_charをfalseにすると、ヌル文字精査を行わない。

(何故こういう精査を行うかと言うと、Tsurugi 1.0.0-BETA2では、ヌル文字が含まれる文字列をinsertしようとすると、INVALID_RUNTIME_VALUE_EXCEPTIONが発生する為。
ちなみに、Tsurugi 1.0.0-BETA1では、ヌル文字が含まれる文字列をinsertすると、select時にERR_DATA_CORRUPTIONが発生する)


デバッグログ出力する例

ver0.1.2では、methodがinsert, insert_wait, put, put_waitの場合、SQL実行時にエラーが発生すると該当データをログ出力する。[2023-12-07]
ただしログレベルはDEBUGなので、デフォルトでは出力されない。Embulk実行時にデバッグログ出力を指定する必要がある。

$ java -jar embulk-0.11.1.jar run -l debug config.yml

config.ymlの設定

config.ymlにTsurugi特有のトランザクションオプションコミットオプションを指定できる。

Embulkの設定名 説明
endpoint Tsurugiのエンドポイント。必須。
tx_type トランザクション種別。OCC・LTXのいずれか。デフォルトはLTX。
tx_label トランザクションのラベル。デフォルトは「embulk-output-tsurugidb」。
tx_write_preserve LTXのみ有効。write preserve。書き込み対象テーブルは自動的にwrite preserveに追加される。
tx_inclusive_read_area LTXのみ有効。inclusive read area。書き込み対象テーブルは自動的にinclusive read areaに追加される。
tx_exclusive_read_area LTXのみ有効。exclusive read area
tx_priority LTXまたはRTXのみ有効。priority
commit_type コミットオプション。 デフォルトはdefault。
method 書き込み方法を指定する。設定値は後述。デフォルトはinsert。
method_option 書き込み方法のオプションを指定する。設定値は後述

その他の設定は、embulk-output-jdbcと同様(のはず)。

Embulkの設定名 説明
table 書き込むテーブル名。
mode ver0.1.0ではinsert_directのみ。
retry_limit  
retry_wait  
max_retry_wait  
batch_size  
default_timezone  
column_options type  
value_type Tsurugiのどのデータ型として書き込むか。
デフォルトはcoerce。(テーブル定義から自動判定する)
timestamp_format  
timezone  

他に、データの精査有無やエラー発生時の挙動を指定できる。[2023-12-10]

Embulkの設定名 ver 説明 更新日
validate_nul_char 0.1.3 文字列のヌル文字精査(ヌル文字が含まれているかどうかのチェック)をするかどうか。デフォルトはtrue(精査する)。 2023-12-10
log_level_on_invalid_record 0.1.3 精査エラー発生時に該当データをログ出力するが、その際のログレベル。デフォルトはDEBUG。 2023-12-10
stop_on_invalid_record 0.1.3 精査エラー発生時にエラー終了するかどうか。デフォルトはfalse(エラー終了させずに該当レコードをスキップする)。 2023-12-10
log_level_on_record_error 0.1.3 insert/put実行でエラーが発生した場合に該当レコードの内容をログ出力するが、その際のログレベル。デフォルトはDEBUG。 2023-12-10
stop_on_record_error 0.1.3 insert/put実行でエラーが発生した場合にエラー終了するかどうか。デフォルトはtrue(エラー終了する)。 2023-12-10

method

config.ymlのmethodで書き込み方法を指定する。

設定値 API 説明
insert SQL SQLのinsert系で実行する。複数のinsertを実行して、まとめて完了確認を行う。(デフォルト)
insert_wait SQL SQLのinsert系で実行する。1件insertする毎に完了確認を行う。とても遅い。
put KVS KVSのput命令で実行する。複数のputを実行して、まとめて完了確認を行う。
put_wait KVS KVSのput命令で実行する。1件putする毎に完了確認を行う。とても遅い。

methodの設定値の末尾にwaitが付いているものは、実装方法が単純。(insertやputで都度FutureResponseのawaitメソッドを呼ぶ方式)
実装は単純だったが、実行してみるととても遅かったorz
実用的ではないが、参考までに残してある。


method_option

config.ymlのmethod_optionで、methodのオプションを指定する。

設定値 API 説明 備考
insert SQL SQLのinsert文で実行する。(データが無ければinsert、有ればプライマリキーの一意制約違反が発生する)
methodがSQL系の場合のデフォルト。
 
insert_or_replace SQL SQLのinsert or replace文で実行する。(データが無ければinsert、有ればupdateする)  
insert_if_not_exists SQL SQLのinsert if not exists文で実行する。(データが無ければinsert、有れば何もしない) ver0.1.1 [2023-10-09]
put_overwrite KVS 上書きモードでputする。(データが無ければ追加、有れば更新する)
methodがKVS系の場合のデフォルト。
PutType.OVERWRITE
insert_or_replaceと同等。
put_if_absent KVS データが無いときだけ追加する。(データが有ったら何もしない) PutType.IF_ABSENT
insert_if_not_existsと同等。
pub_if_present KVS データが有るときだけ更新する。(データが無かったら何もしない) PutType.IF_PRESENT

out:
  type: tsurugidb
  〜
  method: put
  method_option: put_overwrite

変更履歴

Tsurugi(Tsubakuro)のバージョンアップに伴うものは省略。


Embulk目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま