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

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

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

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

BigQuery

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

Oracle Database

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

4回答

1891閲覧

embulkの増分バルクインサート処理の仕組みについて

raccoondog

総合スコア77

Embulk

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

BigQuery

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

Oracle Database

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/02/12 08:26

embulkの増分バルクインサート処理を使って、Oracle DBのデータをBigQueryへデータ連携させます。

増分バルクインサート処理の仕組みについて確認したいです。

※認識している増分バルクインサート処理のロジック

➀Embulk実行 ➁OracleへJDBC接続 ➂BigQueryに中間テーブルを生成 ➃インサート対象のレコード検索 ➄embulk内部ファイルへ書込み ➅embulk内部ファイルを中間テーブルへコピー ➆中間テーブルからBigQueryのテーブルへバルクインサート ➇中間テーブル削除 ➈embulk内部ファイル削除 ➉コミット ⒒結果ファイルへlast_record書き込み

上記ロジックであると認識していまして、

➃インサート対象のレコード検索

➃の処理について、実際DBに対してどのような検索をしているのか?

上記11の処理で、結果ファイルにlast_record(タイムスタンプ)を出力し、次回インサート処理時には結果ファイルを参照して、前回インサートしたレコード分はスキップする。

との情報を得ているのですが、embulkの内部DB?があって情報整理しているのか?
教えて頂きたいです。

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

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

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

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

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

guest

回答4

0

-c diff.yml で指定したファイルにlast_recordの情報が記録され次回実行時にwhere句に
last_record > 'last_record'の値
という文が追加されるだけです。out: stdoutとかにして実行してみるのがわかりやすいと思います。

投稿2019/02/13 01:17

hiroysato

総合スコア415

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

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

raccoondog

2019/02/13 01:45

ご回答有難うございます。 まだ、理解出来ておりませんでして、再確認させてください。 embulkの結果ファイルにlast_recordの値(yyyy_mm_dd hh:mm:ss)が出力されていて、次回実行時にはinput対象のテーブルに対して、以下のSQLを使い select * from table_name where column_name > (yyyy_mm_dd hh:mm:ss) order by column_name; 増分バルクインサート処理される。 この時のタイムスタンプ情報と、特定のカラム値の情報をどのように紐づけしているのか知りたいです。 例:table ID NUM STR DT --- ------ ------ ----- 11 1234 abc 1210 12 5678 def 1211 13 9123 ghi 1212 ← ここのレコード迄が前回インサート分 例:diff.yml 2019-02-13T09:00:00.00000
guest

0

3回目が以下のデータで

ID NUM STR DT --- ------ ------ ----- 11 1234 abc 1210 12 5678 def 1211 # <-- 初回取得レコード 13 9123 ghi 1212 14 4567 ghi 1213 # <-- 2回目取得レコード 15 8912 ghi 1214 16 3456 jkl 1215 # <-- 3回目取得レコード

diff.ymlが以下のようになっており

{ DT: 1215}

4回目が以下のデータで、

ID NUM STR DT --- ------ ------ ----- 11 1234 abc 1210 12 5678 def 1211 # <-- 初回取得レコード 13 9123 ghi 1212 14 4567 ghi 1213 # <-- 2回目取得レコード 15 8912 ghi 1214 16 3456 jkl 1215 # <-- 3回目取得レコード 17 7891 mno 1215 ☆また、1215と同じカラム値が連続していた場合

ID = 17のレコードが取得できるかというご質問であれば、DTを使っている場合はID=17は取得できません。
4回目の実行は以下のようになるからです。

sql

1select * from table where DT > 1215

incremental_columnで指定するカラムは後から挿入されるデータが必ず現在保存されているより大きい値であることを期待します。

数値の場合は大きい数字、時刻の場合はより新しい時刻です。

投稿2019/02/13 08:36

hiroysato

総合スコア415

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

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

raccoondog

2019/02/13 08:39

有難うございます。 大変助かりました。
guest

0

ベストアンサー

現在うまく言っているのであれば、そちらの設定ファイルと実行時のログを見ればどのように紐付けされるのかわかるような気がします。
現在の設定と実行されているSQL文を確認してみてはいかがでしょうか?

私を含めて他の人も環境、設定ファイル、ログがないと具体的には回答できません。

以下のようになるはずです。現在うまく動作しているログがあると思いますのでそちらを確認することをお勧めします。

1回目

ID NUM STR DT --- ------ ------ ----- 11 1234 abc 1210 12 5678 def 1211
incremental: true incremental_column: [DT]

embulk実行、以下のどちらかが実行されます。
(実行しないとわからないのでご自身で確認してみてください。)

sql

1select * from table where DT > 0

または

sql

1select * from table

作成されるdiff.yml

yaml

1{ DT: 1211 }

2回目

ID NUM STR DT --- ------ ------ ----- 11 1234 abc 1210 12 5678 def 1211 # <-- 前回取得レコード 13 9123 ghi 1212 # <-- 追加レコード

sql

1select * from table where DT > 1211

投稿2019/02/13 02:50

hiroysato

総合スコア415

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

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

raccoondog

2019/02/13 03:01

有難うございます。ロジックの詳細がわかりました。 実行ログと、設定ファイル、テーブルの値を見比べて、上記回答の通りになっておりました。
raccoondog

2019/02/13 08:29

すみません、追加で確認させてください。 例えば以下の状況の場合でも最終取得レコードを正常に判別できるのでしょうか? ID NUM STR DT --- ------ ------ ----- 11 1234 abc 1210 12 5678 def 1211 # <-- 初回取得レコード 13 9123 ghi 1212 14 4567 ghi 1213 # <-- 2回目取得レコード 15 8912 ghi 1214 16 3456 jkl 1215 # <-- 3回目取得レコード 17 7891 mno 1215 ☆また、1215と同じカラム値が連続していた場合
guest

0

こちらを参考に、
https://obel.hatenablog.jp/entry/20170302/1488383422

yaml

1incremental: true 2incremental_column: [DT]

とやってみるのはいかがですか?

前うまくできたと書いてありますが、前回となにが違うのかよくわかりません。
https://teratail.com/questions/160529

投稿2019/02/13 02:08

hiroysato

総合スコア415

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

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

raccoondog

2019/02/13 02:17

ご回答有難うございます。 設定につきましては、問題なく成功しております。 前回の質問にご回答頂いた内容で、何の問題もない状況です。 embulkの増分バルクインサート処理のロジックを詳細に知りたい状況となります。 といいますのも、1億レコード近くあるDBに、1日最大50万レコードがDBにインサートされるシステムになります。 頻繁にインサート処理がされるOracle DBに対して、embulkを使ってbigqueryへ増分バルクインサート処理を定期実行する運用で、ファイルに出力されるタイムスタンプ値のみで本当に問題ないのか? とプロジェクト内で議題に上がっております。 そこで、ロジックの詳細を抑えておいて説明が出来るようにしたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問