SAP Data Services の説明
データへのアクセス
ジョブおよびデータフローの開発
バッチジョブのトラブルシューティング
関数、スクリプト、変数の使用
Platform トランスフォームを使用したデータのクエリ
Platform トランスフォームによるデータの分割と結合
エラーの処理と障害からのリカバリ
データ更新
SAP Data Services インテグレータトランスフォームを使用した高度な ETL シナリオの設計
パフォーマンスの最適化

エラー処理の設定

Objective

After completing this lesson, you will be able to データリカバリ方針のレベルの説明

エラー処理方針

エラー状況を管理する最初の解決策は、エラー状況を回避することです。一部のエラー状況は、ジョブを構築することで簡単に並列的に実行できるため、頻繁に失敗する問題が考慮されます。

しかし、サーバー障害などやむを得ない状況もある。その後、失敗した状況から回復するようにデータフローを設計する必要があります。

エラーの回避

データフローのエラーは、以下の方法で回避できます。

  • コンテキストが正しい場合にのみデータフローが実行されるように、条件を使用します。
  • ループを使用して、コンテキストが正しくなるまで最初からやり直します。

    万が一の状況に届かない場合は、忘れずに外出方法を追加してください。

1 つの例として、ジョブを実行するために外部ファイルが必要である場合が挙げられます。この場合、wait_for_file 関数または while ループと file_exists 関数を使用して、ジョブを実行する前に指定された場所にファイルが存在することを確認します。

While ループは、ワークフローで使用される単一使用のオブジェクトです。While ループは、条件が true である限り、一連のステップを繰り返します。

通常、While ループ中に実行されるステップによって条件が変更され、最終的に条件が満たされなくなり、ワークフローが While ループから終了します。条件が変更されない場合、While ループは終了しません。

たとえば、ワークフローが特定のファイルが書き込まれるまで待機することができます。while ループを使用して、file_exists 関数を使用してファイルの存在を確認します。ファイルが存在しない限り、ワークフローは特定の期間、スリープモードに移行してから再チェックすることができます。

ファイルが書き込まれない可能性があるため、カウンタなどの別のチェックをループに追加して、while ループが最終的に終了するようにします。つまり、While ループを変更して、ファイルの有無とカウンタの値をチェックします。ファイルが存在せず、カウンタが特定の値より小さい場合は、While ループを繰り返します。ループの各反復で、ワークフローをスリープモードにして、カウンタを増やします。

データリカバリ方針のレベル

一部のエラーは予測できないため、ジョブが失敗します。

失敗したジョブを再実行すると、最初のジョブ実行中に正常にロードされた行が重複する可能性があります。

その後、データベースが正しい状態になり、スケジュールを続行できるように、ジョブをリカバリする方法を見つける必要があります。

リカバリ方針は以下のとおりです。
  • データベース全体のリカバリ

    標準の RDBMS サービスを使用して、クラッシュしたデータキャッシュをデータベース全体にリストアします。このオプションは、このコースの範囲外です。

  • 以下のトランザクションを使用します。

    テーブルに整合性のある状態が保持されるように、トランザクションで収集されるデータフローを設定します。

  • 部分的にロードされたテーブルからのリカバリ:

    行の重複ロードを回避します。

  • 見つからない値または行を修復します。

    欠損値を特定し、挿入できなかったローを管理します。

  • 例外の管理:

    すべての例外がワークフローで管理されていることを確認します。

アプリケーション内のデータフロー間の関係に応じて、これらの手法を組み合わせてエラーから回復することができます。

トランザクションの設定

データフローで大量のデータをロードする必要がある場合、またはデータフローによって依存テーブル (受注テーブルや受注明細テーブルなど) をロードする必要がある場合、他の一部がロードされていない行はロードしません。

パフォーマンスとリソースの使用を改善するために、SAP Data Services ではデフォルトで複数のトランザクションのテーブルがロードされます。"コミットする行数" オプションを設定して、各トランザクションで処理される行数を決定することができます。

ただし、データフローが失敗した場合は、ジョブの停止時に一部の行がすでにテーブルでコミットされている可能性があります。

この状況を回避するには、データフロー全体を 1 つのトランザクションに含めるように Data Services に依頼します。

一部ロードされたデータ

重複するローが挿入されないようにするには、いくつかの方法を使用できます。

  • 重複の挿入を回避するには、以下のいずれかのオプションを使用します。
    • テーブルの行数が増加し、ファクトテーブルなどのフィールドが少ない場合にのみ、不足している行を挿入するために、データフローに Table Comparison トランスフォームを含めます。
    • ターゲットテーブルで [ロード前にテーブルからデータを削除する] または [テーブルをドロップおよび再作成する] オプションを選択して、各実行時にデータを置き換えます。この手法は、ターゲットテーブルの変更がテーブルのサイズと比較して多数ある場合に最適です。
    • テーブルの行数が減り、ディメンションテーブルなどのフィールドの数が多い場合に、ロードの自動修正機能を使用するように、ターゲットテーブルのオプションを変更します。
    • SQL コマンドを含めて、テーブルがロードされる前に以前の部分的な更新を削除します。

自動訂正ロードでは、テーブルに新しい行を追加する前に、ターゲットテーブルで既存の行がチェックされます。ただし、auto-correct ロードオプションを使用すると、ジョブの速度が低下する可能性があります。ターゲットテーブルが大きく、テーブルに対する変更が比較的少ない場合は、この手法を考慮してください。

ロード前の SQL コマンドを使用すると、ジョブ内のステップが不完全なときに発生する部分的なデータベース更新を削除できます。通常、プリロード SQL コマンドは、部分的な挿入ステップの開始前に設定された変数に基づいてローを削除します。

見つからない値または行

  • Validation または Query トランスフォームでの欠落値の処理
  • [オーバーフローファイルを使用する] オプションで欠落を処理します。

欠落している行は、ターゲットテーブルに挿入できない行です。たとえば、プライマリキー制約に違反した場合、ローが欠落することがあります。オーバーフローファイルは、このようなデータの問題を処理するのに役立ちます。

オーバーフローファイルを指定し、Data Services で行をテーブルにロードできない場合、Data Services はその行を代わりにオーバーフローファイルに書き込みます。トレースログには、ロードが失敗したデータフローとファイルの場所が示されます。オーバーフロー情報を使用して、ソース内の無効なデータ、またはデータ移動で発生した問題を特定します。新しい実行を行うたびに、既存のオーバーフローファイルが上書きされます。

オーバーフローファイルを使用する場合は、ファイル名とファイル形式を入力する必要があります。

ファイル形式には、以下の 2 つのオプションがあります。

  • データの書き込みを選択すると、Data Services を使用して、オーバーフローファイルからデータを読み取り、クレンジングしてターゲットテーブルにロードすることができます。
  • SQL の書き込みを選択すると、ターゲットにアクセスするときに SQL コマンドを使用してターゲットを手動でロードできます。

注意

オーバーフローファイルの完全パス名を指定すると、同じジョブで複数のファイルが作成された場合に Data Services によって一意のファイルが作成されます。

代替ワークフロー

可能性のあるすべての例外をカバーし、リカバリメカニズムが組み込まれた代替ワークフローを使用するようにジョブを設定することができます。この方法により、結果のリカバリプロセスを自動化することができます。

この例では、メインデータフローで、ターゲットテーブルをロードするためのデフォルト設定が使用されています。

エラーが発生した場合、ジョブでエラーが記録されます。問題を修正した後、ジョブを再度実行します。

次回の実行では、自動修正ロードオプションが設定された別のデータフローが使用されます。これにより、すでに最初にコミットされた可能性がある行に関係なく、データフローを正常に完了することができます。

デフォルトのデータフローを使用するには、ジョブの次回実行のために正常な実行を記録する必要があります。

代替ワークフローコンポーネント

前の図に示すように、代替ワークフローは複数のコンポーネントで構成されます。

  1. リカバリが必要なタイミングを決定するスクリプト。

    このスクリプトは、ステータステーブルの値を読み込み、グローバル変数に同じ値を入力します。初期値は、リカバリが不要であることを示すために設定されます。

  2. リカバリが必要かどうかに基づいて適切なワークフローを呼び出す条件です。

    条件式には、リカバリを必要としないワークフローを 1 つの方法で処理することを指定する If/Then/Else 文が含まれており、リカバリが必要なワークフローは別の方法で処理されます。

  3. リカバリなしでデータフローを実行するための Try/Catch ブロックを含むワークフロー。

    リカバリが不要なデータフローは、ロードの自動修正オプションを設定せずに設定されます。これにより、可能な限り、データフローがリソースを集中的に消費しないモードで実行されるようになります。

  4. ステータステーブルを更新するための Catch オブジェクト内のスクリプト。

    スクリプトでは、例外が生成された場合にリカバリが必要であると指定されています。

  5. リカバリを使用してデータフローを実行するワークフロー、およびステータステーブルを更新するスクリプト。

    データフローは、例外を解決するリソースを大量に消費する処理のために設定されます。スクリプトによってステータステーブルが更新され、リカバリが不要であることが示されます。

条件式

条件式は、ワークフローに条件ロジックを実装するために使用されるシングルユースオブジェクトです。

conditional が定義されている場合は、条件と 2 つの論理分岐を指定します。

内容説明
IfTRUE または FALSE と評価されるブール式。関数、変数、および標準演算子を使用して、式を作成します。
ThenIF 式が TRUE と評価された場合に実行するワークフロー要素。
それ以外の場合IF 式が FALSE の場合に実行するワークフロー要素。

条件式の Then 分岐と Else 分岐の両方に、他のワークフロー、データフロー、ネストされた条件式、Try/Catch ブロック、スクリプトなど、ワークフローで使用できる任意のオブジェクトを含めることができます。

Try/Catch ブロック

Try/Catch ブロックを使用すると、ジョブの実行中にエラーが発生した場合に代替ワークフローを指定することができます。

Try/Catch ブロックは、指定されたエラークラスを捕捉し、提供された解決策を適用し、実行を継続します。

クラスやエラーが異なる場合に、同じブロック内に複数の Catch 操作を指定することができます。

Catch ごと

  • 1 つの例外またはキャッチで処理される例外のグループを指定します。

    複数の例外または例外のグループを処理するには、Try/Catch ブロックに捕捉を追加します。

  • 指定された例外が発生した場合に実行するワークフローを指定します。

    既存のワークフローを使用するか、Catch エディタでワークフローを定義します。

Try/Catch ブロックの実行中に例外がスローされ、その例外を Catch で検索しない場合、例外は通常のエラーロジックによって処理されます。

試してみる

ここでは、代替ワークフローの使用について説明します。最初に、必要なすべてのオブジェクトを準備します。

ここでは、代替ワークフローの作成について説明します。