Sun N1 Grid Engine 6.1 ユーザーズガイド

第 6 章 Distributed Resource Management Application API による Grid Engine 関数の自動実行

N1 Grid Engine のコマンドを実行し、その結果を解析するスクリプトを作成することによって、N1 Grid Engine の関数を自動実行できます。ただし、より安定した、効率的な結果を得るために、C または Java TM 言語と Distributed Resource Management Application API (DRMAA) を使用できます。この章では DRMAA の概念を紹介し、C および Java 言語での DRMAA の使用方法について説明します。

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

Distributed Resource Management Application API (DRMAA) の概要

Distributed Resource Management Application API (DRMAA、drama に近い発音) は、Distributed Resource Management System (DRMS) でのジョブの発行、監視、および制御を標準化するための Open Grid Forum 仕様です。DRMAA Working Group の目的は、実装が簡単で学びやすく、標準的な方法で DRMS との有用なアプリケーション統合を可能にする API を作成することです。

DRMAA 仕様は、言語、プラットフォーム、および DRMS に依存しません。さまざまな種類のシステムが、DRMAA 仕様を実装できるはずです。特定言語での DRMAA 実装のための追加の手引きとして、DRMAA Working Group は DRMAA 言語バインド仕様もいくつか作成しました。これらの仕様では、各言語で DRMAA 実装を何に似せるべきかを定義しています。

DRMAA 仕様は、現在 version 1.0 です。DRMAA Java Language Binding Specification も version 1.0 であり、DRMAA C Language Binding Specification も同じです。N1 Grid Engine 6.1 は、1.0 Java 言語バインドと 1.0 C 言語バインドの両方の実装を提供するばかりでなく、下位互換性のためのそれぞれの旧バージョンの実装も提供します。DRMAA 1.0 仕様および言語別のバインド仕様については、Open Grid Forum DRMAA Working Group の Web サイトを参照してください。

C 言語バインドを利用した開発

C 言語バインド用の重要ファイル

N1 Grid Engine 6.1 に付属する DRMAA C 言語バインド実装を使用するには、重要なファイルがある場所を知っておく必要があります。もっとも重要なファイルは、C アプリケーションから DRMAA の関数を利用できるようにするために、アプリケーションからインクルードする DRMAA ヘッダーファイルです。DRMAA ヘッダーファイルは、 sge-root/include/drmaa.h にあります。ここで sge-root は、デフォルトで /usr/SGE です。DRMAA 関数の詳細な参照情報については、sge-root/man ディレクトリにある、N1 Grid Engine のマニュアルページの 5 節を参照してください。アプリケーションのコンパイルとリンクでは、 sge-root/lib/arch/libdrmaa.so にある DRMAA 共有ライブラリを使用してください。

DRMAA ヘッダーファイルのインクルード

アプリケーションで DRMAA の関数を使用するには、DRMAA 関数を使用するすべてのソースファイルに DRMAA ヘッダーファイルをインクルードします。ソースファイルに DRMAA ヘッダーファイルをインクルードするには、ソースコードの通常は先頭近くに次の行を追加します。

#include "drmaa.h"

C アプリケーションのコンパイル

DRMAA アプリケーションをコンパイルする場合、コンパイラとリンカーに DRMAA を使用するよう指示するための追加のコンパイラ指令を含める必要があります。次の指示は Sun Studio Compiler Collection と gcc に該当しますが、ほかのコンパイラおよびリンカーには該当しません。ご使用のコンパイラおよびリンカー製品のマニュアルを参照してください。

2 つの指令を含めます。

また、sge-root/lib/arch ディレクトリがライブラリ検索パス (Solaris オペレーティング環境および Linux の場合は LD_LIBRARY_PATH) に含まれていることを確認する必要があります。settings.sh または settings.csh ファイルを使用して環境設定した場合、sge-root/lib/arch ディレクトリは自動的には追加されません。


例 6–1 Sun Studio Compiler による C アプリケーションのコンパイル

Sun Studio Compiler を使用して DRMAA アプリケーションをコンパイルする例を示します。この例は、次のことを前提にしています。

コマンド例は、次のようになります。

% source /sge/default/common/settings.csh
% cc -I/sge/include -ldrmaa app.c

C アプリケーションの実行

コンパイルした DRMAA アプリケーションを実行するには、次のことを確認します。

sge-root/lib/arch ディレクトリがライブラリ検索パス (Solaris オペレーティング環境および Linux の場合は LD_LIBRARY_PATH) に含まれている。settings.sh または settings.csh ファイルを使用して環境設定した場合、sge-root/lib/arch ディレクトリは自動的には追加されません。

N1 Grid Engine 発行ホストであるマシンにログインしている。マシンが N1 Grid Engine 発行ホストでない場合、DRMAA 関数呼び出しはすべて失敗し、「DRMAA_ERRNO_DRM_COMMUNICATION_FAILURE 」が返されます。

ProcedureDRMAA 0.95 C 言語バインドを使用する

デフォルトで有効な DRMAA 共有ライブラリは、version 1.0 の DRMAA C Language Binding Specification をサポートしています。ただし、下位互換性のため、Grid Engine には、version 0.95 の DRMAA C Language Binding Specification の実装も含まれています。すべての新しいアプリケーションは、1.0 の共有ライブラリを使用して開発することを推奨しますが、0.95 の実装を必要とするアプリケーションが見つかることもあります。

version 0.95 の共有ライブラリを有効にする手順は、次のとおりです。

  1. インストールした Grid Engine に対する変更権限を持つユーザーでログインします。


    % su -
  2. sge-root/lib/arch ディレクトリに移動します。


    % cd /sge/lib/sol-sparc64
  3. libdrmaa.so シンボリックリンクを削除します。


    %  rm libdrmaa.so
  4. 0.95 ライブラリへの新しいシンボリックリンクを作成します。


    % ln -s libdrmaa.so.0.95 libdrmaa.so

    Solaris または Linux プラットフォームの場合、共有ライブラリにはバージョン番号のタグが付いています。version 1.0 向けにコンパイルおよびリンクしたアプリケーションで、version 0.95 の共有ライブラリが有効にされている場合、および version 0.95 向けにコンパイルおよびリンクしたアプリケーションで、version 1.0 の共有ライブラリが有効にされている場合は、どちらもライブラリが見つからないというエラーになります。そのほかのプラットフォームの場合、1.0 アプリケーションは 0.95 共有ライブラリを正しく読み込みますが、未知のシンボルが原因でエラーになることがあります。0.95 アプリケーションは 1.0 共有ライブラリを正しく読み込みますが、DRMAA 関数によって予期しないエラーコードが返されて、エラーになる可能性があります。

    • version 1.0 の共有ライブラリに戻すには、手順 1 〜 3 を繰り返し、1.0 ライブラリへの新しいシンボリックリンクを作成します。


      % ln -s libdrmaa.so.1.0 libdrmaa.so

C アプリケーション例

ここでは、C 言語バインドを使用したアプリケーション対話例をいくつか紹介します。Grid Engine Community サイトの「Howtos」セクションでも、そのほかの例を紹介しています。


例 6–2 セッションの開始と停止

次のコードセグメントは、もっとも基本的な DRMAA C バインドプログラムの例です。

DRMAA 関数を呼び出すたびにエラーコードが返されます。何も問題がなければ、コードは DRMAA_ERRNO_SUCCESS になります。エラーが発生すると、そのエラーに応じたエラーコードが返されます。各 DRMAA 関数は少なくとも 2 つのパラメータを取ります。2 つのパラメータは、エラーの場合にエラーメッセージに埋め込む文字列およびエラー文字列の最大の長さを表す整数です。

例の行 8 では、drmaa_init() を呼び出しています。この関数は DRMAA セッションを設定するもので、ほかの大部分の DRMAA 関数の前に呼び出します。drmaa_get_contact () のように、drmaa_init() の前に呼び出せる関数もありますが、これらの関数は一般的な情報を提供するだけです。drmaa_run_job() drmaa_wait() のようにアクションを実行する関数は、drmaa_init() の復帰後に呼び出します。drmaa_init() が復帰する前にこのような関数を呼び出すと、「DRMAA_ERRNO_NO_ACTIVE_SESSION」というエラーコードが返されます。

dmraa_init() 関数はセッションを作成し、イベントクライアントリスナースレッドを開始します。このセッションは DRMAA を使用して発行されたジョブを整理するためのもので、スレッドはジョブの状態およびシステム全般に関する最新情報をキューマスターから受け取ります。drmaa_init() が正しく呼び出されたあと、呼び出し元のアプリケーションは、終了する前に drmaa_exit () の呼び出しも行います。終了する前にアプリケーションが drmaa_exit() を呼び出さないと、キューマスターに無効なイベントクライアントハンドルが残り、キューマスターのパフォーマンスが低下することがあります。

プログラムが終了する行 17 では、drmaa_exit() はセッションをクリーンアップして、イベントクライアントリスナースレッドを停止します。ほかの大部分の DRMAA 関数は、drmaa_exit() の前に呼び出します。drmaa_get_contact() のように、drmaa_exit() のあとで呼び出せる関数もありますが、これらの関数は一般的な情報を提供するだけです。drmaa_run_job() あるいは drmaa_wait() のようにアクションを実行する関数は、drmaa_exit() を呼び出す前にに呼び出します。drmaa_exit() を呼び出したあとでこのような関数を呼び出すと、「DRMAA_ERRNO_NO_ACTIVE_SESSION」というエラーコードが返されます。

01: #include 
02: #include "drmaa.h"
03: 
04: int main(int argc, char **argv) {
05:    char error[DRMAA_ERROR_STRING_BUFFER];
06:    int errnum = 0;
07: 
08:    errnum = drmaa_init(NULL, error, DRMAA_ERROR_STRING_BUFFER);
09: 
10:    if (errnum != DRMAA_ERRNO_SUCCESS) {
11:       fprintf(stderr, "Could not initialize the DRMAA library: %s\n", error);
12:       return 1;
13:    }
14: 
15:    printf("DRMAA library was started successfully\n");
16:    
17:    errnum = drmaa_exit(error, DRMAA_ERROR_STRING_BUFFER);
18: 
19:    if (errnum != DRMAA_ERRNO_SUCCESS) {
20:       fprintf(stderr, "Could not shut down the DRMAA library: %s\n", error);
21:       return 1;
22:    }
23: 
24:    return 0;
25: }


例 6–3 ジョブの実行

次は、DRMAA C バインドを使用して N1 Grid Engine にジョブを発行するコードセグメントの例です。このプログラムの最初と最後は、例 6–2 と同じです。違いは行 16 〜 59 にあります。行 16 では、DRMAA がジョブテンプレートを割り当てています。ジョブテンプレートは、発行するジョブの情報を格納するための構造です。drmaa_run_job() または drmaa_run_bulk_job() の複数の呼び出しでは、同じテンプレートを再利用できます。

行 22 では、DRMAA_REMOTE_COMMAND 属性を設定しています。この属性は、実行するプログラムがある場所を DRMAA に伝えます。この属性の値は、実行可能ファイルへのパスです。パスは相対または絶対のどちらでもかまいません。相対の場合は、DRMAA_WD 属性を基準にしたパスで、デフォルトではユーザーのホームディレクトリです。DRMAA の属性については、drmaa_attributes のマニュアルページを参照してください。このプログラムが動作するには、sleeper.sh スクリプトがデフォルトパスになければなりません。

行 32 では、DRMAA_V_ARGV 属性を設定しています。この属性は、実行可能ファイルに渡す引数を DRMAA に伝えます。DRMAA の属性については、drmaa_attributes のマニュアルページを参照してください。

行 43 の drmaa_run_job() はジョブを発行します。DRMAA は、ジョブに割り当てられた ID を文字配列に書き込み、この配列が drmaa_run_job() に渡されます。これで、ジョブは qsub によって発行されたかのように動作します。この時点で drmaa_exit() を呼び出すか、プログラムを終了しても、ジョブは何の影響も受けません。

クリーンアップするために、行 54 でジョブテンプレートが削除されます。これによって、ジョブテンプレート用に DRMAA が確保していたメモリーが解放されますが、発行されたジョブは何の影響も受けません。

最後に、行 61 で drmaa_exit() が呼び出されています。drmaa_exit() の呼び出しは、行 18 から始まっていた if 構造の外側にあります。これは、 drmaa_init() が呼び出されたあと、ほかのコマンドが成功したかどうかに関係なく、終了する前に drmaa_exit() を呼び出さなければならないためです。

01: #include 
02: #include "drmaa.h"
03: 
04: int main(int argc, char **argv) {
05:    char error[DRMAA_ERROR_STRING_BUFFER];
06:    int errnum = 0;
07:    drmaa_job_template_t *jt = NULL;
08: 
09:    errnum = drmaa_init(NULL, error, DRMAA_ERROR_STRING_BUFFER);
10: 
11:    if (errnum != DRMAA_ERRNO_SUCCESS) {
12:       fprintf(stderr, "Could not initialize the DRMAA library: %s\n", error);
13:       return 1;
14:    }
15: 
16:    errnum = drmaa_allocate_job_template(&jt, error, DRMAA_ERROR_STRING_BUFFER);
17: 
18:    if (errnum != DRMAA_ERRNO_SUCCESS) {
19:       fprintf(stderr, "Could not create job template: %s\n", error);
20:    }
21:    else {
22:       errnum = drmaa_set_attribute(jt, DRMAA_REMOTE_COMMAND, "sleeper.sh",
23:                                     error, DRMAA_ERROR_STRING_BUFFER);
24: 
25:       if (errnum != DRMAA_ERRNO_SUCCESS) {
26:          fprintf(stderr, "Could not set attribute \"%s\": %s\n",
27:                   DRMAA_REMOTE_COMMAND, error);
28:       }
29:       else {
30:          const char *args[2] = {"5", NULL};
31:          
32:          errnum = drmaa_set_vector_attribute(jt, DRMAA_V_ARGV, args, error,
33:                                               DRMAA_ERROR_STRING_BUFFER);
34:       }
35:       
36:       if (errnum != DRMAA_ERRNO_SUCCESS) {
37:          fprintf(stderr, "Could not set attribute \"%s\": %s\n",
38:                   DRMAA_REMOTE_COMMAND, error);
39:       }
40:       else {
41:          char jobid[DRMAA_JOBNAME_BUFFER];
42: 
43:          errnum = drmaa_run_job(jobid, DRMAA_JOBNAME_BUFFER, jt, error,
44:                                  DRMAA_ERROR_STRING_BUFFER);
45: 
46:          if (errnum != DRMAA_ERRNO_SUCCESS) {
47:             fprintf(stderr, "Could not submit job: %s\n", error);
48:          }
49:          else {
50:             printf("Your job has been submitted with id %s\n", jobid);
51:          }
52:       } /* else */
53: 
54:       errnum = drmaa_delete_job_template(jt, error, DRMAA_ERROR_STRING_BUFFER);
55: 
56:       if (errnum != DRMAA_ERRNO_SUCCESS) {
57:          fprintf(stderr, "Could not delete job template: %s\n", error);
58:       }
59:    } /* else */
60: 
61:    errnum = drmaa_exit(error, DRMAA_ERROR_STRING_BUFFER);
62: 
63:    if (errnum != DRMAA_ERRNO_SUCCESS) {
64:       fprintf(stderr, "Could not shut down the DRMAA library: %s\n", error);
65:       return 1;
66:    }
67: 
68:    return 0;
69: }

Java 言語バインドを利用した開発

Java 言語バインド用の重要ファイル

N1 Grid Engine 6.1 に付属する DRMAA Java 言語バインド実装を使用するには、重要なファイルがある場所を知っておく必要があります。もっとも重要なファイルは DRMAA JAR ファイルの sge-root/lib/drmaa.jar です。DRMAA アプリケーションをコンパイルするには、CLASSPATH にこの DRMAA JAR ファイルを含めます。DRMAA クラスについては、sge-root/doc/javadocs ディレクトリにある DRMAA Javadoc TM で解説しています。この Javadoc にアクセスするには、ブラウザで sge-root/doc/javadocs/index.html ファイルを開いてください。アプリケーションを実行する準備ができたら、必須のネイティブルーチンを提供する DRMAA 共有ライブラリの sge-root/lib/arch/libdrmaa.so も必要です。

DRMAA Java クラスとパッケージのインポート

アプリケーションで DRMAA クラスを使用するには、DRMAA クラスまたはパッケージをインポートします。たいていの場合、使用されるのは org.ggf.drmaa パッケージ内のクラスだけです。これらのパッケージは、個別にインポートすることも、ワイルドカードを使用してインポートすることもできます。めったにありませんが、com.sun.grid.drmaa にある N1 Grid Engine DRMAA 実装クラスへの参照が必要になることがあります。この場合は、クラスを個別にインポートすることも、特定パッケージ内のすべてのクラスをインポートすることもできます。com.sun.grid.drmaa クラスの名前は org.ggf.drmaa クラスの名前と重複していないため、名前空間の衝突を生むことなく両方のパッケージをインポートできます。

Java アプリケーションのコンパイル

DRMAA アプリケーションをコンパイルするには、CLASSPATH sge-root/lib/drmaa.jar ファイルを追加します。settings.sh または settings.csh ファイルを使用して環境設定した場合、drmaa.jar ファイルは自動的には追加されません。

ProcedureNetBeans 5.x で DRMAA を使用する

NetBeans 5.0 または 5.5 プロジェクトで DRMAA クラスを使用する手順は、次のとおりです。

  1. プロジェクトノードでマウスボタン 3 をクリックし、「プロパティー」を選択します。

  2. プロジェクトで新しく構築ファイルを生成するか、または既存のファイルを使用するかを決めます。

    • プロジェクトで生成した構築ファイルを使用する場合は、次を実行します。

      1. 左の列にある「ライブラリ」を選択します。

      2. 「ライブラリを追加」をクリックします。

      3. 「ライブラリ」ダイアログボックスで「ライブラリを管理」をクリックします。

      4. 「ライブラリの管理」ダイアログボックスで「新規ライブラリ」をクリックします。

      5. 「新規ライブラリ」ダイアログボックスの「ライブラリ名」フィールドに DRMAA と入力します。

      6. 「了解」をクリックして、「新規ライブラリ」ダイアログボックスを閉じます。

      7. 「JAR/フォルダを追加」をクリックします。

      8. ファイル選択ダイアログボックスで sge-root/lib ディレクトリに移動し、drmaa.jar ファイルを選択します。

      9. 「JAR/フォルダを追加」をクリックして、ファイル選択ダイアログボックスを閉じます。

      10. 「了解」をクリックして、「ライブラリの管理」ダイアログボックスを閉じます。

      11. DRMAA ライブラリを選択し、「ライブラリを追加」をクリックして、「ライブラリ」ダイアログボックスを閉じます。

    • プロジェクトで既存の構築ファイルを使用する場合は、次を実行します。

      1. 左の列にある「Java ソースのクラスパス」を選択します。

      2. 「JAR/フォルダを追加」をクリックします。

      3. ファイル選択ダイアログボックスで sge-root/lib ディレクトリに移動し、drmaa.jar ファイルを選択します。

      4. 「選択」をクリックして、ファイル選択ダイアログボックスを閉じます。

  3. 「了解」をクリックしてプロパティーダイアログボックスを閉じます。

  4. DRMAA 共有ライブラリがライブラリ検索パスに含まれていることを確認します。

    NetBeans からアプリケーションを実行するには、DRMAA 共有ライブラリファイルの sge-root/lib/ arch/libdrmaa.so がライブラリ検索パス (Solaris オペレーティング環境および Linux の場合は LD_LIBRARY_PATH) に含まれていなければなりません。settings.sh または settings.csh ファイルを使用して環境設定した場合、sge-root/lib/arch ディレクトリは自動的には追加されません。共有ライブラリのパスを設定するには、次のいずれかを実行します。

    • NetBeans を起動する前にシェルで環境設定します。

    • 次のように、netbeans-root/etc/netbeans.conf ファイルに追加して環境設定します。

      # Setup environment for SGE
      . <sge-root>/<sge_cell>/common/settings.sh
      ARCH=`$SGE_ROOT/util/arch`
      LD_LIBRARY_PATH=$SGE_ROOT/lib/$ARCH; export LD_LIBRARY_PATH

Java アプリケーションの実行

コンパイルした DRMAA アプリケーションを実行するには、次のことを確認します。

DRMAA 0.5 Java 言語バインドの利用

デフォルトで使用される DRMAA 共有ライブラリは、version 1.0 の DRMAA Java Language Binding Specification をサポートしています。ただし、下位互換性のため、N1 Grid Engine には version 0.5 の DRMAA Java Language Binding Specification の実装も含まれています。すべての新しいアプリケーションは、1.0 の共有ライブラリを使用して開発することを推奨しますが、0.5 実装を必要とするアプリケーションが見つかることもあります。

version 0.5 の drmaa.jar ファイルを使用するには、通常の sge-root/lib/drmaa.jar の前に、またはこのファイルの代わりに sge-root/lib/drmaa-0.5.jar ファイルを CLASSPATH に追加します。また、0.5 Java 言語バインドは、0.95 C 言語バインドの有効化を必要とします。「DRMAA 0.95 C 言語バインドを使用する」を参照してください。

Java アプリケーション例

ここでは、Java 言語バインドを使用するアプリケーション対話例をいくつか紹介します。Grid Engine Community サイトの「Howtos」セクションでも、そのほかの例を紹介しています。


例 6–4 セッションの開始と停止

次のコードセグメントは、もっとも基本的な DRMAA Java バインドプログラムの例です。

プログラマが DRMAA を使用して行うことのすべては、Session オブジェクトを介して行います。Session オブジェクトは、SessionFactory から取得します。SessionFactory は、静的な SessionFactory.getFactory() メソッドから取得します。この連鎖の理由は、すべての org.ggf.drmaa.* クラスが、あらゆる DRMAA Java 言語バインド実装によって使用される不変のパッケージとみなされるべきであるためです。パッケージが不変であるため、特定の実装を読み込む際、SessionFactory はシステムプロパティーを使用して、その実装のセッションファクトリを探し、読み込みます。そして、このセッションファクトリが、適当とみなす方法でセッションを作成します。セッションファクトリが存在するとしても、一度に存在できるセッションは 1 つだけであることに注意してください。

行 9 の SessionFactory.getFactory() はセッションファクトリインスタンスを取得します。行 10 の SessionFactory.getSession () はセッションインスタンスを取得します。行 13 の Session.init () はセッションを初期化します。"" は、初期化引数が必要ないため、新しいセッションを作成するための連絡文字列として渡されます。

Session.init() はセッションを作成し、イベントクライアントリスナースレッドの実行を開始します。このセッションは DRMAA を使用して発行されたジョブを整理するためのもので、スレッドはジョブの状態およびシステム全般に関する最新情報をキューマスターから受け取ります。Session.init() が正しく呼び出されたあと、呼び出し元アプリケーションは、終了する前に Session.()exit() の呼び出しも行います。終了する前にアプリケーションが Session.()exit() を呼び出さないと、キューマスターに無効なイベントクライアントハンドルが残り、キューマスターのパフォーマンスが低下することがあります。Session.()exit() が呼び出されていることを確認するには、Runtime.addShutdownHook() メソッドを使用します。exit() gets called.

プログラムの終了時の 行 14 の Session.()exit() は、セッションのクリーンアップをして、イベントクライアントリスナースレッドを停止します。ほかの大部分の DRMAA メソッドは、Session.()exit() の前に呼び出します。Session.getContact() のように、Session.()exit() の後で呼び出せる関数もありますが、これら関数は一般的な情報を提供するだけです。Session.runJob() または Session.()wait() のようにアクションを実行する関数は、Session.()exit() を呼び出す前に呼び出します。Session.()exit() を呼び出したあとでこのような関数を呼び出すと、「NoActiveSessionException」がスローされます。

01: package com.sun.grid.drmaa.howto;
02:
03: import org.ggf.drmaa.DrmaaException;
04: import org.ggf.drmaa.Session;
05: import org.ggf.drmaa.SessionFactory;
06:
07: public class Howto1 {
08:    public static void main(String[] args) {
09:       SessionFactory factory = SessionFactory.getFactory();
10:       Session session = factory.getSession();
11:
12:       try {
13:          session.init("");
14:          session.exit();
15:       } catch (DrmaaException e) {
16:          System.out.println("Error: " + e.getMessage());
17:       }
18:    }
19: }


例 6–5 ジョブの実行

次は、DRMAA Java 言語バインドを使用して N1 Grid Engine にジョブを発行するコードセグメントの例です。このプログラムの最初と最後は、例 6–4 と同じです。違いは行 16 〜 24 にあります。

行 16 では、DRMAA がジョブテンプレートを割り当てています。ジョブテンプレートは、発行するジョブの情報を格納するためのオブジェクトです。Session.runJob () または Session.runBulkJobs() の複数の呼び出しでは、同じテンプレートを再利用できます。

行 17 では、remoteCommand 属性を設定しています。この属性は、実行するプログラムがある場所を DRMAA に伝えます。この属性の値は、実行可能ファイルへのパスです。パスは相対または絶対のどちらでもかまいません。相対の場合は、workingDirectory 属性を基準にしたパスで、デフォルトではユーザーのホームディレクトリです。DRMAA の属性については、DRMAA Javadoc または drmaa_attributes のマニュアルページを参照してください。このプログラムが動作するには、sleeper.sh スクリプトがデフォルトパスになければなりません。

行 18 では、args 属性を設定しています。この属性は、実行可能ファイルに渡す引数を DRMAA に伝えます。DRMAA の属性については、DRMAA Javadoc または drmaa_attributes のマニュアルページを参照してください。

行 20 の Session.runJob() はジョブを発行します。このメソッドは、キューマスターがジョブに割り当てた ID を返します。これで、ジョブは qsub によって発行されたかのように動作します。この時点で Session.()exit() を呼び出すか、プログラムを終了しても、ジョブは何の影響も受けません。

クリーンアップするために、行 24 でジョブテンプレートが削除されます。これによって、ジョブテンプレート用に DRMAA が確保していたメモリーが解放されますが、発行されたジョブは何の影響も受けません。

01: package com.sun.grid.drmaa.howto;
02:
03: import java.util.Collections;
04: import org.ggf.drmaa.DrmaaException;
05: import org.ggf.drmaa.JobTemplate;
06: import org.ggf.drmaa.Session;
07: import org.ggf.drmaa.SessionFactory;
08:
09: public class Howto2 {
10:    public static void main(String[] args) {
11:       SessionFactory factory = SessionFactory.getFactory();
12:       Session session = factory.getSession();
13:
14:       try {
15:          session.init("");
16:          JobTemplate jt = session.createJobTemplate();
17:          jt.setRemoteCommand("sleeper.sh");
18:          jt.setArgs(Collections.singletonList("5"));
19:
20:          String id = session.runJob(jt);
21:
22:          System.out.println("Your job has been submitted with id " + id);
23:
24:          session.deleteJobTemplate(jt);
25:          session.exit();
26:       } catch (DrmaaException e) {
27:          System.out.println("Error: " + e.getMessage());
28:       }
29:    }
30: }