neptune 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README +13 -1
- data/lib/neptune.rb +89 -2
- metadata +5 -5
data/README
CHANGED
@@ -3,7 +3,7 @@ Neptune: A Domain Specific Language for Deploying HPC
|
|
3
3
|
Software on Cloud Platforms
|
4
4
|
|
5
5
|
Neptune provides programmers with a simple interface
|
6
|
-
by which they can deploy MPI, X10, and
|
6
|
+
by which they can deploy MPI, X10, MapReduce, UPC, and Erlang jobs
|
7
7
|
to without needing to know the particulars of the underlying
|
8
8
|
cloud platform. You only need to give Neptune your code,
|
9
9
|
tell it how many machines to run on and where to put the output:
|
@@ -28,6 +28,10 @@ in it! Neptune will run 'make' on it (you can specify which target
|
|
28
28
|
to make as well) and return to you a folder containing the standard
|
29
29
|
out and standard error of the make command.
|
30
30
|
|
31
|
+
By default, Neptune jobs store their outputs in the underlying database
|
32
|
+
that AppScale is running over. As of Neptune 0.0.5, job outputs can
|
33
|
+
also be stored in Amazon S3, Eucalyptus Walrus, and Google Storage.
|
34
|
+
|
31
35
|
Sample Neptune job scripts can be found in samples. Test scripts will
|
32
36
|
be added to the 'test' folder soon.
|
33
37
|
|
@@ -53,6 +57,14 @@ in for a link to that as it becomes available.
|
|
53
57
|
|
54
58
|
Version History:
|
55
59
|
|
60
|
+
March 18, 2011 - 0.0.5 released, adding support for storage outside
|
61
|
+
of AppScale to be used. Tested and working with Amazon S3 and Google
|
62
|
+
Storage
|
63
|
+
|
64
|
+
February 10, 2011 - 0.0.4 released, adding UPC and Erlang support,
|
65
|
+
and restructuring syntax to pass in hashes to method calls instead
|
66
|
+
of passing in blocks
|
67
|
+
|
56
68
|
February 4, 2011 - 0.0.3 released, allowing users to use
|
57
69
|
Neptune properly as a gem within Ruby code
|
58
70
|
|
data/lib/neptune.rb
CHANGED
@@ -19,9 +19,17 @@ $VERBOSE = nil
|
|
19
19
|
#MR_RUN_JOB_REQUIRED = %w{ }
|
20
20
|
#MR_REQUIRED = %w{ output }
|
21
21
|
|
22
|
+
# A list of Neptune jobs that do not require nodes to be spawned
|
23
|
+
# up for computation
|
24
|
+
NO_NODES_NEEDED = ["acl", "output", "compile"]
|
25
|
+
|
26
|
+
# A list of storage mechanisms that we can use to store and retrieve
|
27
|
+
# data to for Neptune jobs.
|
28
|
+
ALLOWED_STORAGE_TYPES = ["appdb", "gstorage", "s3"]
|
29
|
+
|
22
30
|
# A list of jobs that require some kind of work to be done before
|
23
31
|
# the actual computation can be performed.
|
24
|
-
NEED_PREPROCESSING = ["compile", "mapreduce", "mpi"]
|
32
|
+
NEED_PREPROCESSING = ["compile", "erlang", "mapreduce", "mpi"]
|
25
33
|
|
26
34
|
# A set of methods and constants that we've monkey-patched to enable Neptune
|
27
35
|
# support. In the future, it is likely that the only exposed / monkey-patched
|
@@ -66,6 +74,19 @@ def preprocess_compile(job_data)
|
|
66
74
|
job_data["@code"] = dest
|
67
75
|
end
|
68
76
|
|
77
|
+
def preprocess_erlang(job_data)
|
78
|
+
source_code = File.expand_path(job_data["@code"])
|
79
|
+
unless File.exists?(source_code)
|
80
|
+
file_not_found = "The specified code, #{job_data['@code']}," +
|
81
|
+
" didn't exist. Please specify one that exists and try again"
|
82
|
+
abort(file_not_found)
|
83
|
+
end
|
84
|
+
dest_code = "/tmp/"
|
85
|
+
|
86
|
+
keyname = job_data["@keyname"]
|
87
|
+
CommonFunctions.scp_to_shadow(source_code, dest_code, keyname)
|
88
|
+
end
|
89
|
+
|
69
90
|
# This preprocessing method handles copying data for regular
|
70
91
|
# Hadoop MapReduce and Hadoop MapReduce Streaming. For the former
|
71
92
|
# case, we copy over just the JAR the user has given us, and
|
@@ -97,12 +118,31 @@ end
|
|
97
118
|
# code to the master node in AppScale - this node will
|
98
119
|
# then copy it to whoever will run the MPI job.
|
99
120
|
def preprocess_mpi(job_data)
|
121
|
+
if job_data["@procs_to_use"]
|
122
|
+
p = job_data["@procs_to_use"]
|
123
|
+
n = job_data["@nodes_to_use"]
|
124
|
+
if p < n
|
125
|
+
not_enough_procs = "When specifying both :procs_to_use and :nodes_to_use" +
|
126
|
+
", :procs_to_use must be at least as large as :nodes_to_use. Please " +
|
127
|
+
"change this and try again. You specified :procs_to_use = #{p} and" +
|
128
|
+
":nodes_to_use = #{n}."
|
129
|
+
abort(not_enough_procs)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
100
133
|
source_code = File.expand_path(job_data["@code"])
|
101
134
|
unless File.exists?(source_code)
|
102
|
-
file_not_found = "The specified code, #{
|
135
|
+
file_not_found = "The specified code, #{source_code}," +
|
103
136
|
" didn't exist. Please specify one that exists and try again"
|
104
137
|
abort(file_not_found)
|
105
138
|
end
|
139
|
+
|
140
|
+
unless File.file?(source_code)
|
141
|
+
should_be_file = "The specified code, #{source_code}, was not a file - " +
|
142
|
+
" it was a directory or symbolic link. Please specify a file and try again."
|
143
|
+
abort(should_be_file)
|
144
|
+
end
|
145
|
+
|
106
146
|
dest_code = "/tmp/thempicode"
|
107
147
|
|
108
148
|
keyname = job_data["@keyname"]
|
@@ -145,6 +185,10 @@ def neptune(params)
|
|
145
185
|
job_data["@job"] = nil
|
146
186
|
job_data["@keyname"] = keyname || "appscale"
|
147
187
|
|
188
|
+
if job_data["@nodes_to_use"].class == Hash
|
189
|
+
job_data["@nodes_to_use"] = job_data["@nodes_to_use"].to_a.flatten
|
190
|
+
end
|
191
|
+
|
148
192
|
if (job_data["@output"].nil? or job_data["@output"] == "")
|
149
193
|
abort("Job output must be specified")
|
150
194
|
end
|
@@ -153,6 +197,49 @@ def neptune(params)
|
|
153
197
|
abort("Job output must begin with a slash ('/')")
|
154
198
|
end
|
155
199
|
|
200
|
+
if job_data["@storage"]
|
201
|
+
storage = job_data["@storage"]
|
202
|
+
unless ALLOWED_STORAGE_TYPES.include?(storage)
|
203
|
+
msg = "Supported storage types are #{ALLOWED_STORAGE_TYPES.join(', ')}" +
|
204
|
+
" - we do not support #{storage}."
|
205
|
+
abort(msg)
|
206
|
+
end
|
207
|
+
|
208
|
+
# Our implementation for storing / retrieving via Google Storage uses
|
209
|
+
# the same library as we do for S3 - so just tell it that it's S3
|
210
|
+
if storage == "gstorage"
|
211
|
+
storage = "s3"
|
212
|
+
job_data["@storage"] = "s3"
|
213
|
+
end
|
214
|
+
|
215
|
+
if storage == "s3"
|
216
|
+
["EC2_ACCESS_KEY", "EC2_SECRET_KEY", "S3_URL"].each { |item|
|
217
|
+
unless job_data["@#{item}"]
|
218
|
+
if ENV[item]
|
219
|
+
puts "Using #{item} from environment"
|
220
|
+
job_data["@#{item}"] = ENV[item]
|
221
|
+
else
|
222
|
+
msg = "When storing data to S3, #{item} must be specified or be in " +
|
223
|
+
"your environment. Please do so and try again."
|
224
|
+
abort(msg)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
}
|
228
|
+
|
229
|
+
# the rightscale gems won't take the s3 url if it has http or https on
|
230
|
+
# the front, so rip it off first - it also doesn't like a trailing slash
|
231
|
+
s3_url = job_data["@S3_URL"]
|
232
|
+
puts "s3 url is now #{s3_url}"
|
233
|
+
if s3_url =~ /\Ahttp[s]?:\/\/(.*)\/\Z/
|
234
|
+
s3_url = $1
|
235
|
+
end
|
236
|
+
puts "s3 url is now #{s3_url}"
|
237
|
+
job_data["@S3_URL"] = s3_url
|
238
|
+
end
|
239
|
+
else
|
240
|
+
job_data["@storage"] = "appdb"
|
241
|
+
end
|
242
|
+
|
156
243
|
#if job_data["@can_run_on"].class == Range
|
157
244
|
# job_data["@can_run_on"] = job_data["@can_run_on"].to_a
|
158
245
|
#elsif job_data["@can_run_on"].class == Fixnum
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neptune
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Chris Bunch
|
@@ -15,7 +15,7 @@ autorequire: neptune
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-03-18 00:00:00 -07:00
|
19
19
|
default_executable: neptune
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -108,7 +108,7 @@ files:
|
|
108
108
|
- README
|
109
109
|
- LICENSE
|
110
110
|
has_rdoc: true
|
111
|
-
homepage: http://
|
111
|
+
homepage: http://neptune-lang.org
|
112
112
|
licenses: []
|
113
113
|
|
114
114
|
post_install_message:
|