https://blogs.oracle.com/dataintegration/entry/in_session_parallelism_in_odi12c
(Ayush Ganeriwalの寄稿です)
このエントリではODI 12cで導入された、新しいin-session parallelismを説明します。ODI 12cでは、各々が独立したマッピングの一部を並列実行できるようになりました。例えば、2個の独立したデータソースからデータをC$表へのロードを並列実行します。これらのオペレーションは各々独立しており、同時に実行できます。同様に、フロー制御やターゲットへのロードといった種々のユースケースで、このような並列実行を実現できます。ODI 12cは並行実行できるセッションタスクを自動的に識別し、並列実行のためのコードを生成します。マッピングのどの部分が並列実行されるのかを、ユーザーは視覚化して確認できます。必要であれば、業務要件にあわせてこの挙動を変更し、直列にタスクを実行することができます。
デプロイメントプランでの並列処理の表示
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEippUFY8fh-tjpaH1Eqsq3HUjFB7BghtvqVZwUnnyynjQ5PYdtpMNW-zU3qt8hJWPiuMenNgoWyFk3IPSb1jzSRmzImRDppzdNRXX6y-PZX-IxHZv0iTilaKzSaezOA3cFG5i0SfoC_I88/s1600/ODI_1.png)
通常のデプロイメントプランは上図のようになっており、ここでファイルやリレーショナルデータストアからのデータをまずステージングエリアであるC$表にロードし、結合して、ターゲット表にロードします。ここで様々なソースストアや対応するC$表、結合コンポーネント、ターゲットデータストアは、実行単位や実行単位グループと呼ばれる個別の青と黄色の箱で構成されています。実行単位グループには一つ以上の実行単位が含まれており、これらの実行単位は互いに独立しており並行実行が可能です。実行単位にはオペレーションの組み合わせが含まれており、これらは順に実行する必要があります。上記の例では、SOURCE_GROUPには、それぞれが独立していて並列実行される2個の実行単位が含まれています。TARGET_GROUPには一つの実行単位が含まれており、並列実行できないことがわかります。
並列処理はセッション内でどのように実行されるのか?
ステップ内のセッションタスクは、ロードプランのステップ階層に類似した階層形式で生成されます。SerialタスクとParallelタスクという名前の2個の新しいタスクタイプが導入されています。これらはコンテナタスクで、一つ以上の子タスクを配下に持つことができます。名前からわかるように、シリアルコンテナタスクの子タスクはシリアルに実行できます。一方、並列コンテナタスクの子タスクは並列に実行できます。これらのコンテナタスクをお互いの入れ子にして、タスク階層内に複数のレベルをもたらすことができます。デプロイメントプランに従い、ODI 12cは、これらのシリアルならびにパラレルタスクの階層を生成し、セッションパラレル実行を実現します。以下はシリアルおよびパラレルタスク階層の一例です。![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeGRQBnqq5scpdjyxihJy_qhjcbfhv_p_F5ubiEMPog2MNlgZYy9UzM1yyhlJ8gsUhBh-sImlRL8WJ3GH5_UWFtuvpjteFloriWX22y55gSiK-rt9VZnUioSa71JYhQoyONdOzZTgBugg/s640/ODI_2.png)
マッピングセグメント(並列処理の候補)
以下は、タスクが通常互いに独立しており同時実行できる一般的なマッピング部分の例です。- ソースデータをステージングエリアにロードする
- データを複数のターゲット表にロードする
- I$表でフローコントロールを実行する
ソースデータをステージングエリアにロード
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxkyernx95vHgM29nTvmuUXYB_PbhHaZZGRdfFjx2us7Q28U_-yg0y0UqSsjdFbtP8FvHW1TNfMLCamU9lAq0aaOqZ4GF7I0u8nTa9hp7ZrbnJwLbxQdPwxmCIezOQtG2DMRNOaE5AfYg/s640/ODI_3.png)
このマッピングではファイルとDBを結合し、ターゲット表にロードしています、ODIは次のデプロイメントプランを生成し、ソースをステージングエリアの コレクタ表(C$表)に並行ロードして結合し、シーケンシャルに実行する関連するタスクをターゲットで呼び出しています。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjuhguSco0pzRh1TTpQaOX5-VzrU_8k6wUSZgD9CZSY9ud2HpYPeeKDeRkvB7gARtKA73wPP3GauKeV58WplhKEErITRKkq2tPXPTCIxjc5CvUeSK-rRy6eAxI93Gxpf-L56EVLGRsQFc/s640/ODI_4.png)
デプロイメントプランを持つマッピング実行時にタスク階層を以下のように生成します。ここで以下のタスクセットが並列コンテナタスクで構成されていることがわかります。
- 各データソースに対応するC$表を削除・再作成するためのLKMのタスク
- 各C$表にデータをロードするLKMタスク
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCkz9SqTQ4NHwt4rnY_cjm8D2NEykdVGnqNhB5vCQVyZaY-7VpHICDC__qttuRMrlStz7KHafy8GzyqvzsLNGfvKpEw4bDNV1sigHxYESAGDZPLk-YpMdJ6uj8M1fpk9qa1et8DvAVbjc/s640/ODI_5.png)
これらのC$表を並列ロードせずにシーケンシャルにロードしたい場合には、実行単位を実行単位グループからドラッグ&ドロップして、デプロイメントプランを変更すればよいのです。これはつまり、各ソースデータセットが、全ての実行単位が直列で実行するように指定した別の実行単位グループを作成することになります。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg06F6U4mhkccCc9xc8lTdiED2NOwRo2YN3Tnp8fHD3F3ln3YoKm0MG2uoDVUZCLzVBWkruId98OkFzgJFkA84zor-njPil2GqzneN2qKcYYp5z018cg_Xh8M7FEo7J3cQOiAcknDkxxdI/s640/ODI_6.png)
タスク階層を実行すると、以下のように全てのタスクが直列実行していることがわかります。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6VE-XZGgrq5bPckNSsr8YMxNfcZsdSZvwccGFyzuK_znJw-Nxq9sN20j0kobpGxt1doPjDhQet-sh1NFkUSxfV9dmTP0zyn7cdiUxvmLdPrOjR1OG6di69XcigbmP2coO081oe-bwZS0/s640/ODI_7.png)
並列タスクのスレッド構成
ODI 12cランタイムはセッションの各並列タスクに対し、 個別のスレッドを生成します。これは、たくさんの並列化マッピングを実行すると数多くのスレッドがシステムリソースを使い切ってしまう可能性があることを意味します。ODIでは、物理エージェントの設定で、このような並列スレッドの個数を制御する2レベルの設定を提供しています。一つは、エージェント内のスレッドの最大数を制御するもの、もう一つはセッション内の最大スレッド数を制御するものです。新しいスレッドがこれらのスレッドの設定に応じて生成される場合にのみ、並列タスクを開始するため、これらの値は、十分に大きなレベルにしておく必要があります。![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcfnxXYvox5CTFbe4-hwki1iPE4SRNtOQZuXz1htv9qIaOgW1NWubsIURioNBdissO4js2iCt5CD0ltI60Kay2itsAvH9QrTiPnQ_JSinMCb9r2Z-3RmCVYdfeUlhjfcd7YRgG1VzEDgw/s640/ODI_8.png)
並列タスクのための接続管理
並列タスクの各々が個別のスレッドで実行されるので、任意の非トランザクショナルな動作のための共通コネクションで、並列タスクを実行してはいけません。それゆえ、だから、非トランザクショナルな操作を実行する場合、並列タスクが各々並列タスク用の接続を接続プールから取得します。そのため、複雑な並列マッピングの場合、並列処理のレベルに応じて、接続プールのサイズを適切に設定する必要があります。もう一つの注意すべきポイントは、各並列タスクが新しい自動コミット接続を取得するため、タスクが終了すると接続を閉じます。つまり、接続の開始・終了時時にOnConnect/OnDisconnectタスクが実行されます。それゆえ、並列タスクを持つマッピングに対し、複数のOnConnect/ OnDisconnectのタスクエントリが表示されることがあります。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfp1yadIGS5GcvfYAN3A6K2ZchxAmY0c1m2EKEubhjC1U-4k3AC3Ud8CEUdtJOtb5EM5L5LKsey5hRSGJXdbxz5opumhe_WJ-LVHA4xkay8mox0y2wo4nET5rkIaKbfZMjKtCaLAk9Ygw/s640/ODI_9.png)
このような並列処理では、各々の並列タスクは、以前のタスクで実行されたすべてのオペレーションを知らない新しい接続を取得するため、任意の並列タスクは、以前のタスクで行われたデータベース接続内の任意の変化を頼ることはできません。
トランザクション接続で実行されるオペレーションに対し、並列タスクは十分な柔軟性を持っておらず、一つずつオペレーションを実行する必要があります。このようなトランザクショナルな接続に対し、同期を維持して 唯一の並列実行がその接続でオペレーションを実行するようにしています。したがって、そのようなトランザクションに並列タスクを参加させると、同期のための余分なロック・アンロックが原因で、実際に性能が低下することがあります。
まとめ
ODI 12cはマッピング部分に並列処理を使うことで性能を向上させることができます。それは自動的にマッピング内で並列化可能な部分を識別するだけでなく、特殊な業務要件のために直列実行を実現するための柔軟性も持ち合わせています。このような並列処理の結果、パフォーマンスが向上しますが、さらに高いレベルの並列処理のために、接続プールとスレッド数をチューニングすることができます。より最新のOracle Data Integrationニュースを知りたい方は、@ORCLGoldenGate と @nmadhu2k3 のTweetをフォローして下さい。
0 件のコメント:
コメントを投稿