nuri 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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