Content deleted Content added
Malcolmxl5 (talk | contribs) removed merge tag. |
ShelfSkewed (talk | contribs) Edited disambig hatnote |
||
(43 intermediate revisions by 33 users not shown) | |||
Line 1:
{{Short description|Grid computing application programming interface}}
{{Redirect|SAGA (computing)||Saga (disambiguation)#Computing}}
{{Infobox software
| logo = [[File:Logo saga.png|220px|SAGA C++/Python logo]]
| screenshot =
| developer = [[Center for Computation and Technology]] at [[Louisiana State University|LSU]], [http://radical.rutgers.edu/ RADICAL Group] at [[Rutgers University]], [http://www.in2p3.fr/ IN2P3 (France)], and [http://www.vu.nl/ Vrije Universiteit (Amsterdam,
| programming language = [[C++]], [[Python (programming language)|Python]], [[Java (programming language)|Java]]
| platform = [[Cross-platform]]
| genre = [[Grid computing]], [[distributed computing]] [[library (computing)|library]]
Line 18 ⟶ 12:
}}
The '''Simple API for Grid Applications''' ('''SAGA''') is a family of related standards specified by the [[Open Grid Forum]] to define an [[application programming interface]] (API) for common [[distributed computing]] functionality.
== Overview ==
The SAGA specification for distributed computing originally consisted of a single document, GFD.90, which was released in 2009.
The SAGA [[API]] does not strive to replace Globus or similar [[grid computing]] middleware systems, and does not target middleware developers, but application developers with no background on grid computing. Such developers typically wish to devote their time to their own goals and minimize the time spent coding infrastructure functionality. The API insulates application developers from middleware.
The specification of services, and the protocols to interact with them, is out of the scope of SAGA. Rather, the API seeks to hide the detail of any service infrastructures that may or may not be used to implement the functionality that the application developer needs. The API aligns, however, with all middleware standards within [[Open Grid Forum]] (OGF).<ref name="gdf90">{{Cite journal | author1=T. Goodale
The 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</ref>
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</ref>
== Standardization ==
The SAGA API is standardised in the SAGA Working Group the [[Open Grid Forum]].<ref>{{cite web | url=http://redmine.ogf.org/projects/saga-wg | title=Overview - SAGA WG - Open Grid Forum }}</ref>
<ref>Shantenu Jha, Andre Merzky: "A Collection of Use Cases for a Simple API for Grid Applications", OGF Informational Document, [http://www.ogf.org/documents/GFD.70.pdf GFD.70 (pdf)]</ref>
,<ref>Shantenu Jha, Andre Merzky: "A Requirements Analysis for a Simple API for Grid Applications", OGF Informational Document, [http://www.ogf.org/documents/GFD.71.pdf GFD.71 (pdf)]</ref>
the SAGA Core API specification<ref
All SAGA specifications are defined in (a flavor of) [[
The 'Look and Feel' part of the SAGA Core API specification covers the following areas:
Line 58 ⟶ 48:
[[File:SAGA Architecture.png|thumb|236px|The SAGA C++/Python architecture: a light-weight [[run-time system|runtime system]] dispatches API calls from the application to the [[middleware]] through a set of [[plug-in (computing)|plug-ins]] or ''adaptors''.]]
SAGA is designed as an [[Object-oriented programming|object oriented]] interface. It encapsulates related functionality in a set of objects, that are grouped in functional [[namespace]]s, which are called ''packages'' in SAGA. The SAGA core implementation defines the following packages:<ref>{{Cite web | title=The SAGA C++ Reference API (Documentation)
* saga::advert - interface for [[Advert Service]] access
Line 69 ⟶ 59:
* saga::stream - interface for data stream client and servers
The overall architecture of SAGA follows the [[adaptor pattern]], a [[software design pattern]] which is used for translating one interface into another. In SAGA it translates the calls from the API packages to the interfaces of the underlying middleware. The SAGA run-time system uses [[late binding]] to decide at [[program lifecycle phase|run-time]] which [[plug-in (computing)|plug-in]] (''middleware adaptor'') to load and bind.<ref>{{Cite web | title=SAGA: How it works|
== Supported middleware ==
Line 81 ⟶ 70:
| [[Amazon EC2]] || saga-adaptors-aws || saga::job
|-
| [[Condor High-Throughput Computing System
|-
| [[Eucalyptus (computing)|Eucalyptus]] || saga-adaptors-aws || saga::job
|-
|
|-
| Globus [[GridFTP]] || saga-adaptors-globus || saga::filesystem
Line 114 ⟶ 103:
|}
== Implementations ==
Since the SAGA interface definitions are not bound to any specific programming language, several implementations of the SAGA standards exist in different programming languages. Apart from the implementation language, they differ from each other in their completeness in terms of standard coverage, as well as in their support for distributed middleware.
=== SAGA C++ ===
===
=== JavaSAGA ===
JavaSAGA is a Java implementation of SAGA. This status of JavaSAGA remains uncertain.
<syntaxhighlight lang="java">
import java.util.io.*
int main (int argc, char** argv)
{
namespace sa = saga::attributes;
namespace sja = saga::job::attributes;
try
{
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");
// Declare this as an MPI-style job
jd.set_attribute (sja::description_spmd_variation, "mpi");
// Name of the queue we want to use
jd.set_attribute (sja::description_queue, "checkpt");
jd.set_attribute (sja::description_spmd_variation, "mpi");
// Number of processors to request
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 exception caught: " << e.what() << std::endl;
}
}
</syntaxhighlight>
=== jSAGA ===
=== DESHL ===
The
== Examples ==
Line 144 ⟶ 167:
===Job submission===
A typical task in a distributed application is to submit a ''job'' to a local or remote [[distributed resource manager]]. SAGA provides a high-level API called the ''job package'' for this. The following two simple examples show how the SAGA job package API can be used to submit a [[Message Passing Interface]] (MPI) job to a remote Globus GRAM resource manager.
<
#include <saga/saga.hpp>
Line 183 ⟶ 206:
}
</syntaxhighlight>
<
#!/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/")
try:
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 # wall-time in minutes
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("Job #%s started with ID '%s' and working directory: '%s'"
% (jobno, myjob.jobid, workdir))
myjob.wait()
print("Job #%s with ID '%s' finished (RC: %s). Output available in: '%s'"
% (jobno, myjob.jobid, myjob.exitcode, workdir))
basedir.close()
except saga.Exception, ex:
print(f"An error occurred during job execution: {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" # like 'ssh username@host ...'
ctx.userkey = "/Users/oweidner/.ssh/rsa_work" # like ssh -i ...'
session = saga.Session()
session.contexts.append(ctx)
js = saga.job.Service(execution_host, session)
for i in range(0, 4):
main(i, session, js)
</syntaxhighlight>
== Grants ==
The work related to the SAGA Project is funded by the following grants: NSF-CHE 1125332 (CDI),<ref>[https://archive.today/20121212073028/http://nsf.rutgers.edu/2011/12/title-cdi-type-ii-mapping-complex.html NSF-CHE 1125332 (CDI)]
== External links ==
* [https://saga-project.github.com/bliss/ SAGA-Bliss - A Python implementation of SAGA]
* [http://grid.in2p3.fr/jsaga/ jSAGA - A Java implementation of SAGA]
* [
* [
* [https://saga-project.github.com/ SAGA PROJECT]
* [[POSIX]]
== Notes ==
{{reflist}}
[[Category:Grid computing]]
|