| グリッドアプリケーション用のシンプルなAPI | |
|---|---|
| 開発者 | LSUの計算技術センター、ラトガース大学の RADICAL グループ、IN2P3(フランス)、およびアムステルダム自由大学(オランダ) |
| 書かれた | C++、Python、Java |
| プラットフォーム | クロスプラットフォーム |
| タイプ | グリッドコンピューティング、分散コンピューティング ライブラリ |
| ライセンス | Boostソフトウェアライセンス、GPL |
| Webサイト | saga-project.org |
グリッド アプリケーション用のシンプル API ( SAGA )は、共通の分散コンピューティング機能のアプリケーション プログラミング インターフェイス(API)を定義するためにOpen Grid Forumによって指定された関連標準のファミリです。
概要
分散コンピューティングの SAGA 仕様は、もともと 2009 年にリリースされた単一のドキュメント GFD.90 で構成されていました。
SAGA APIは、Globusや類似のグリッドコンピューティング・ミドルウェアシステムの置き換えを目的としたものではなく、ミドルウェア開発者ではなく、グリッドコンピューティングの知識を持たないアプリケーション開発者を対象としています。このような開発者は、通常、自身の目標達成に時間を費やし、インフラストラクチャ機能のコーディングに費やす時間を最小限に抑えたいと考えています。このAPIは、アプリケーション開発者をミドルウェアから隔離します。
サービスの仕様とそれらとやり取りするためのプロトコルは、SAGAの範囲外です。むしろ、APIは、アプリケーション開発者が必要とする機能を実装するために用いられるかどうかに関わらず、サービスインフラストラクチャの詳細を隠蔽することを目指しています。ただし、このAPIはOpen Grid Forum (OGF)のすべてのミドルウェア標準に準拠しています。[1]
SAGA APIは、その適用範囲を拡張する追加APIパッケージを指定するためのメカニズムを定義しました。SAGA Core API自体は、ジョブ管理、ファイル管理、レプリカ管理、リモートプロシージャコール、ストリームといった多数のパッケージを定義しています。SAGAは、最も重要かつ頻繁に使用される分散機能をカバーしており、Extreme Science and Engineering Discovery Environment (XSEDE)、EGI、FutureGridといった主要なグリッドシステムでサポートされ、利用可能です。SAGAは、幅広い分散プログラミングおよびコーディネーションモデルをサポートするだけでなく、新しいミドルウェアにも対応できるよう容易に拡張可能です。[2] [3]
標準化
SAGA APIは、SAGAワーキンググループとOpen Grid Forumで標準化されています。[4] ユースケース [5] 、[6]に基づいて 、SAGAコアAPI仕様[1]は、一般的なAPI原則(「SAGAルックアンドフィール」、および一般的に使用されるグリッドプログラミングパターン(ジョブ管理、ファイル管理とアクセス、レプリカ管理など)をレンダリングするAPIパッケージのセット)を定義します。SAGAコア仕様では、追加のAPIパッケージを定義する方法と、コアAPIおよびその「ルックアンドフィール」と関連する方法も定義しています。これに基づいて、多数のAPI拡張機能が定義されており、標準化プロセスのさまざまな段階にあります。[7] [8] [9] [10]
SAGA仕様はすべてIDL(の一種)で定義されており、オブジェクト指向でありながら言語に依存しません。Java、C++、Pythonなど、様々な言語バインディングが存在しますが、現時点では標準化されていません。しかしながら、これらの言語バインディングの異なる実装は、比較的一貫性のあるAPI定義を持っています(特に、異なるJava実装は同じ抽象APIクラスを共有しています)。
SAGA コア API 仕様の「ルック アンド フィール」の部分は、次の領域をカバーしています。
- セキュリティとセッション管理
- 権限管理
- 非同期操作
- 監視
- 非同期通知
- 属性管理
- I/Oバッファ管理
建築

SAGAはオブジェクト指向インターフェースとして設計されています。関連する機能をオブジェクト群にカプセル化し、それらは機能的名前空間(SAGAではパッケージと呼ばれます)にグループ化されます。SAGAコア実装では、以下のパッケージが定義されています。[11]
- saga::advert -広告サービスへのアクセスのためのインターフェース
- saga::filesystem - ファイルとディレクトリへのアクセスのためのインターフェース
- saga::job - ジョブの定義、管理、制御のためのインターフェース
- saga::namespace - 抽象インターフェース(広告、ファイルシステム、レプリカインターフェースで使用)
- saga::replica -レプリカ管理用のインターフェース
- saga::rpc -リモートプロシージャコールクライアントとサーバーのインターフェース
- saga::sd -分散環境におけるサービス検出のためのインターフェース
- saga::stream - データストリームクライアントとサーバーのインターフェース
SAGAの全体的なアーキテクチャは、あるインターフェースを別のインターフェースに変換するためのソフトウェア設計パターンであるアダプタパターンに準拠しています。SAGAでは、APIパッケージからの呼び出しを基盤となるミドルウェアのインターフェースに変換します。SAGAランタイムシステムは、遅延バインディングを使用して、実行時にどのプラグイン(ミドルウェアアダプタ)をロードしてバインドするかを決定します。[12]
サポートされているミドルウェア
以下の表は、SAGAで現在サポートされている分散ミドルウェアシステムの一覧です。 「アダプタスイート」という列は、ミドルウェアシステムをサポートするミドルウェアアダプタ(のセット)のコレクション(リリースパッケージ)の名前です。
| ミドルウェアシステム | SAGA アダプター スイート | SAGA API 名前空間 |
|---|---|---|
| アマゾンEC2 | saga-adaptors-aws | サガ::ジョブ |
| コンドル | サガアダプターコンドル | サガ::ジョブ |
| ユーカリ | saga-adaptors-aws | サガ::ジョブ |
| Globus GRAM(2と5) | サガアダプターグロバス | サガ::ジョブ |
| グローバスグリッドFTP | サガアダプターグロバス | saga::ファイルシステム |
| グロバスRLS | サガアダプターグロバス | サガ::レプリカ |
| HDFS | saga-adaptors-hdfs | saga::file |
| ローカルファイルシステム | サガコアの一部 | saga::file |
| ローカルフォーク | サガコアの一部 | サガ::ジョブ |
| ニンバス | saga-adaptors-aws | サガ::ジョブ |
| PBS(プロ) | サガアダプターPBS | サガ::ジョブ |
| プラットフォームLSF | サガアダプターLSF | サガ::ジョブ |
| SQL 広告サービス | サガコアの一部 | サガ::広告 |
| SQLレプリカサービス | サガコアの一部 | サガ::レプリカ |
| SSHFS | saga-adaptors-ssh | saga::file |
| SSH | saga-adaptors-ssh | サガ::ジョブ |
| トルク | サガアダプタートルク | サガ::ジョブ |
実装
SAGAインターフェース定義は特定のプログラミング言語に縛られていないため、SAGA標準の実装は様々なプログラミング言語で存在します。実装言語の違いに加え、標準規格の網羅性や分散ミドルウェアのサポート状況もそれぞれ異なります。
サガC++
SAGA C++ [13]は、C++で記述されたSAGA Core仕様の最初の完全な実装でした。現在、C++実装は活発に開発されていません。
RADICAL-SAGA(Python)
RADICAL-SAGA [14]は軽量の Python パッケージで、OGF GFD.90 [1]インターフェース仕様の一部を実装し、さまざまな分散ミドルウェアシステムやサービス用のプラグインを提供しています。RADICAL-SAGA は、広範なユースケース分析に基づいて GFD.90 の最も一般的に使用される機能を実装しており、実際の異機種分散コンピューティング環境やアプリケーションシナリオでの使いやすさと簡単な導入に重点を置いています。RADICAL-SAGA は現在、ジョブとファイル管理のコア API およびリソース管理 API 拡張を実装しています。RADICAL-SAGA は、PBS、Sun Grid Engine、SSH、SFTPなどのサポートを含め、さまざまな分散ミドルウェアシステムやサービス用のプラグインを提供しています。RADICAL-SAGA は、XSEDE、 [15] LONI と FutureGrid、[16]その他のクラウドやローカルクラスターなどの分散サイバーインフラストラクチャ上で実行される分散アプリケーションとフレームワークの開発に使用できます。
JavaSAGA
JavaSAGAはSAGAのJava実装です。JavaSAGAの現状は依然として不透明です。
java.util.io.*をインポートします。
int main ( int argc , char ** argv ) {名前空間sa = saga ::属性;名前空間sja = saga :: job ::属性;
試してください{ saga :: job :: description jd ;
jd.set_attribute ( sja :: description_executable 、"/home/user/hello-mpi" ) ; jd.set_attribute ( sja :: description_output 、"/home/user/hello.out" ) ; jd.set_attribute ( sja:: description_error 、" / home / user /hello.err" ) ;
// これを MPI スタイルのジョブとして宣言します
jd . set_attribute ( sja :: description_spmd_variation , "mpi" );
//使用するキューの名前jd.set_attribute ( sja :: description_queue , " checkpt" ) ; jd.set_attribute ( sja :: description_spmd_variation , "mpi" ); // 要求するプロセッサの数jd.set_attribute ( sja :: description_number_of_processes , " 32 " ) ;
saga :: job :: service js ( "gram://my.globus.host/jobmanager-pbs" ); saga :: job :: job j = js . create_job ( jd );
j . run ()
} catch ( saga :: exception const & e ) { std :: cerr << "SAGA 例外をキャッチしました: " << e . what () << std :: endl ; } }
jSAGA
jSAGA [17]はSAGA Core仕様の別のJava実装である。jSAGAは現在活発に開発が進められている。
デシル
DESHL [18] (DEISA Services for Heterogeneous management Layer) は、 DEISA内での計算ジョブの投入と管理機能を提供します。DESHLは、SAGAに着想を得たJava API上に実装されたコマンドラインツールセットとして実装されています。バックエンドでは、UNICOREシステムの一部である汎用グリッドアクセスクライアントライブラリであるHiLAとインターフェースします。
例
ジョブの送信
分散アプリケーションにおける典型的なタスクは、ローカルまたはリモートの分散リソースマネージャにジョブを送信することです。SAGAは、このためにジョブパッケージと呼ばれる高レベルAPIを提供しています。以下の2つの簡単な例は、SAGAジョブパッケージAPIを使用して、Message Passing Interface (MPI)ジョブをリモートGlobus GRAMリソースマネージャに送信する方法を示しています。
C++
#include <saga/saga.hpp>
int main ( int argc , char ** argv ) {名前空間sa = saga ::属性;名前空間sja = saga :: job ::属性;
試してください{ saga :: job :: description jd ;
jd.set_attribute ( sja :: description_executable 、"/home/user/hello-mpi" ) ; jd.set_attribute ( sja :: description_output 、"/home/user/hello.out" ) ; jd.set_attribute ( sja:: description_error 、" / home / user /hello.err" ) ;
// これを MPI スタイルのジョブとして宣言します
jd . set_attribute ( sja :: description_spmd_variation , "mpi" );
//使用するキューの名前jd.set_attribute ( sja :: description_queue , " checkpt" ) ; jd.set_attribute ( sja :: description_spmd_variation , "mpi" ); // 要求するプロセッサの数jd.set_attribute ( sja :: description_number_of_processes , " 32 " ) ;
saga :: job :: service js ( "gram://my.globus.host/jobmanager-pbs" ); saga :: job :: job j = js . create_job ( jd );
j . run ()
} catch ( saga :: exception const & e ) { std :: cerr << "SAGA 例外をキャッチしました: " << e . what () << std :: endl ; } }
パイソン
#!/usr/bin/env python3
import sys import time import bliss.saga as saga
def main ( jobno : int , session , jobservice ) -> None : bfast_base_dir = saga . Url ( "sftp://india.futuregrid.org/N/u/oweidner/software/bfast/" )
試してください:
workdir = " %s /tmp/run/ %s " % ( bfast_base_dir . path , str ( int ( time . time ())))
basedir = saga . filesystem . Directory ( bfast_base_dir , session = session )
basedir . make_dir ( workdir )
jd = saga . job . Description ()
jd . wall_time_limit = 5 # ウォールタイム(分
) jd . total_cpu_count = 1
jd . environment = { "BFAST_DIR" : bfast_base_dir . path }
jd . working_directory = workdir
jd . executable = "$BFAST_DIR/bin/bfast"
jd . arguments = [ "match" , "-A 1" ,
"-r $BFAST_DIR/data/small/reads_5K/reads.10.fastq" ,
"-f $BFAST_DIR/data/small/reference/hg_2122.fa" ]
myjob = js.create_job ( jd ) myjob.run ( )
print ( "ジョブ番号%s はID ' %s '、作業ディレクトリ: ' %s ' で開始されました"
% ( jobno , myjob . jobid , workdir ))
myjob.wait ( )
print ( " ID ' %s ' のジョブ番号%sが終了しました (RC: %s )。出力は次の場所で利用可能です: ' %s '" % ( jobno , myjob . jobid , myjob . exitcode , workdir ))
basedir . close ()
except saga . Exception , ex :
print ( f "ジョブ実行中にエラーが発生しました: { ex } " )
sys . exit ( - 1 )
if __name__ == "__main__" :
execution_host = saga . Url ( "pbs+ssh://india.futuregrid.org" )
ctx = saga . Context ()
ctx . type = saga . Context . SSH
ctx . userid = "oweidner" # 'ssh username@host ...' と同様
ctx . userkey = "/Users/oweidner/.ssh/rsa_work" # ssh -i ...' と同様
session = saga.Session ( ) session.contexts.append ( ctx )
js = saga.job.Service ( execution_host , session )
iが 範囲( 0 , 4 )の 場合: main ( i , session , js )
助成金
SAGAプロジェクトに関連する研究は、以下の助成金によって資金提供されています:NSF-CHE 1125332(CDI)[19] 、 NSF-EPS 1003897(LaSIGMA)[20] 、 NSF-OCI 1007115(ExTENCI)[21] 。過去の助成金には、NSF-OCI 0710874(HPCOPS)、NIH助成金番号P20RR016456、およびOMII-UK経由のUK EPSRC助成金番号GR/D0766171/1があります[22]。
外部リンク
- SAGA-Bliss - SAGA の Python 実装
- jSAGA - SAGA の Java 実装
- SAGA C++ - SAGA の C++ 実装
- SAGA-GLib - GLib 用の SAGA の Vala 実装
- サガプロジェクト
- POSIX
注記
- ^ abc T. グッデール; S.ジャ; H.カイザー; T. キールマン; P.クライジャー; A.メルツキー。 J. シャルフ; C.スミス。 「グリッド アプリケーション用のシンプルな API (SAGA)」(PDF)。OGFドキュメントシリーズ90。
- ^ SAGA: グリッドアプリケーションのためのシンプルなAPI、グリッド上の高レベルアプリケーションプログラミング Tom Goodale、Shantenu Jha、Harmut Kaiser、Thilo Kielmann、Pascal K leijer、Gregor von Laszewski、Craig Lee、Andre Merzky、Hrabri Rajic、John Shalf Computational Methods in Science and Technology、vol. 12 # 1、2006
- ^ SAGA を使用したアプリケーション レベルでのグリッド相互運用性 Shantenu Jha、Hartmut Kaiser、Andre Merzky、Ole Weidner E-SCIENCE '07: Proceedings of the Third IEEE International Conference on e-Science and Grid Computing (e-Science 2007)、2007 年
- ^ 「概要 - SAGA WG - Open Grid フォーラム」。
- ^ Shantenu Jha、Andre Merzky: "A Collection of Use Cases for a Simple API for Grid Applications"、OGF Informational Document、GFD.70 (pdf)
- ^ Shantenu Jha、Andre Merzky:「グリッドアプリケーションのためのシンプルなAPIの要件分析」、OGF情報文書、GFD.71(pdf)
- ^ Steve Fisher、Anthony Wilson、Arumugam Paventhan: 「SAGA API Extension: Service Discovery API」、OGF 推奨文書、GFD.144 (pdf)
- ^ Andre Merzky: 「SAGA API Extension: Advert API」、OGF 推奨文書、GFD.177 (pdf)
- ^ Andre Merzky: 「SAGA API 拡張: メッセージ API」、OGF 推奨文書、GFD.178 (pdf)
- ^ Steve Fisher、Anthony Wilson:「SAGA API 拡張:情報システムナビゲータ API」、OGF 勧告文書、GFD.195 (pdf)
- ^ 「SAGA C++ リファレンス API (ドキュメント)」。
- ^ 「SAGA:仕組み」www.vimeo.com。
- ^ 「SAGA C++」。
- ^ 「RADICAL-SAGA」.
- ^ 「XSEDEにご興味をお持ちいただきありがとうございます」。
- ^ “FutureGrid”. 2010年11月25日時点のオリジナルよりアーカイブ。
- ^ 「jSAGA」.
- ^ “DESHL”. 2012年6月8日時点のオリジナルよりアーカイブ。
- ^ NSF-CHE 1125332 (CDI)
- ^ NSF-EPS 1003897 (ラシグマ)
- ^ NSF-OCI 1007115 (ExTENCI)
- ^ OMII-UK