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

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: }