0

私は Spring Batch を使用して、大量のオンライン データをデータ ウェアハウスに抽出、変換、読み込みし、レコメンデーション分析を行っています。どちらも RDBMS です。

私の質問は、オフライン Spring Batch ETL のベスト プラクティスは何ですか? フルロードか増分ロードか? 私は Full Load の方がシンプルなので気に入っています。現在、データ読み込みジョブに次の手順を使用しています。

ステップ 1: データ ウェアハウス内のテーブル A を切り捨てます。
step2: データをテーブル A にロードします。
step3: データ ウェアハウス内のテーブル B を切り捨てます。
step4: データをテーブル B にロードします。
step5: データ ウェアハウスのテーブル C を切り捨てます。
step6: データをテーブル C にロードします。
...

データ ウェアハウス内のこれらのテーブルABC、... は、リアルタイム レコメンデーション システムの処理で使用されます。

しかし、オンライン データベースから読み込むデータは膨大であるため、ジョブ全体の処理には非常に時間がかかります。そのため、テーブルを切り捨ててまだデータをロードしていない場合、このテーブルに依存するリアルタイムのレコメンデーション処理に大きな問題が発生します。このデータの不完全性が発生しないようにするにはどうすればよいですか? ステージング テーブルまたはそのような戦略を使用していますか?

どんな返信でも大歓迎です。

4

1 に答える 1

0

いくつかのオプションがあります。

  • ソース テーブルの監査ログを使用して、ターゲットで更新する必要があるレコードを特定します。これはバッチ ETL の最適なオプションですが、ソース システムで監査ログを有効にする必要があります。監査をオンにする機能があり、それがパフォーマンスの問題にならない場合は、それが道です。

  • ソース テーブルに削除がない場合 (挿入と更新のみ)、レコードのチャンクを使用して、ターゲットからソースへの完全な読み取り/書き込みを単純に実行できます。

    ターゲット データベース エンジンに応じて、更新を実行するためのさまざまなオプションがあります。書き込み試行 (挿入または更新) を実行する必要がある場合もあります。失敗した場合は、例外をキャッチして、別の書き込みを実行する必要があります。(たとえば、挿入を試みます。 をキャッチした場合DuplicateKeyExceptionは、代わりに更新を実行する必要があります。挿入と更新の比率に応じて、挿入/更新の順序を更新/挿入の順序に戻すことができます)。

    他のエンジンでは、更新/挿入/削除を 1 ステップで実行できる MERGE が可能です。

    この方法でも大量のデータを移動できますが、ターゲットへの影響は最小限に抑えられます。もちろん、これは、参照整合性の問題が発生しないような方法でテーブルの更新を順序付けできることを前提としています。読みながらターゲットに書き込みます。

于 2013-10-01T15:59:01.217 に答える