nuri 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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 = "" //"/usr/local/java/jre1.6.0_34"
21
- final data_dir = "/tmp/hadoop"
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
  }
@@ -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' => '-Xmx1024M',
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' => 1024,
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'] = `hostname`.to_s.strip
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
 
@@ -14,7 +14,7 @@ schema Hadoop2 extends TarPackage {
14
14
  final group = "hadoop"
15
15
  final password = "!"
16
16
  final java_home = ""
17
- final data_dir = "/tmp/hadoop"
17
+ final data_dir = "/opt/hadoop/data"
18
18
 
19
19
  sub install {
20
20
  condition {
@@ -18,70 +18,43 @@
18
18
 
19
19
  <property>
20
20
  <name>yarn.acl.enable</name>
21
- <value>false</value>
21
+ <value><%= yarn_acl_enable %></value>
22
22
  </property>
23
23
 
24
24
  <property>
25
25
  <name>yarn.admin.acl</name>
26
- <value>*</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>false</value>
31
+ <value><%= yarn_log_aggregation_enable %></value>
32
32
  </property>
33
33
 
34
34
  <property>
35
- <name>yarn.resourcemanager.address</name>
36
- <value><%= master %>:54311</value>
37
- </property>
38
- <property>
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>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
41
+ <value><%= yarn_resourcemanager_scheduler_class %></value>
53
42
  </property>
54
43
  <property>
55
44
  <name>yarn.web-proxy.address</name>
56
- <value><%= master %>:54315</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><%= yarn_local_dir %></value>
49
+ <value><%= yarn_nodemanager_local_dirs %></value>
77
50
  </property>
78
51
  <property>
79
52
  <name>yarn.nodemanager.log-dirs</name>
80
- <value><%= yarn_log_dir %></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>10800</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>mapreduce_shuffle</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>
@@ -1,65 +1,54 @@
1
- #!/bin/bash
2
-
3
- DefaultPort=1314
4
-
5
- # verify the arguments
6
- if [[ "$1" == "" ]] || [[ "$2" == "" ]]; then
7
- echo "Usage: install_module <address> [port] <module-name> ..."
8
- exit 1
9
- fi
10
-
11
- # set the agent's address
12
- address=$1
13
- shift
14
-
15
- # set the agent's port number
16
- re='^[0-9]+$'
17
- if [[ $1 =~ $re ]]; then
18
- port=$1
19
- shift
20
- else
21
- port=$DefaultPort
22
- fi
23
-
24
- # set a template command for sending the modules
25
- cmd="curl -s -i -X PUT $address:$port/modules"
26
-
27
- # setup directory for temporary files
28
- dir="/tmp/"$(date +%s%N)"$RANDOM"
29
- mkdir -p $dir
30
-
31
- # for every module in the arguments:
32
- # - archive the module's files to a temporary file
33
- # - update the sending command by adding the module
34
- # if the module is not exist then the program will
35
- # set missing_module flag and then break from the loop
36
- missing_module=0
37
- for module in "$@" ; do
38
- if [[ -d "$module" ]]; then
39
- tar cvzhf $dir/$module.tgz $module 1>/dev/null
40
- cmd="$cmd -F $module=@$dir/$module.tgz"
41
- else
42
- echo "Module $module is not exist!"
43
- missing_module=`expr $missing_module + 1`
44
- fi
45
- done
46
-
47
- if [[ $missing_module == 0 ]]; then
48
- # execute the sending command there is no missing module
49
- result=`$cmd`
50
- re='.*HTTP/1\.1 200 OK.*'
51
- if ! [[ $result =~ $re ]]; then
52
- missing_module=`expr $missing_module + 1`
53
- fi
54
- fi
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
@@ -1,5 +1,5 @@
1
1
  schema Package {
2
- installed : Bool
2
+ installed = true
3
3
 
4
4
  final package_name = ""
5
5
  final version : String
@@ -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
- src = url
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
- # install axel if it's not available
29
- system "apt-get install axel" if `which axel`.strip.length <= 0
26
+ # create home directory if not exist
27
+ shell "mkdir -p #{home}" if !::File.exist?(home)
30
28
 
31
- # download the file
32
- system "cd #{dest} && axel -q #{src}"
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?("#{dest}/#{file}")
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
- system "cd #{dest} && tar xvzf #{file}"
43
- system "rm -f #{dest}/#{file}"
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 = (::File.extname(file) == '.gz' ? ::File.basename(file, '.tar.gz') : ::File.basename(file, ::File.extname(file)))
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("#{dest}/#{Signature}", 'w') { |f| f.write(Time.now.to_s) }
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
- !!system("rm -rf #{home}") if File.exist?(home)
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