ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Real-Time Decisionsプラットフォーム開発者ガイド
11g リリース1 (11.1.1)
B72429-01
  目次へ移動
目次

前
 
次
 

16 Oracle RTDバッチ・フレームワーク

Oracle RTDバッチ・フレームワークは、インライン・サービスでバッチ機能を実現できるコンポーネントのセットです。これにより、インライン・サービスで対話型統合点リクエストの処理に使用できるだけでなく、あらゆる種類のバッチ操作も実行できます。この章では、バッチ・フレームワークのアーキテクチャと、バッチ・ジョブを実装および管理する方法について説明します。

一般的に、バッチでは、データベース表、フラット・ファイルまたはスプレッドシートから一連の入力行を読み取り、各入力行を順番に処理し、必要に応じて入力行ごとに1行以上の行を出力表に書き込みます。

非対話型の設定でOracle RTDのバッチ処理機能を使用する例を、次に簡単に示します。

インライン・サービスでは、インライン・サービスの開発者が、BatchJobインタフェースを実装するJavaクラスを1つ以上定義します。BatchJobは、インライン・サービスでサポートする名前付きバッチごとに1つ使用します。インライン・サービスで、BatchJobの各実装をOracle RTDバッチ・フレームワークに登録することで、使用可能なジョブ・タイプが外部のバッチ管理アプリケーションで開始できるようになります。外部アプリケーションは、バッチ・フレームワークで用意されているBatchAdminClientクラスを介して、登録されているバッチ・ジョブの開始、停止およびステータスの問合せができます。Oracle RTDに付属のバッチ・コンソールは、このようなバッチ関連管理作業を実行できるコマンドライン・ユーティリティです。


注意:

Oracle RTDドキュメント全体にわたって次の用語が参照されます。

  • RTD_HOME: Oracle RTDクライアント側ツールがインストールされているディレクトリです。

  • RTD_RUNTIME_HOME: アプリケーション・サーバーによってOracle RTDが実行されるアプリケーション・サーバー固有ディレクトリです。

詳細は、『Oracle Fusion Middleware Oracle Real-Time Decisions管理者ガイド』の「Oracle RTDラインタイム環境について」を参照してください。


この章の内容は次のとおりです。

16.1 バッチ・フレームワーク・アーキテクチャ

この項では、バッチ・フレームワーク・アーキテクチャのコンポーネントの概要を示し、複数のクラスタ・サーバー全体でバッチ機能を使用する方法について説明します。

16.1.1 バッチ・フレームワークのコンポーネント

次の図は、単一のOracle RTDインスタンスにおけるバッチ・フレームワーク・アーキテクチャのコンポーネントを示しています。

bf_arch_ovwx.gifについては周囲のテキストで説明しています。

バッチ・フレームワークの主要コンポーネントとその機能は、次のとおりです。

  • Batch Admin Client

    Batch Admin ClientはJava APIのセットを備えており、Javaクライアント・アプリケーションはこれを使用することで、リモートのReal-Time Decision Serverに登録されているバッチを管理できます。これには、バッチの開始と停止およびバッチ・ステータス情報の取得が含まれます。

    顧客は、Batch Admin Clientで用意されているAPIを使用して、独自のバッチ・クライアント・アプリケーションを作成できます。

    バッチ・コンソールは、リモートのReal-Time Decision Serverに登録されているバッチを管理するためのクライアント側コマンドライン・ユーティリティです。内部的には、バッチ・コンソールはBatch Admin Clientで用意されているAPIを使用しています。

  • Batch Manager

    これはクラスタ全体のシングルトン・サービスで、Batch Admin Clientからクライアント・コードのクライアント・バッチ・コマンドを実行します。Batch Managerは、クラスタの各Batch Agentを管理します。

    Batch Managerは、バッチ・コンソールのコマンドも実行します。

  • Batch Agent

    Batch Agentは、バッチ・ジョブとバッチ・フレームワークとの間のインタフェースです。バッチ対応のインライン・サービスがデプロイされるとバッチをBatch Managerに登録し、Batch Managerのかわりにバッチ・コマンドを実行するサービスです。

クラスタ環境では、バッチ・フレームワークのコンポーネントのすべてが各Oracle RTDインスタンスに表示されます。ただし、Batch Managerはいずれかのインスタンスでのみアクティブであり、そのアクティブなBatch Managerが、クラスタ内のすべてのBatch Admin ClientリクエストおよびBatch Agentリクエストを制御します。

16.1.2 クラスタ環境内でのバッチ・フレームワークの使用

次の図は、クラスタ環境内でのバッチ・フレームワークの使用例を示しています。

bf_arch_cluster2.gifについては周囲のテキストで説明しています。

バッチ・コンソールなどのバッチ・クライアント・アプリケーションは、ジョブの開始、停止、一時停止などのバッチ管理コマンドを起動することでBatch Managerと通信します。

デシジョン・スタジオを使用している開発者は、インライン・サービスを作成し、Oracle RTDがインストールされているインスタンス(クラスタ・サーバー2のインスタンスなど)に、バッチでインライン・サービスをデプロイできます。


注意:

クラスタ環境では、Decision Serviceを実行しているすべてのサーバーにインライン・サービスがデプロイされます。


この図では、クラスタ・サーバー2インスタンス上のBatch Agentが、Batch Managerにバッチを登録しています。

Batch Managerは、登録済のバッチ・ジョブを、クラスタ・サーバー3など、任意のインスタンスで実行できます。

16.2 バッチ・ジョブの実装

この項では、バッチを実装するために必要なランタイム・オブジェクト・モデルの概要を説明します。

インライン・サービスがバッチ対応であるためには、BatchJobインタフェースを実装するバッチ・ジョブ用Javaクラスが1つ以上必要であり、これをバッチ・フレームワークに登録する必要があります。


注意:

この項の例は、Oracle RTDとともにリリースされるCrossSellインライン・サービスを参照しています。これには、CrossSellSelectOffersバッチ・ジョブが含まれています。


この項には、次の項目が含まれます。

16.2.1 BatchJobインタフェースの実装

デシジョン・スタジオでのバッチ・ジョブの実装は、BatchJobインタフェースを実装するJavaクラスを作成することで開始します。

最初に、インライン・サービスのsrcブランチの下に、Javaパッケージおよびクラスを作成します。

次の図は、バッチ処理用JavaクラスのOfferSelectJob.javaを示しています。これはcrosssell.batchパッケージで宣言されています。

sr_bj_src.gifについては周囲のテキストで説明しています。

Javaクラスを作成する最も簡単な方法は、バッチ・フレームワークで用意されているBatchJobBaseからサブクラス化する方法です。

ジョブが開始すると、バッチ・ジョブの主要メソッドが次の順序でコールされます。

  1. init()

    バッチの処理ループを開始する前に、フレームワークによって1回コールされます。

  2. getNextInput()

    バッチで処理される次の入力行を返します。

  3. executeRow()

    BatchJobではこのメソッドを実装することで、getNextInputによって返された入力行を処理します。通常は、getNextInputとは異なるスレッドでコールされます。

  4. flushOutputs()

    フレームワークによってコールされ、BatchJobではその出力表バッファをフラッシュできます。

  5. cleanup()

    バッチの終了後や停止後に、フレームワークによってコールされます。init()メソッドによって作成された結果セットなど、バッチ・ジョブによって割り当てられたリソースをクリーンアップします。

BatchJobインタフェースのメソッドの詳細は、次のJavadocエントリを参照してください。

RTD_HOME\client\Batch\javadocs\com\sigmadynamics\batch\BatchJob.html

サンプルのバッチ・ジョブ

サンプルのバッチ・ジョブであるOfferSelectJob.javaは、Oracle RTDとともにリリースされるCrossSellインライン・サービスにあります。このバッチ・ジョブは、顧客のセットに対して最適なオファーを選択し、そのオファーを表に保存します。

16.2.2 バッチ・フレームワークへのバッチ・ジョブの登録

この項では、Oracle RTDバッチ・フレームワークにバッチ・ジョブを登録する方法について説明します。バッチ・ジョブを含むJavaクラスを、インポートされたJavaクラスとして登録してから、batchAgent.registerBatchメソッドを使用してバッチ・ジョブをバッチ・フレームワークに明示的に登録する必要があります。

この項には、次の項目が含まれます。

16.2.2.1 BatchAgent

バッチ・ジョブにおいて、Batch Agentは、バッチ・ジョブとバッチ・フレームワークとの間のインタフェースです。バッチ・ジョブはバッチ・フレームワークに登録する必要があります。

インライン・サービスは、そのアプリケーション・オブジェクトの「ロジック」にあるゲッターを介して、Batch Agentを指定できます。たとえば、インライン・サービスがセッションにアクセスできるコンテキストでは、次のコマンドを使用してBatchAgentにアクセスできます。

  • BatchAgent batchAgent = session().getApp().getBatchAgent();

16.2.2.2 インポートされたJavaクラスのインライン・サービスへの登録

次に示すように、Javaクラスをインライン・サービスに登録する必要があります。

  1. アプリケーション・オブジェクトの「詳細」ボタンをクリックします。

  2. 「インポートしたJavaクラス」ペインで、インライン・サービスのバッチ・ジョブ・クラスごとに次の形式で行を入力します。

    <package>.<class>
    

    例:

    crosssell.batch.OfferSelectJob
    

16.2.2.3 バッチ・ジョブのインライン・サービスへの登録

インライン・サービスは、アプリケーションの「ロジック」タブの「初期化ロジック」ペインで、batchAgent.registerBatch APIを使用してそのBatchJob実装を登録する必要があります。

インライン・サービスは、そのアプリケーション・オブジェクトのゲッターを介して、バッチ・フレームワークへのインタフェースであるBatch Agentを指定できます。次のような行を入力します。

BatchAgent batchAgent = getBatchAgent();

続けて、インライン・サービスのバッチ・ジョブごとに、batchAgent.registerBatchの起動を指定します。

batchAgent.registerBatchのパラメータの詳細は、次のJavadocエントリを参照してください。

RTD_HOME\client\Batch\javadocs\com\sigmadynamics\batch\BatchAgent.html

batchAgent.registerBatchのパラメータの要約は、次のとおりです。

  • batchName: バッチ・クラスをクラスタに登録するときに使用される短縮名。クラス全体で一意である必要があります。

  • batchJobClass: バッチのBatchJob実装クラスの完全修飾名。

  • description: nullでない場合は、バッチの目的を説明する文字列。

  • parameterDescriptions: バッチでサポートされるパラメータを説明するプロパティのセット(オプション)。

  • parameterDefaults: バッチでサポートされるパラメータのデフォルト値を用意するプロパティのセット(オプション)。

たとえば、次のものを登録すると仮定します。

  • crosssell.batch.OfferSelectJobクラスを使用するCrossSellSelectOffersバッチ

アプリケーションの「初期化ロジック」で、次を入力します。

BatchAgent batchAgent = getBatchAgent();
batchAgent.registerBatch("CrossSellSelectOffers", 
                                 "crosssell.batch.OfferSelectJob",
                                 OfferSelectJob.description, 
                                 OfferSelectJob.paramDescriptions,
                                 OfferSelectJob.paramDefaults);

16.3 バッチ・ジョブの管理

バッチの開始と停止、ステータスの問合せなど、バッチ・ジョブを管理する場合の中心となる方法は、コマンドライン・ユーティリティのバッチ・コンソールを使用する方法です。

このユーティリティでは、BatchAdminClient Javaインタフェースを使用しています。BatchAdminClient Javaインタフェースには、バッチの開始や管理を行うためのメソッドも含まれており、これらのメソッドは外部プログラムで使用します。

この項には次のトピックが含まれます:

16.3.1 BatchClientAdminインタフェースの使用

BatchAdminClient Javaインタフェースには、バッチの開始や管理を行うためのメソッドが含まれており、これらのメソッドは外部プログラムで使用します。

表16-1に、BatchAdminClientインタフェースのメソッドを示します。

表16-1 BatchAdminClientのメソッド

戻り型 説明

int

clearBatchStatuses()

すべての完了済バッチのステータス情報を削除します。

int

clearBatchStatuses(int numToKeep)

完了済ジョブにおいて最も古いバッチのステータス情報を削除します。

int

clearBatchStatuses(java.lang.String batchName)

完了済ジョブにおいて指定バッチ名を持つすべてバッチのステータス情報を削除します。

int

clearBatchStatuses(java.lang.String batchName, int numToKeep)

完了済ジョブにおいて指定バッチ名を持つすべてバッチのステータス情報を削除します。

BatchStatusBrief[]

getActiveBatches()

現在実行中、一時停止または実行待ちのバッチ・ジョブのすべてについて、簡単なステータス情報の順序付きリスト(場合によっては空)を返します。

java.lang.String

getBatchDescription(java.lang.String batchName)

バッチの目的を説明する文字列(場合によっては空)を返します。

java.lang.String[]

getBatchNames()

バッチ・フレームワークに登録されているバッチのリストを取得します。

java.util.Properties

getBatchParameterDefaults(java.lang.String batchName)

バッチがサポートする起動パラメータのデフォルト値を格納しているプロパティを取得します。

java.util.Properties

getBatchParameterDescriptions(java.lang.String batchName)

バッチがサポートするパラメータを説明するプロパティを取得します。

BatchStatusBrief[]

getJobHistory()

バッチ・マネージャがそのステータス情報を保持しているバッチ・ジョブ(clearBatchStatusesによって説明が破棄されていないバッチ・ジョブ)のすべてについて、簡単なステータス情報の順序付きリスト(場合によっては空)を返します。

BatchStatusBrief[]

getJobHistory(int maxToShow)

Batch Managerがそのステータス情報を保持しているバッチ・ジョブ(clearBatchStatusesによって説明が破棄されていないバッチ・ジョブ)のすべてについて、簡単なステータス情報の順序付きリスト(場合によっては空)を返します。

BatchStatus

getStatus(java.lang.String batchID)

startBatch()へのコールによって発行された際に返されたバッチIDによって識別されるバッチのステータスを返します。

void

pauseBatch(java.lang.String batchID)

バッチを停止しますが、再開できるように、リソースはクリーンアップされません。

void

restartBatch(java.lang.String batchID)

停止しているバッチを再起動します。

void

resumeBatch(java.lang.String batchID)

一時停止しているバッチを続行します。

java.lang.String

startBatch(java.lang.String batchName)

デフォルトの起動パラメータによりデフォルトの並行処理グループでバッチを開始します。

java.lang.String

startBatch(java.lang.String batchName, BatchRequest startParameters)

渡された起動パラメータによりデフォルトの並行処理グループでバッチを開始します。

java.lang.String

startBatch(java.lang.String batchName, java.lang.String concurrencyGroup)

デフォルトの起動パラメータを使用して、指定された並行処理グループでバッチを開始します。

java.lang.String

startBatch(java.lang.String batchName, java.lang.String concurrencyGroup, BatchRequest startParameters)

渡された起動パラメータを使用して、指定された並行処理グループでバッチを開始します。

void

stopBatch(java.lang.String batchID)

バッチを停止し、BatchJob.cleanup()をコールしてそのリソースをクリーンアップします。

void

stopBatch(java.lang.String batchID, boolean discardSandboxes)

バッチを停止し、BatchJob.cleanup()をコールすることでそのリソースをクリーンアップします。また必要に応じて、最後のチェックポイント以降、バッチによって生成された学習データと出力表レコードを破棄します。


BatchAdminClientインタフェースの詳細は、次のJavadocエントリを参照してください。

RTD_HOME\client\Batch\javadocs\com\sigmadynamics\batch\client\BatchAdminClient.html

16.3.2 バッチ・コンソールの使用

バッチ・コンソールは、batch-console.jarというコマンドライン・ユーティリティです。バッチの開始、停止およびステータスの問合せを行うには、バッチ・コンソールを使用します。

バッチ・コンソールを起動するには、次のコマンドを実行します。

  1. cd BATCH_HOME

    通常、BATCH_HOMEC:\OracleBI\RTD\client\Batchです。

  2. java [-Djavax.net.ssl.trustStore="<trust_store_location>"] -jar batch-console.jar -user <batch_user_name> -pw <batch_user_password> [-url <RTD_server_URL>] [-help]


    注意:

    1. バッチ・ユーザー名とパスワード情報を入力する必要があります。-userパラメータや-pwパラメータの値を指定しないと、その入力が求められます。

    2. <RTD_server_URL>(デフォルト値はhttp://localhost:8080)は、Decision Serviceのアドレスです。クラスタの場合、一般的にロード・バランサの仮想アドレスで、Decision ServiceのJ2EEクラスタを指すアドレスになります。

    3. -Djavax.net.ssl.trustStore="<trust_store_location>"パラメータは、SSLを使用してReal-Time Decision Serverに接続する場合にのみ使用します。ここで、<trust_store_location>は、トラストストア・ファイルのフルパスです。たとえば、-Djavax.net.ssl.trustStore="C:\OracleBI\RTD\etc\ssl\sdtrust.store"と指定します。この場合、<RTD_server_URL>は、https://localhost:9804のようになります。

    4. 他のコマンドライン・パラメータの有無にかかわらず「-help」と入力すると、-helpを含めて、バッチ・コンソールのすべてのコマンドライン・パラメータの使用方法が一覧表示されます。


バッチ・コンソールで対話型コマンドを一覧表示するには、コマンド・プロンプトで「?」を入力します。

command <requiredParam>  -- [alias] Description
 
?                        -- Show this usage text
help                     -- Show this usage text
exit                     -- Terminate this program
quit                     -- Terminate this program
batchNames               -- [bn]      Show all registered Batch
batchDesc <batchName>    -- [bd]      Show Batch Description
paramDesc <batchName>    -- [pd]      Show a batch's Parameter Descriptions
paramDef <batchName>     -- [pdef]    Show a batch's Parameter Default values
addProp <key> <value>    -- [ap]      Add one Property for next job start
removeProp <key>         -- [rp]      Remove one startup Property
showAddedProps           -- [sap]     Show all Added startup Properties
removeAddedProps         -- [rap]     Remove all Added startup Properties
startJob <batchName>     -- [start]   Start a batch job, returning a jobID
startInGroup <batchName> <groupName>
                         -- [startg]  Start a batch job in a Concurrency Group
status <jobID>           -- [sts]     Show a job's detailed runtime Status
activeJobs               -- [jobs]    Show brief status of all running, 
                                      paused, waiting jobs
jobHistory               -- [hist]    Show brief status of all submitted jobs
stopJob <jobID>          -- [stop]    Stop a job, without abililty to resume
stopJobDiscardSandbox <jobID>
                         -- [stopds]  Stop a job, without abililty
                                      to resume, discard learning sandboxes
restartJob <jobID>       -- [restart] Restart a batch job
pauseJob <jobID>         -- [pause]   Pause a job
resumeJob <jobID>        -- [resume]  Resume a paused job
discardStatusAll         -- [dsa]     Discard status information 
                                      for all non-active jobs
discardStatusOld <numToKeep>
                         -- [dso]     Discard Status for oldest non-active jobs
discardStatusName <batchName>
                         -- [dsn]     Discard Status for non-active
                                      jobs of named batch
discardStatusNameOld <batchName> <numToKeep>
                         -- [dsno]    Discard Status for oldest 
                                      non-active jobs of named batch

この項の以降の内容は次のとおりです。

16.3.2.1 バッチ・コンソール・コマンドに関する注意

  1. 登録されているバッチの一覧を取得するには、「bn」または「batchNames」を入力します。

  2. バッチのデフォルト・パラメータ値を取得するには、「paramDef <batchName>」または「pdef <batchName>」を入力します。

    たとえば、バッチに次のパラメータ値が含まれているものと仮定します。

    • sqlCustomers - 処理対象となる顧客を選択するためのパラメータ値

    • rowsBetweenStatusUpdates - バッチ・ステータスの更新頻度を制御するためのパラメータ値

    これらのパラメータのデフォルト値は、次のように指定できます。

    • sqlCustomers = SELECT Id FROM Customers WHERE Id < 300

    • rowsBetweenStatusUpdates = 1000

  3. 次回バッチを起動するときに使用するパラメータ値を指定するには、addPropコマンドまたはその別名のapを使用します。

    たとえば、次のコマンドで、すべての顧客を含むようにsqlCustomersパラメータよりも優先することができます。

    • ap sqlCustomers SELECT Id FROM Customers

    また、顧客を1500人処理するたびにバッチ・ステータスを更新するには、次のコマンドを入力します。

    • ap rowsBetweenStatusUpdates 1500

    このように明示的に追加されたすべてのパラメータは、showAddedPropsコマンドまたはその別名のsapで表示できます。

    たとえば、前述のapコマンドを使用した場合、sap出力は次のようになります。

    Property                       Value
    --------                       -----
    rowsBetweenStatusUpdates       1500
    sqlCustomers                   SELECT Id FROM Customers
    
  4. バッチを開始するには、startJobコマンドまたはその別名のstartを使用します。

    次のような出力が表示されます。

    • batchID=batch-2

    返されるbatchIDjob-IDとも呼ばれ、このジョブ・インスタンスが識別されます。これを使用して、ジョブのステータスに対して問合せができます。

  5. ジョブのランタイム・ステータスを表示するには、そのbatchID値をstatusコマンドまたはその別名のstsに渡します。

    • sts batch-2

    次のような出力が表示されます。

    ID         Name                   State         Rows Errors Restarts 
    --         ----                   -----         ---- ------ -------- 
    batch-2    MyBatchJob1            Running      4,500      0        0 
    
     SubmitDateTime     WaitTime     RunTime      Group    Server
     --------------     --------     ------       -----    ------
     06/24/08-10:25:37  0m, 0s       0m, 0s       Default  RTDServer
    

    しばらくしてからstatusコマンドを実行すると、ジョブが50,000人分の顧客を9分44秒で処理し、エラーを発生することなく終了したことが表示されます。

    ID         Name                   State         Rows Errors Restarts 
    --         ----                   -----         ---- ------ -------- 
    batch-2    MyBatchJob1            Finished    50,000      0        0 
    
     SubmitDateTime     WaitTime     RunTime      Group    Server
     --------------     --------     ------       -----    ------
     06/24/08-10:25:37  0m, 0s       9m, 44s      Default  RTDServer
    

16.3.2.2 ジョブの順次実行

ジョブが発行されて開始すると、並行処理グループに割り当てられます。特に指定がない場合は、Defaultという名前のデフォルト並行処理グループが割り当てられます。同じ並行処理グループ内のジョブは、発行された順に一度に1つずつ順番に実行されます。したがって、1番目のジョブが終了する前に2番目のジョブを開始した場合、2番目のジョブは1番目のジョブが終了するまで待機します。ここでは、MyBatchJob1バッチを開始してから、MyBatchJob2MyBatchJob3のジョブを開始します。MyBatchJob1を開始する前に、sapコマンドを使用して、rowsBetweenStatusUpdatessqlCustomersのパラメータにパラメータ値が設定されていることを確認します。

MyBatchJob1を開始した後、removeAddedPropsコマンド(rap)を使用してこれらのパラメータをクリアします。これによって、次の2つのジョブは、すべてのパラメータでデフォルト値が使用されます。jobsコマンドで、実行中および待機中のジョブのすべてについて簡単なステータスを表示します。1番目のジョブが実行中で、他の2つのジョブが待機中であることが表示されます。

command: batchNames
        MyBatchJob1
        MyBatchJob2
        MyBatchJob3
        MyBatchJob4
        MyBatchJob5
command: showAddedProps
        Property                       Value
        --------                       -----
        rowsBetweenStatusUpdates       1500
        sqlCustomers                   SELECT Id FROM Customers
command: start MyBatchJob1
        batchID=batch-3
command: removeAddedProps
command: start MyBatchJob2
        batchID=batch-4
command: start MyBatchJob3
        batchID=batch-5
command: jobs
  ID         Name          State    Group    Server
  --         ----          -----    -----    ------
  batch-3    MyBatchJob1   Running  Default  RTDServer
  batch-4    MyBatchJob2   Waiting  Default  none
  batch-5    MyBatchJob3   Waiting  Default  none

16.3.2.3 ジョブの並行処理

startInGroupコマンドまたはその別名のstartgを使用すると、ジョブを特定の並行処理グループに割り当てることができます。2つのジョブを別々のグループで開始すると、これらを同時に実行できます。

例:

command: startg MyBatchJob4 myGroup1
        batchID=batch-6
command: startg MyBatchJob5 myGroup2
        batchID=batch-7
command: jobs
  ID         Name           State    Group     Server
  --         ----           -----    -----     ------
  batch-6    MyBatchJob4    Running  myGroup1  RTDServer
  batch-7    MyBatchJob5    Running  myGroup2  RTDServer

注意:

同じ並行処理グループに割り当てられるジョブは異なるサーバー上で実行する場合がありますが、並行して実行できません。異なるグループ内のジョブのみが、並行して実行できます。