nuri 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +42 -11
- data/VERSION +1 -1
- data/bin/delete_modules +35 -11
- data/bin/install_module +54 -65
- data/bin/nuri +48 -38
- data/bin/sfw2graph +178 -0
- data/examples/bonfire.sfp +6 -14
- data/examples/hadoop1.sfp +21 -0
- data/examples/hadoop2.sfp +2 -1
- data/examples/{generator.rb → mockcloud/generator.rb} +0 -0
- data/examples/{run.rb → mockcloud/run.rb} +0 -0
- data/examples/wordpress.sfp +41 -0
- data/lib/nuri.rb +1 -1
- data/lib/nuri/choreographer.rb +1 -1
- data/lib/nuri/{net_helper.rb → helper.rb} +32 -2
- data/lib/nuri/master.rb +13 -27
- data/lib/nuri/orchestrator.rb +1 -1
- data/lib/nuri/targz.rb +97 -0
- data/modules/aptpackage/aptpackage.rb +22 -14
- data/modules/hadoop1/hadoop1.rb +84 -215
- data/modules/hadoop1/hadoop1.sfp +19 -8
- data/modules/hadoop2/hadoop2.rb +10 -3
- data/modules/hadoop2/hadoop2.sfp +1 -1
- data/modules/hadoop2/yarn-site.xml +13 -48
- data/modules/install_module +54 -65
- data/modules/package/package.sfp +1 -1
- data/modules/tarpackage/tarpackage.rb +54 -18
- metadata +9 -6
- data/bin/push_model +0 -16
data/modules/hadoop1/hadoop1.sfp
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
include "../service/service.sfp"
|
2
|
+
include "../aptpackage/aptpackage.sfp"
|
2
3
|
|
3
4
|
/**
|
4
5
|
* Module for managing Hadoop version 1
|
@@ -17,24 +18,28 @@ schema Hadoop1 {
|
|
17
18
|
final password = "!"
|
18
19
|
final source = "http://www.mirrorservice.org/sites/ftp.apache.org/hadoop/common"
|
19
20
|
final version = "1.2.1"
|
20
|
-
final java_home = ""
|
21
|
-
final data_dir = "/
|
21
|
+
final java_home = ""
|
22
|
+
final data_dir = "/opt/hadoop/data"
|
22
23
|
final replication = 2
|
23
24
|
|
25
|
+
java isa AptPackage {
|
26
|
+
package_name = "default-jre"
|
27
|
+
}
|
28
|
+
|
24
29
|
sub install {
|
25
30
|
condition {
|
26
31
|
this.installed != true
|
32
|
+
this.java.installed = true
|
27
33
|
}
|
28
34
|
effect {
|
29
35
|
this.installed = true
|
30
|
-
this.running = false
|
31
36
|
}
|
32
37
|
}
|
33
38
|
|
34
39
|
sub uninstall {
|
35
40
|
condition {
|
36
|
-
this.running = false
|
37
41
|
this.installed = true
|
42
|
+
this.running = false
|
38
43
|
}
|
39
44
|
effect {
|
40
45
|
this.installed = false
|
@@ -43,8 +48,8 @@ schema Hadoop1 {
|
|
43
48
|
|
44
49
|
sub start {
|
45
50
|
condition {
|
46
|
-
this.running != true
|
47
51
|
this.installed = true
|
52
|
+
this.running != true
|
48
53
|
}
|
49
54
|
effect {
|
50
55
|
this.running = true
|
@@ -53,6 +58,7 @@ schema Hadoop1 {
|
|
53
58
|
|
54
59
|
sub stop {
|
55
60
|
condition {
|
61
|
+
this.installed = true
|
56
62
|
this.running = true
|
57
63
|
}
|
58
64
|
effect {
|
@@ -61,20 +67,25 @@ schema Hadoop1 {
|
|
61
67
|
}
|
62
68
|
}
|
63
69
|
|
64
|
-
schema Hadoop1Master extends Hadoop1 {
|
65
|
-
|
70
|
+
schema Hadoop1Master extends Hadoop1 {
|
71
|
+
home = "/opt/hadoopmaster"
|
72
|
+
data_dir = "/opt/hadoopmaster/data"
|
73
|
+
}
|
66
74
|
|
67
75
|
schema Hadoop1Slave extends Hadoop1 {
|
68
76
|
master isref Hadoop1Master
|
69
77
|
|
78
|
+
home = "/opt/hadoopslave"
|
79
|
+
data_dir = "/opt/hadoopslave/data"
|
80
|
+
|
70
81
|
sub install (master : Hadoop1Master) {
|
71
82
|
condition {
|
72
83
|
this.installed != true
|
73
84
|
master.parent.created = true
|
85
|
+
this.java.installed = true
|
74
86
|
}
|
75
87
|
effect {
|
76
88
|
this.installed = true
|
77
|
-
this.running = false
|
78
89
|
this.master = master
|
79
90
|
}
|
80
91
|
}
|
data/modules/hadoop2/hadoop2.rb
CHANGED
@@ -139,7 +139,7 @@ module Sfp::Module::Hadoop2Common
|
|
139
139
|
'dfs_datanode_data_dir' => @model['data_dir'] + "/datanode_data",
|
140
140
|
'mapreduce_framework_name' => 'yarn',
|
141
141
|
'mapreduce_map_memory_mb' => 1536,
|
142
|
-
'mapreduce_map_java_opts' => '-
|
142
|
+
'mapreduce_map_java_opts' => '-Xmx2048M',
|
143
143
|
'mapreduce_reduce_memory_mb' => 3072,
|
144
144
|
'mapreduce_reduce_java_opts' => '-Xmx2560M',
|
145
145
|
'mapreduce_task_io_sort_mb' => 512,
|
@@ -150,7 +150,7 @@ module Sfp::Module::Hadoop2Common
|
|
150
150
|
'yarn_log_aggregation_enable' => false,
|
151
151
|
'yarn_resourcemanager_scheduler_class' => 'org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler',
|
152
152
|
'yarn_scheduler_minimum_allocation_mb' => 256,
|
153
|
-
'yarn_scheduler_maximum_allocation_mb' =>
|
153
|
+
'yarn_scheduler_maximum_allocation_mb' => 2048,
|
154
154
|
'yarn_nodemanager_resource_memory_mb' => 512,
|
155
155
|
'yarn_nodemanager_vmem_pmem_ratio' => 2,
|
156
156
|
'yarn_nodemanager_log_retain_seconds' => 10800,
|
@@ -159,10 +159,16 @@ module Sfp::Module::Hadoop2Common
|
|
159
159
|
'yarn_log_aggregation_retain_check_interval_seconds' => -1,
|
160
160
|
'yarn_nodemanager_local_dirs' => @model['data_dir'] + "/yarn_local_dir",
|
161
161
|
'yarn_nodemanager_log_dirs' => @model['data_dir'] + "/yarn_log_dir",
|
162
|
+
'yarn_web_proxy_address' => local_address,
|
162
163
|
'io_file_buffer_size' => 131072,
|
163
164
|
}
|
164
165
|
end
|
165
166
|
|
167
|
+
def local_address
|
168
|
+
domain = `dnsdomainname`.to_s.strip
|
169
|
+
`hostname`.to_s.strip + (domain.length > 0 ? '.' + domain : '')
|
170
|
+
end
|
171
|
+
|
166
172
|
# TODO -- user "useradd" and "groupadd"
|
167
173
|
def add_user_group
|
168
174
|
user = @model['user']
|
@@ -308,7 +314,7 @@ class Sfp::Module::Hadoop2Master < Sfp::Module::TarPackage
|
|
308
314
|
|
309
315
|
def map
|
310
316
|
map = common_map
|
311
|
-
map['master'] =
|
317
|
+
map['master'] = local_address
|
312
318
|
map
|
313
319
|
end
|
314
320
|
|
@@ -392,6 +398,7 @@ class Sfp::Module::Hadoop2Slave < Sfp::Module::TarPackage
|
|
392
398
|
def map
|
393
399
|
map = common_map
|
394
400
|
map['master'] = resolve(@model['master'] + '.parent.sfpAddress')
|
401
|
+
map['yarn_web_proxy_address'] = resolve(@model['master'] + '.parent.sfpAddress')
|
395
402
|
map
|
396
403
|
end
|
397
404
|
|
data/modules/hadoop2/hadoop2.sfp
CHANGED
@@ -18,70 +18,43 @@
|
|
18
18
|
|
19
19
|
<property>
|
20
20
|
<name>yarn.acl.enable</name>
|
21
|
-
<value
|
21
|
+
<value><%= yarn_acl_enable %></value>
|
22
22
|
</property>
|
23
23
|
|
24
24
|
<property>
|
25
25
|
<name>yarn.admin.acl</name>
|
26
|
-
<value
|
26
|
+
<value><%= yarn_admin_acl %></value>
|
27
27
|
</property>
|
28
28
|
|
29
29
|
<property>
|
30
30
|
<name>yarn.log-aggregation-enable</name>
|
31
|
-
<value
|
31
|
+
<value><%= yarn_log_aggregation_enable %></value>
|
32
32
|
</property>
|
33
33
|
|
34
34
|
<property>
|
35
|
-
<name>yarn.resourcemanager.
|
36
|
-
<value><%= master
|
37
|
-
</property>
|
38
|
-
|
39
|
-
<name>yarn.resourcemanager.scheduler.address</name>
|
40
|
-
<value><%= master %>:54312</value>
|
41
|
-
</property>
|
42
|
-
<property>
|
43
|
-
<name>yarn.resourcemanager.admin.address</name>
|
44
|
-
<value><%= master %>:54313</value>
|
45
|
-
</property>
|
46
|
-
<property>
|
47
|
-
<name>yarn.resourcemanager.webapp.address</name>
|
48
|
-
<value><%= master %>:54314</value>
|
49
|
-
</property>
|
35
|
+
<name>yarn.resourcemanager.hostname</name>
|
36
|
+
<value><%= master %></value>
|
37
|
+
</property>
|
38
|
+
|
50
39
|
<property>
|
51
40
|
<name>yarn.resourcemanager.scheduler.class</name>
|
52
|
-
<value
|
41
|
+
<value><%= yarn_resourcemanager_scheduler_class %></value>
|
53
42
|
</property>
|
54
43
|
<property>
|
55
44
|
<name>yarn.web-proxy.address</name>
|
56
|
-
<value><%=
|
45
|
+
<value><%= yarn_web_proxy_address %>:54315</value>
|
57
46
|
</property>
|
58
|
-
<property>
|
59
|
-
<name>yarn.scheduler.minimum-allocation-mb</name>
|
60
|
-
<value>256</value>
|
61
|
-
</property>
|
62
|
-
<property>
|
63
|
-
<name>yarn.scheduler.maximum-allocation-mb</name>
|
64
|
-
<value>1024</value>
|
65
|
-
</property>
|
66
|
-
<property>
|
67
|
-
<name>yarn.nodemanager.resource.memory-mb</name>
|
68
|
-
<value>512</value>
|
69
|
-
</property>
|
70
|
-
<property>
|
71
|
-
<name>yarn.nodemanager.vmem-pmem-ratio</name>
|
72
|
-
<value>2</value>
|
73
|
-
</property>
|
74
47
|
<property>
|
75
48
|
<name>yarn.nodemanager.local-dirs</name>
|
76
|
-
<value><%=
|
49
|
+
<value><%= yarn_nodemanager_local_dirs %></value>
|
77
50
|
</property>
|
78
51
|
<property>
|
79
52
|
<name>yarn.nodemanager.log-dirs</name>
|
80
|
-
<value><%=
|
53
|
+
<value><%= yarn_nodemanager_log_dirs %></value>
|
81
54
|
</property>
|
82
55
|
<property>
|
83
56
|
<name>yarn.nodemanager.log.retain-seconds</name>
|
84
|
-
<value
|
57
|
+
<value><%= yarn_nodemanager_log_retain_seconds %></value>
|
85
58
|
</property>
|
86
59
|
<property>
|
87
60
|
<name>yarn.nodemanager.remote-app-log-dir</name>
|
@@ -93,15 +66,7 @@
|
|
93
66
|
</property>
|
94
67
|
<property>
|
95
68
|
<name>yarn.nodemanager.aux-services</name>
|
96
|
-
<value
|
97
|
-
</property>
|
98
|
-
<property>
|
99
|
-
<name>yarn.log-aggregation.retain-seconds</name>
|
100
|
-
<value>-1</value>
|
101
|
-
</property>
|
102
|
-
<property>
|
103
|
-
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
|
104
|
-
<value>-1</value>
|
69
|
+
<value><%= yarn_nodemanager_aux_services %></value>
|
105
70
|
</property>
|
106
71
|
|
107
72
|
</configuration>
|
data/modules/install_module
CHANGED
@@ -1,65 +1,54 @@
|
|
1
|
-
#!/bin/
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
address
|
13
|
-
|
14
|
-
|
15
|
-
#
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
# delete directory that holds temporary files
|
57
|
-
rm -rf $dir
|
58
|
-
|
59
|
-
if [[ $missing_module == 0 ]]; then
|
60
|
-
echo "status: ok"
|
61
|
-
else
|
62
|
-
echo "status: failed"
|
63
|
-
fi
|
64
|
-
|
65
|
-
exit $missing_module
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'uri'
|
5
|
+
require 'net/http'
|
6
|
+
require File.dirname(__FILE__) + '/../lib/nuri/targz'
|
7
|
+
|
8
|
+
module Nuri
|
9
|
+
module Util
|
10
|
+
TarGzip = Object.new.extend(Util::Tar)
|
11
|
+
|
12
|
+
def self.install_modules(address, port, modules, protocol="http")
|
13
|
+
data = {}
|
14
|
+
modules.each do |module_name|
|
15
|
+
raise Exception, "Module #{module_name} is not exist!" if not ::File.directory?(module_name)
|
16
|
+
data[module_name] = TarGzip.targzip(module_name, module_name).read
|
17
|
+
end
|
18
|
+
|
19
|
+
url = "#{protocol}://#{address}:#{port}/modules"
|
20
|
+
uri = URI.parse(url)
|
21
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
22
|
+
request = Net::HTTP::Put.new(uri.request_uri)
|
23
|
+
request.set_form_data(data)
|
24
|
+
response = http.request(request)
|
25
|
+
|
26
|
+
(response.code == '200')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if $0 == __FILE__
|
32
|
+
if ARGV.length < 2
|
33
|
+
puts "Usage: install_module <address> [port] <module-name> ..."
|
34
|
+
exit(1)
|
35
|
+
end
|
36
|
+
|
37
|
+
DefaultPort = 1314
|
38
|
+
|
39
|
+
address = ARGV.shift
|
40
|
+
port = (ARGV.length >= 2 ? ARGV.shift : DefaultPort)
|
41
|
+
modules = ARGV
|
42
|
+
missing = modules.select { |mod| not ::File.directory?(mod) }
|
43
|
+
modules = modules - missing
|
44
|
+
|
45
|
+
success = Nuri::Util.install_modules(address, port, modules),
|
46
|
+
output = {
|
47
|
+
:status => success,
|
48
|
+
:installed_modules => modules,
|
49
|
+
:missing_modules => missing
|
50
|
+
}
|
51
|
+
puts JSON.generate(output)
|
52
|
+
|
53
|
+
exit (success ? 0 : 1)
|
54
|
+
end
|
data/modules/package/package.sfp
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
|
1
4
|
class Sfp::Module::TarPackage
|
2
5
|
include Sfp::Resource
|
3
6
|
|
@@ -18,40 +21,42 @@ class Sfp::Module::TarPackage
|
|
18
21
|
##############################
|
19
22
|
|
20
23
|
def install(p={})
|
21
|
-
|
22
|
-
dest = home
|
23
|
-
return false if dest.length <= 0
|
24
|
-
|
25
|
-
# create destination directory if not exist
|
26
|
-
system "mkdir -p #{dest}" if !::File.exist?(dest)
|
24
|
+
return false if home.length <= 0
|
27
25
|
|
28
|
-
#
|
29
|
-
|
26
|
+
# create home directory if not exist
|
27
|
+
shell "mkdir -p #{home}" if !::File.exist?(home)
|
30
28
|
|
31
|
-
|
32
|
-
|
29
|
+
file = url.split('/').last.to_s
|
30
|
+
dest = "#{home}/#{file}"
|
31
|
+
download(url, dest)
|
33
32
|
|
34
|
-
file = src.split('/').last.to_s
|
35
33
|
# if downloaded file is not exist, then return false
|
36
|
-
if !::File.exist?(
|
34
|
+
if !::File.exist?(dest)
|
37
35
|
log.error "Failed to download file from #{url}"
|
38
36
|
return false
|
39
37
|
end
|
40
38
|
|
41
39
|
# extract tar file, and then delete it
|
42
|
-
|
43
|
-
|
40
|
+
shell "cd #{home} && tar xvzf #{file} && rm -f #{file}"
|
41
|
+
|
42
|
+
basename = case ::File.extname(file)
|
43
|
+
when '.gz'
|
44
|
+
::File.basename(file, '.tar.gz')
|
45
|
+
when '.tgz'
|
46
|
+
::File.basename(file, '.tgz')
|
47
|
+
else
|
48
|
+
file
|
49
|
+
end
|
44
50
|
|
45
|
-
basename
|
46
|
-
system "bash -c 'cd #{dest}/#{basename} && shopt -s dotglob && mv -f * .. && cd .. && rm -rf #{basename}'"
|
51
|
+
shell "bash -c 'cd #{home}/#{basename} && shopt -s dotglob && mv -f * .. && cd .. && rm -rf #{basename}'"
|
47
52
|
|
48
|
-
File.open("#{
|
53
|
+
File.open("#{home}/#{Signature}", 'w') { |f| f.write(Time.now.to_s) }
|
49
54
|
|
50
55
|
true
|
51
56
|
end
|
52
57
|
|
53
58
|
def uninstall(p={})
|
54
|
-
!!
|
59
|
+
!!shell("rm -rf #{home}") if File.exist?(home)
|
55
60
|
true
|
56
61
|
end
|
57
62
|
|
@@ -62,6 +67,37 @@ class Sfp::Module::TarPackage
|
|
62
67
|
##############################
|
63
68
|
|
64
69
|
protected
|
70
|
+
def download(source, destination)
|
71
|
+
def use_http_proxy?(uri)
|
72
|
+
ENV['no_proxy'].to_s.split(',').each { |pattern|
|
73
|
+
pattern.chop! if pattern[-1] == '*'
|
74
|
+
return false if uri.hist[0, pattern.length] == pattern
|
75
|
+
}
|
76
|
+
true
|
77
|
+
end
|
78
|
+
|
79
|
+
file = nil
|
80
|
+
begin
|
81
|
+
uri = URI.parse(source)
|
82
|
+
http = nil
|
83
|
+
if use_http_proxy?(uri)
|
84
|
+
proxy = URI.parse(ENV['http_proxy'])
|
85
|
+
http = Net::HTTP::Proxy(proxy.host, proxy.port).new(uri.host, uri.port)
|
86
|
+
else
|
87
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
88
|
+
end
|
89
|
+
http.request_get(uri.path) do |response|
|
90
|
+
file = ::File.open(destination, 'wb')
|
91
|
+
response.read_body do |segment|
|
92
|
+
file.write segment
|
93
|
+
end
|
94
|
+
file.flush
|
95
|
+
end
|
96
|
+
ensure
|
97
|
+
file.close if not file.nil?
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
65
101
|
def installed?
|
66
102
|
::File.exist?("#{home}/#{Signature}")
|
67
103
|
end
|