質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
Embulk

Embulkは、CSVデータやアクセスログなどの構造化データを高い信頼性で転送することができる、プラグインベースのバルクデータローダーです。

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Q&A

解決済

1回答

2514閲覧

リジューム機能を使ったバルクインサート失敗

raccoondog

総合スコア79

Embulk

Embulkは、CSVデータやアクセスログなどの構造化データを高い信頼性で転送することができる、プラグインベースのバルクデータローダーです。

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

0グッド

0クリップ

投稿2018/11/27 02:14

編集2018/12/05 02:29

リジューム機能の検証を実施しています。

初回実行では、正常系でOracleDBのデータをBigqueryへバルクインサートしました。
2回目の実行では、異常系でバルクインサート中にネットワークを遮断させて敢えて失敗させます。
3回目にリジューム機能を使ったバルクインサートを実行すると失敗します。

embulk側の定義ファイルにオプション指定が不足しているのか? 原因調査中となります。

環境:Windows7、OracleDB 12c、embulk 0.9.8

※2018/12/05更新

※Oracleテーブル定義 ----------------- -------- --- ID NOT NULL NUMBER(8) NUM NUMBER(12,2 STR CHAR(8) VARSTR VARCHAR2(8) DT DATE TIME0 TIMESTAMP(0 TIME6 TIMESTAMP(6 TIME9 TIMESTAMP(9 ※config_bq.yml.liquid in: type: oracle path_prefix: null driver_path: C:\Users\yazaki\Desktop\embulkDB\product\12.2.0\dbhome_1\sqldeveloper\jdbc\lib\ojdbc7.jar host: A0430-02396 user: system password: yazaki database: ORCL table: INPUT_TEST incremental: true incremental_columns: [id] skip_header_lines: 0 allow_extra_columns: false allow_optional_columns: true columns: - {name: ID, type: string} - {name: NUM, type: string} - {name: STR, type: string} - {name: VARSTR, type: string} - {name: DT, type: string} - {name: TIME0, type: timestamp, format: '%Y/%m/%d'} - {name: TIME6, type: timestamp, format: '%Y/%m/%d'} - {name: TIME9, type: timestamp, format: '%Y/%m/%d'} out: {type: bigquery, auth_method: json_key, json_keyfile: 'C:\Users\yazaki\Desktop\embulk\My First Project-6041ffecfba7.json', project: fluid-emissary-216806, dataset: embulk_test, auto_create_table: true, table: users, read_timeout_sec: 360000, open_timeout_sec: 360000, send_timeout_sec: 360000, mode: append} ※実行コマンド embulk-0.9.8.bat run config_bq.yml.liquid -c diff.yml >> C:\Users\yazaki\Desktop\embulk\log\ORA_to_BQ_log003.txt ※実行後のエラー org.embulk.exec.PartialExecutionException: org.embulk.spi.DataException: Column type 'double' set at incremental_columns option is not supported at org.embulk.exec.BulkLoader$LoaderState.buildPartialExecuteException(BulkLoader.java:339) at org.embulk.exec.BulkLoader.doRun(BulkLoader.java:565) at org.embulk.exec.BulkLoader.access$000(BulkLoader.java:34) at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:352) at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:349) at org.embulk.spi.Exec.doWith(Exec.java:22) at org.embulk.exec.BulkLoader.run(BulkLoader.java:349) at org.embulk.EmbulkEmbed.run(EmbulkEmbed.java:161) at org.embulk.EmbulkRunner.runInternal(EmbulkRunner.java:292) at org.embulk.EmbulkRunner.run(EmbulkRunner.java:156) at org.embulk.cli.EmbulkRun.runSubcommand(EmbulkRun.java:436) at org.embulk.cli.EmbulkRun.run(EmbulkRun.java:91) at org.embulk.cli.Main.main(Main.java:26) Caused by: org.embulk.spi.DataException: Column type 'double' set at incremental_columns option is not supported at org.embulk.input.jdbc.getter.AbstractColumnGetter.encodeToJson(org/embulk/input/jdbc/getter/AbstractColumnGetter.java:92) at org.embulk.input.jdbc.AbstractJdbcInputPlugin$LastRecordStore.accept(org/embulk/input/jdbc/AbstractJdbcInputPlugin.java:441) at org.embulk.input.jdbc.AbstractJdbcInputPlugin.run(org/embulk/input/jdbc/AbstractJdbcInputPlugin.java:490) at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor.runInputTask(org/embulk/exec/LocalExecutorPlugin.java:271) at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor.access$000(org/embulk/exec/LocalExecutorPlugin.java:196) at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor$1.call(org/embulk/exec/LocalExecutorPlugin.java:235) at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor$1.call(org/embulk/exec/LocalExecutorPlugin.java:232) at java.util.concurrent.FutureTask.run(java/util/concurrent/FutureTask) at java.util.concurrent.ThreadPoolExecutor.runWorker(java/util/concurrent/ThreadPoolExecutor) at java.util.concurrent.ThreadPoolExecutor$Worker.run(java/util/concurrent/ThreadPoolExecutor$Worker) at java.lang.Thread.run(java/lang/Thread) Error: org.embulk.spi.DataException: Column type 'double' set at incremental_columns option is not supported

更新

※config_bq_incremental.yml in: type: oracle path_prefix: null driver_path: C:\Users\yazaki\Desktop\embulkDB\product\12.2.0\dbhome_1\sqldeveloper\jdbc\lib\ojdbc7.jar host: A0430-02396 user: system password: yazaki database: ORCL table: INPUT_TEST incremental: true incremental_columns: [id] column_options: ID: {type: string} NUM: {type: string} out: {type: bigquery, auth_method: json_key, json_keyfile: 'C:\Users\yazaki\Desktop\embulk\My First Project-6041ffecfba7.json', project: fluid-emissary-216806, dataset: embulk_test, auto_create_table: true, table: users, read_timeout_sec: 360000, open_timeout_sec: 360000, send_timeout_sec: 360000, mode: append} ※プレビュー C:\Users\yazaki\Desktop\embulk>embulk-0.9.8.bat preview config_bq_incremental.yml 2018-12-05 11:27:22.618 +0900: Embulk v0.9.8 2018-12-05 11:27:23.304 +0900 [WARN] (main): DEPRECATION: JRuby org.jruby.embed.ScriptingContainer is directly injected. 2018-12-05 11:27:25.457 +0900 [INFO] (main): Gem's home and path are set by default: "C:\Users\yazaki.embulk\lib\gems" 2018-12-05 11:27:26.190 +0900 [INFO] (main): Started Embulk v0.9.8 2018-12-05 11:27:26.268 +0900 [INFO] (0001:preview): Loaded plugin embulk-input-oracle (0.9.3) 2018-12-05 11:27:26.299 +0900 [INFO] (0001:preview): Connecting to jdbc:oracle:thin:@A0430-02396:1521:ORCL options {oracle.jdbc.ReadTimeout=1800000, user=system, password=***, oracle.net.CONNECT_TIMEOUT=300000} 2018-12-05 11:27:26.674 +0900 [INFO] (0001:preview): Using JDBC Driver 12.1.0.2.0 2018-12-05 11:27:26.783 +0900 [INFO] (0001:preview): Connecting to jdbc:oracle:thin:@A0430-02396:1521:ORCL options {oracle.jdbc.ReadTimeout=1800000, user=system, password=***, oracle.net.CONNECT_TIMEOUT=300000} 2018-12-05 11:27:26.845 +0900 [INFO] (0001:preview): SQL: SELECT * FROM "INPUT_TEST" ORDER BY "ID" 2018-12-05 11:27:26.861 +0900 [INFO] (0001:preview): > 0.02 seconds +-----------+------------+------------+---------------+-------------------------+-------------------------+-----------------------------+-----------------------------+ | ID:string | NUM:string | STR:string | VARSTR:string | DT:timestamp | TIME0:timestamp | TIME6:timestamp | TIME9:timestamp | +-----------+------------+------------+---------------+-------------------------+-------------------------+-----------------------------+-----------------------------+ | 179510 | 81596323 | OYYSHALN | PMTVRDKR | 2018-12-04 08:57:26 UTC | 2018-12-04 08:57:27 UTC | 2018-12-04 08:57:26.922 UTC | 2018-12-04 08:57:26.922 UTC | | 179511 | 45967077 | EDMHMKSA | HCQMWTDO | 2018-12-04 08:57:26 UTC | 2018-12-04 08:57:27 UTC | 2018-12-04 08:57:26.969 UTC | 2018-12-04 08:57:26.969 UTC | | 179512 | 45306398 | ZTGYAJZG | JGMEIMTI | 2018-12-04 08:57:26 UTC | 2018-12-04 08:57:27 UTC | 2018-12-04 08:57:26.969 UTC | 2018-12-04 08:57:26.969 UTC | ※実行コマンド C:\Users\yazaki\Desktop\embulk>embulk-0.9.8.bat run config_bq_incremental.yml -c diff.yml >> C:\Users\yazaki\Desktop\embulk\log\ORA_to_BQ_log004.txt ※実行後のエラー org.embulk.exec.PartialExecutionException: org.embulk.spi.DataException: Column type 'string' set at incremental_columns option is not supported at org.embulk.exec.BulkLoader$LoaderState.buildPartialExecuteException(BulkLoader.java:339) at org.embulk.exec.BulkLoader.doRun(BulkLoader.java:565) at org.embulk.exec.BulkLoader.access$000(BulkLoader.java:34) at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:352) at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:349) at org.embulk.spi.Exec.doWith(Exec.java:22) at org.embulk.exec.BulkLoader.run(BulkLoader.java:349) at org.embulk.EmbulkEmbed.run(EmbulkEmbed.java:161) at org.embulk.EmbulkRunner.runInternal(EmbulkRunner.java:292) at org.embulk.EmbulkRunner.run(EmbulkRunner.java:156) at org.embulk.cli.EmbulkRun.runSubcommand(EmbulkRun.java:436) at org.embulk.cli.EmbulkRun.run(EmbulkRun.java:91) at org.embulk.cli.Main.main(Main.java:26) Caused by: org.embulk.spi.DataException: Column type 'string' set at incremental_columns option is not supported at org.embulk.input.jdbc.getter.AbstractColumnGetter.encodeToJson(org/embulk/input/jdbc/getter/AbstractColumnGetter.java:92) at org.embulk.input.jdbc.AbstractJdbcInputPlugin$LastRecordStore.accept(org/embulk/input/jdbc/AbstractJdbcInputPlugin.java:441) at org.embulk.input.jdbc.AbstractJdbcInputPlugin.run(org/embulk/input/jdbc/AbstractJdbcInputPlugin.java:490) at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor.runInputTask(org/embulk/exec/LocalExecutorPlugin.java:271) at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor.access$000(org/embulk/exec/LocalExecutorPlugin.java:196) at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor$1.call(org/embulk/exec/LocalExecutorPlugin.java:235) at org.embulk.exec.LocalExecutorPlugin$ScatterExecutor$1.call(org/embulk/exec/LocalExecutorPlugin.java:232) at java.util.concurrent.FutureTask.run(java/util/concurrent/FutureTask) at java.util.concurrent.ThreadPoolExecutor.runWorker(java/util/concurrent/ThreadPoolExecutor) at java.util.concurrent.ThreadPoolExecutor$Worker.run(java/util/concurrent/ThreadPoolExecutor$Worker) at java.lang.Thread.run(java/lang/Thread) Error: org.embulk.spi.DataException: Column type 'string' set at incremental_columns option is not supported

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リジュームは動かないので使わないでください。

Make decisions on -r

投稿2018/11/28 11:54

hiroysato

総合スコア415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccoondog

2018/11/28 23:49

ご回答有難うございます。 -o のオプションを使用して差分インサートにするべきでしょうか。
hiroysato

2018/11/29 00:03

インクリメンタルロードをしたいということであれば `-c`オプションを使うと良いと思います。 `-o`は互換性のために残っていますが、`-c`の利用が推奨されています。 なお、インクリメンタルロードにdoubleのカラムは使えません。 ``` Error: org.embulk.spi.DataException: Column type 'double' set at incremental_columns option is not supported ``` 参考: [embulk-input-oracle](https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-oracle#incremental-loading)
raccoondog

2018/11/29 03:21

参考文献のご紹介有難うございます。 -cのオプションを使用して、差分情報だけをファイル出力して再実行時にインクリメンタルロード出来ること理解致しました。 これから検証いたします。
raccoondog

2018/11/29 05:46

検証で embulk run config.yml.liquid -c diff.yml を実行した後に敢えてネットワーク断させました。想定通りエラーで処理が止まったのですが diff.ymlファイルには何も出力されていませんでした 疑似障害を発生させるタイミング(データバルクインサート中ではなかった)の問題になるのでしょうか?
hiroysato

2018/11/29 09:31

レジュームは動きません。障害が発生した場合は最初からやり直しということです。 output-bigqueryでmodeでappendを使っていれば、データ挿入が途中で失敗しても対象テーブルにデータは挿入されず、やり直すだけで良いと思います。 -c diff.ymlは、日次でロードしている時に、最後にロードしたデータを記録するためのファイルです。 これは成功した場合に記録されます。 -cの動作はこちらを参照してください。 https://qiita.com/hiroysato/items/30c3bb07cbed825cf7a5#embulkのrunコマンドで実際にデータを投入
raccoondog

2018/11/30 00:38

ご回答有難うございます。 embulkの仕様について確認したいのですが、標準出力を見る限り対象データのバルクインサートが成功してからcommitがされていました。 これは全成功、全失敗とみなす動作である。という認識で正しいでしょうか また、-cオプションなしでも標準出力の最後に Next config diff: {"in":{"last_path"}:.........},"out":{}} と出力されていました。
hiroysato

2018/11/30 08:47

commitされるという文脈がどのことを指しているのかよくわからないのですが、 以下のCommitted.のメッセージが出るのはバルクロードが成功したときだと思います。 Next config diffは標準出力には出ますが、-cを指定しない限りファイルに出力されません。 2018-11-30 17:31:42.184 +0900 [INFO] (main): Committed. 2018-11-30 17:31:42.184 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"/private/tmp/hoge/csv/sample_01.csv.gz"},"out":{}} embulk example hoge embulk guess hoge/seed.yml -o config.yml をしたあとに embulk run -c diff.yml config.yml embulk run -c diff.yml config.yml embulk run config.yml を実行すれば挙動がわかるように思います。
raccoondog

2018/12/04 02:56

ご回答有難うございます。 -cオプションを使いましても、差分バルクインサートにはならず全データのインサートになってしまいました。 検証で、3分に1回、Oracleのテーブルへ1500レコードのインサート処理を走らせて インサート処理があったらOracleのトリガーがジョブをキックしてembulkのバルクインサートが実行される仕組みにしています。 毎回、Oracleのテーブルの全レコードをBigQueryへバルクインサートしてしまいました。 検証結果(インサートされるレコード数) 1回目:Oracle(1500レコード)、BigQuery(1500レコード) 2回目:Oracle(1500レコード)、BigQuery(3000レコード) 3回目:Oracle(1500レコード)、BigQuery(4500レコード) 期待される結果(インサートされるレコード数) 1回目:Oracle(1500レコード)、BigQuery(1500レコード) 2回目:Oracle(1500レコード)、BigQuery(1500レコード) 3回目:Oracle(1500レコード)、BigQuery(1500レコード)
hiroysato

2018/12/04 03:12

設定や、実行手順が書かれていないとコメントとしようがありません。 out: stdoutにして、まず-cの動作を確認してはいかがでしょうか?
raccoondog

2018/12/04 09:06

情報共有有難うございます。 非常に助かります。 incrementalオプションを使って、検証したのですがバルクインサートが走らない状況です。 検証方法は、疑似業務処理を流して3分に1度、1500レコード分のランダムな値を含んだレコードをインサートさせてます。 Oracleのテーブル定義、Embulkの定義、実行方法、ログ出力について質問欄に記載させて頂きます。 状況をみると、レコードが追加されてもembulkが途中で処理を繰り返しているような状況となります。
hiroysato

2018/12/04 09:28

Oracleのトリガの動作はわからないのですが、自分なら (1) in: oracle, out: csvなどで、-cオプションが動作しているか検証する。 (2) in: csv, out: bigquery等で、複数回にわけてbigqueryにデータが投入できるか確認する。 (3) トリガの動作確認 添付の設定であれば、Embulkの実行が終わるとdiff.ymlが更新されて、最後に読み込みしたidが記録されると思います。 余談ですが、一般的な話、5件のデータをインサートすると、5回トリガの処理が行われると思います。 インサートした件数分embulkを起動していませんか?
raccoondog

2018/12/04 12:15

ご指摘有難うございます。 ロジックの再確認をさせて頂きます。
raccoondog

2018/12/05 01:06

テストで単純にコマンド実行したのですが、型があわずエラーとなりました。 embulkの定義で型指定を変更してもエラーが出力されてしまう状況です。
raccoondog

2018/12/05 01:10

質問欄に状況更新させて頂きました。
hiroysato

2018/12/05 01:44

oracleは使っていないので憶測ですが、idがdoubleで出力されていると思います。 embulk previewで確認してみてください。 incremental_columnはdoubleはサポートしていないので、型変換が必要です。 型変換は、column_optionsを利用します。 https://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-oracle#example こちらのexampleを参照してください。 添付されている設定例のcolumnsはembulk-input-oracleでは利用されないと思います。 上記の例等設定内容をよくご確認ください。 個人的には前の回答は編集せずに、新しい回答で新しい設定などを記載し、一度記載した内容は残る方が良いかと思います。
raccoondog

2018/12/05 02:16

ご回答有難うございます。 型変換を実施して(double⇒string)再実行したのですが 今度は、incremental_columnsではstringもサポートしていない。というエラーが出力されてしまいました。
raccoondog

2018/12/05 02:30

詳細は質問内容欄に追記しました。
hiroysato

2018/12/05 05:29

どうもID NOT NULL NUMBER(8)となっていると、incremental_columnsで使えないっぽいですが 他の型は使えますか? 私の勘違いで、column_optionsを使って型を変更するのは意味がないようです。 SQLのwhere句で使うので、テーブルの型がincremental_columnsでサポートされている 型でないといけないようです。
raccoondog

2018/12/05 05:35

INPUT_TESTテーブルのDTカラムで実施したら成功いたしました。 last_recordにもログが出力されていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問