Oracle® Fusion Middleware Oracle Real-Time Decisionsプラットフォーム開発者ガイド 11g リリース1 (11.1.1) B72429-01 |
|
前 |
次 |
Oracle RTDバッチ・フレームワークは、インライン・サービスでバッチ機能を実現できるコンポーネントのセットです。これにより、インライン・サービスで対話型統合点リクエストの処理に使用できるだけでなく、あらゆる種類のバッチ操作も実行できます。この章では、バッチ・フレームワークのアーキテクチャと、バッチ・ジョブを実装および管理する方法について説明します。
一般的に、バッチでは、データベース表、フラット・ファイルまたはスプレッドシートから一連の入力行を読み取り、各入力行を順番に処理し、必要に応じて入力行ごとに1行以上の行を出力表に書き込みます。
非対話型の設定でOracle RTDのバッチ処理機能を使用する例を、次に簡単に示します。
顧客に以前に提示したオファーの効果に関する履歴データから学習してモデルを最適化するために、学習バッチを作成する例
顧客のセットから開始して、各顧客へのオファーに最適な製品を選択するように、オファー選択バッチを作成する例
単一の製品から開始して、その製品のオファー対象として最適な顧客を選択するように、顧客選択バッチを作成する例
Oracle RTDで電子メール用に適切な内容を選択するように、電子メールのバッチ・セットを作成する例
インライン・サービスでは、インライン・サービスの開発者が、BatchJob
インタフェースを実装するJavaクラスを1つ以上定義します。BatchJob
は、インライン・サービスでサポートする名前付きバッチごとに1つ使用します。インライン・サービスで、BatchJob
の各実装をOracle RTDバッチ・フレームワークに登録することで、使用可能なジョブ・タイプが外部のバッチ管理アプリケーションで開始できるようになります。外部アプリケーションは、バッチ・フレームワークで用意されているBatchAdminClientクラスを介して、登録されているバッチ・ジョブの開始、停止およびステータスの問合せができます。Oracle RTDに付属のバッチ・コンソールは、このようなバッチ関連管理作業を実行できるコマンドライン・ユーティリティです。
注意: Oracle RTDドキュメント全体にわたって次の用語が参照されます。
詳細は、『Oracle Fusion Middleware Oracle Real-Time Decisions管理者ガイド』の「Oracle RTDラインタイム環境について」を参照してください。 |
この章の内容は次のとおりです。
この項では、バッチ・フレームワーク・アーキテクチャのコンポーネントの概要を示し、複数のクラスタ・サーバー全体でバッチ機能を使用する方法について説明します。
次の図は、単一のOracle RTDインスタンスにおけるバッチ・フレームワーク・アーキテクチャのコンポーネントを示しています。
バッチ・フレームワークの主要コンポーネントとその機能は、次のとおりです。
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リクエストを制御します。
次の図は、クラスタ環境内でのバッチ・フレームワークの使用例を示しています。
バッチ・コンソールなどのバッチ・クライアント・アプリケーションは、ジョブの開始、停止、一時停止などのバッチ管理コマンドを起動することでBatch Managerと通信します。
デシジョン・スタジオを使用している開発者は、インライン・サービスを作成し、Oracle RTDがインストールされているインスタンス(クラスタ・サーバー2のインスタンスなど)に、バッチでインライン・サービスをデプロイできます。
注意: クラスタ環境では、Decision Serviceを実行しているすべてのサーバーにインライン・サービスがデプロイされます。 |
この図では、クラスタ・サーバー2インスタンス上のBatch Agentが、Batch Managerにバッチを登録しています。
Batch Managerは、登録済のバッチ・ジョブを、クラスタ・サーバー3など、任意のインスタンスで実行できます。
この項では、バッチを実装するために必要なランタイム・オブジェクト・モデルの概要を説明します。
インライン・サービスがバッチ対応であるためには、BatchJob
インタフェースを実装するバッチ・ジョブ用Javaクラスが1つ以上必要であり、これをバッチ・フレームワークに登録する必要があります。
注意: この項の例は、Oracle RTDとともにリリースされるCrossSellインライン・サービスを参照しています。これには、CrossSellSelectOffersバッチ・ジョブが含まれています。 |
この項には、次の項目が含まれます。
デシジョン・スタジオでのバッチ・ジョブの実装は、BatchJob
インタフェースを実装するJavaクラスを作成することで開始します。
最初に、インライン・サービスのsrc
ブランチの下に、Javaパッケージおよびクラスを作成します。
次の図は、バッチ処理用JavaクラスのOfferSelectJob.java
を示しています。これはcrosssell.batch
パッケージで宣言されています。
Javaクラスを作成する最も簡単な方法は、バッチ・フレームワークで用意されているBatchJobBase
からサブクラス化する方法です。
ジョブが開始すると、バッチ・ジョブの主要メソッドが次の順序でコールされます。
init()
バッチの処理ループを開始する前に、フレームワークによって1回コールされます。
getNextInput()
バッチで処理される次の入力行を返します。
executeRow()
BatchJobではこのメソッドを実装することで、getNextInput
によって返された入力行を処理します。通常は、getNextInput
とは異なるスレッドでコールされます。
flushOutputs()
フレームワークによってコールされ、BatchJobではその出力表バッファをフラッシュできます。
cleanup()
バッチの終了後や停止後に、フレームワークによってコールされます。init()
メソッドによって作成された結果セットなど、バッチ・ジョブによって割り当てられたリソースをクリーンアップします。
BatchJob
インタフェースのメソッドの詳細は、次のJavadocエントリを参照してください。
RTD_HOME
\client\Batch\javadocs\com\sigmadynamics\batch
\BatchJob.html
サンプルのバッチ・ジョブ
サンプルのバッチ・ジョブであるOfferSelectJob.java
は、Oracle RTDとともにリリースされるCrossSellインライン・サービスにあります。このバッチ・ジョブは、顧客のセットに対して最適なオファーを選択し、そのオファーを表に保存します。
この項では、Oracle RTDバッチ・フレームワークにバッチ・ジョブを登録する方法について説明します。バッチ・ジョブを含むJavaクラスを、インポートされたJavaクラスとして登録してから、batchAgent.registerBatch
メソッドを使用してバッチ・ジョブをバッチ・フレームワークに明示的に登録する必要があります。
この項には、次の項目が含まれます。
バッチ・ジョブにおいて、Batch Agentは、バッチ・ジョブとバッチ・フレームワークとの間のインタフェースです。バッチ・ジョブはバッチ・フレームワークに登録する必要があります。
インライン・サービスは、そのアプリケーション・オブジェクトの「ロジック」にあるゲッターを介して、Batch Agentを指定できます。たとえば、インライン・サービスがセッションにアクセスできるコンテキストでは、次のコマンドを使用してBatchAgentにアクセスできます。
BatchAgent batchAgent = session().getApp().getBatchAgent();
次に示すように、Javaクラスをインライン・サービスに登録する必要があります。
アプリケーション・オブジェクトの「詳細」ボタンをクリックします。
「インポートしたJavaクラス」ペインで、インライン・サービスのバッチ・ジョブ・クラスごとに次の形式で行を入力します。
<package>
.<class>
例:
crosssell.batch.OfferSelectJob
インライン・サービスは、アプリケーションの「ロジック」タブの「初期化ロジック」ペインで、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);
バッチの開始と停止、ステータスの問合せなど、バッチ・ジョブを管理する場合の中心となる方法は、コマンドライン・ユーティリティのバッチ・コンソールを使用する方法です。
このユーティリティでは、BatchAdminClient
Javaインタフェースを使用しています。BatchAdminClient
Javaインタフェースには、バッチの開始や管理を行うためのメソッドも含まれており、これらのメソッドは外部プログラムで使用します。
この項には次のトピックが含まれます:
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
バッチ・コンソールは、batch-console.jar
というコマンドライン・ユーティリティです。バッチの開始、停止およびステータスの問合せを行うには、バッチ・コンソールを使用します。
バッチ・コンソールを起動するには、次のコマンドを実行します。
cd
BATCH_HOME
通常、BATCH_HOME
はC:\OracleBI\RTD\client\Batch
です。
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]
注意:
|
バッチ・コンソールで対話型コマンドを一覧表示するには、コマンド・プロンプトで「?」を入力します。
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
この項の以降の内容は次のとおりです。
登録されているバッチの一覧を取得するには、「bn
」または「batchNames
」を入力します。
バッチのデフォルト・パラメータ値を取得するには、「paramDef <batchName>
」または「pdef <batchName>
」を入力します。
たとえば、バッチに次のパラメータ値が含まれているものと仮定します。
sqlCustomers
- 処理対象となる顧客を選択するためのパラメータ値
rowsBetweenStatusUpdates
- バッチ・ステータスの更新頻度を制御するためのパラメータ値
これらのパラメータのデフォルト値は、次のように指定できます。
sqlCustomers = SELECT Id FROM Customers WHERE Id < 300
rowsBetweenStatusUpdates = 1000
次回バッチを起動するときに使用するパラメータ値を指定するには、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
バッチを開始するには、startJob
コマンドまたはその別名のstart
を使用します。
次のような出力が表示されます。
batchID=batch-2
返されるbatchID
はjob-ID
とも呼ばれ、このジョブ・インスタンスが識別されます。これを使用して、ジョブのステータスに対して問合せができます。
ジョブのランタイム・ステータスを表示するには、その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
ジョブが発行されて開始すると、並行処理グループに割り当てられます。特に指定がない場合は、Defaultという名前のデフォルト並行処理グループが割り当てられます。同じ並行処理グループ内のジョブは、発行された順に一度に1つずつ順番に実行されます。したがって、1番目のジョブが終了する前に2番目のジョブを開始した場合、2番目のジョブは1番目のジョブが終了するまで待機します。ここでは、MyBatchJob1
バッチを開始してから、MyBatchJob2
とMyBatchJob3
のジョブを開始します。MyBatchJob1
を開始する前に、sap
コマンドを使用して、rowsBetweenStatusUpdates
とsqlCustomers
のパラメータにパラメータ値が設定されていることを確認します。
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
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
注意: 同じ並行処理グループに割り当てられるジョブは異なるサーバー上で実行する場合がありますが、並行して実行できません。異なるグループ内のジョブのみが、並行して実行できます。 |