|
|
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セントラルリポジトリーで確認できる)
Embulk 0.10〜0.11.2の場合 $ export m2_repo=〜 $ mvn dependency:get -Dartifact=io.github.hishidama.embulk:embulk-output-tsurugidb:1.3.0 Embulk 0.11.3以降の場合 [2023-06-02] $ java -jar embulk-0.11.3.jar install io.github.hishidama.embulk:embulk-output-tsurugidb:1.3.0
プラグイン | 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 |
0.1.6 | 1.4.0 | 1.0.0-BETA5 | v0.11.4付近 | 2024-07-11 |
0.1.7 | 1.5.0 | 1.0.0-BETA6 | 2024-08-16 | |
1.0.0 | 1.6.0 | 1.0.0 | 2024-08-31 | |
1.0.1〜1.0.2 | v0.11.5付近 | 2024-10-02 | ||
1.1.0 | 1.7.0 | 1.1.0〜1.2.0 | 2024-11-13 | |
1.3.0 | 1.8.0 | 1.3.0 | 2025-03-17 |
outのtypeにtsurugidbを指定する。
〜 out: type: tsurugidb endpoint: tcp://localhost:12345 〜
この場合は、Embulkのプロパティーファイル(Linuxの場合は$HOME/.embulk/embulk.properties
、Windowsの場合は%USERPROFILE%\.embulk\embulk.properties
)に設定を追加する必要がある。
plugins.output.tsurugidb=maven:io.github.hishidama.embulk:tsurugidb:0.1.7
outのtypeに「source: maven」を指定する。[2024-07-11]
〜 out: type: source: maven group: io.github.hishidama.embulk name: tsurugidb version: 0.1.7 endpoint: tcp://localhost:12345 〜
SQLのinsert文を使ってテーブルにデータを書き込む例。
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は省略可。
KVSのput命令を使ってテーブルにデータを書き込む例。
Tsurugiの内部ではKVS(Key Value Store)でデータを保持している。
SQLでアクセスするより、KVSとして直接アクセスする方が速いことが期待される。
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にTsurugi特有のトランザクションオプションやコミットオプションを指定できる。
Embulkの設定名 | 説明 |
---|---|
endpoint | Tsurugiのエンドポイント。必須。 |
connection_label | コネクション(セッション)のラベル。デフォルトはembulk-input-tsurugidb。ver0.1.6以降[2024-07-11] |
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 |
config.ymlのmethodで書き込み方法を指定する。
設定値 | ver | API | 説明 | 更新日 |
---|---|---|---|---|
insert | SQL | SQLのinsert系で実行する。複数のinsertを実行して、まとめて完了確認を行う。(デフォルト) | ||
insert_wait | SQL | SQLのinsert系で実行する。1件insertする毎に完了確認を行う。とても遅い。 | ||
insert_multi_values | 1.0.1 | SQL | SQLのinsert系で実行する。 複数のvaluesを指定したinsertを実行する。 | 2024-10-02 |
put | KVS | KVSのput命令で実行する。複数のputを実行して、まとめて完了確認を行う。 | ||
put_wait | KVS | KVSのput命令で実行する。1件putする毎に完了確認を行う。とても遅い。 |
methodの設定値の末尾にwaitが付いているものは、実装方法が単純。(insertやputで都度FutureResponseのawaitメソッドを呼ぶ方式)
実装は単純だったが、実行してみるととても遅かったorz
実用的ではないが、参考までに残してある。
config.ymlのmethod_optionで、methodのオプションを指定する。
設定値 | ver | API | 説明 | 備考 |
---|---|---|---|---|
insert | SQL | SQLのinsert文で実行する。(データが無ければinsert、有ればプライマリキーの一意制約違反が発生する) methodがSQL系の場合のデフォルト。 |
||
insert_or_replace | SQL | SQLのinsert or replace文で実行する。(データが無ければinsert、有ればupdateする) | ||
insert_if_not_exists | 0.1.1 | SQL | SQLのinsert if not exists文で実行する。(データが無ければinsert、有れば何もしない) | [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)のバージョンアップに伴うものは省略。