contained_mr 0.5.0 → 0.6.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +6 -3
- data/Gemfile +2 -1
- data/Gemfile.lock +15 -14
- data/README.md +7 -0
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/contained_mr.gemspec +9 -6
- data/lib/contained_mr/job.rb +10 -6
- data/lib/contained_mr/job_logic.rb +18 -0
- data/lib/contained_mr/template.rb +5 -2
- data/lib/contained_mr/template_logic.rb +1 -0
- data/test/test_job.rb +4 -6
- data/test/test_job_logic.rb +16 -0
- data/test/test_template.rb +1 -2
- data/testdata/Dockerfile.hello.mapper +1 -0
- data/testdata/Dockerfile.hello.reducer +1 -0
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b85709886ebd903cf0ce3ebc0843fd1b9122faff
|
4
|
+
data.tar.gz: d9a4f3fb295ea57d39b7ee5f21526c5ed7903d79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd44006c2a201c54d0aeee2fc3a4815c231acfddebd87cdb8b022b3be3bd0152ff0a3dfa95197b71dd4e4f5e048881ec6864e40ac7274809e42cd6d3f2e42fcd
|
7
|
+
data.tar.gz: 8118a13d9c80711bff4ec08277bdef4719a4f89c2e81779a3c5c8d6a12933bc91978167fb2cb06dc0cbe276f864b3a23bc1c24a03490aa060399290e6ec96f2b
|
data/.travis.yml
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
sudo: required
|
2
|
+
dist: trusty
|
2
3
|
language: ruby
|
3
|
-
services:
|
4
|
-
- docker
|
5
4
|
rvm:
|
6
5
|
- 2.2.4
|
7
6
|
- 2.3.0
|
8
7
|
before_install:
|
8
|
+
- sudo apt-get update
|
9
|
+
- sudo apt-get install -o Dpkg::Options::="--force-confold" --force-yes -y docker-engine
|
9
10
|
- gem install bundler
|
10
11
|
before_script:
|
11
12
|
- bundle install --jobs=3 --retry=3 --deployment
|
13
|
+
- docker version
|
14
|
+
- docker info
|
12
15
|
script:
|
13
|
-
- rake test
|
16
|
+
- bundle exec rake test
|
data/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'docker-api', '>= 1.
|
3
|
+
gem 'docker-api', '>= 1.26.2', require: 'docker'
|
4
4
|
gem 'rubyzip', '>= 1.1.7', require: 'zip'
|
5
5
|
|
6
6
|
# Add dependencies to develop your gem here.
|
@@ -10,6 +10,7 @@ group :development do
|
|
10
10
|
gem 'jeweler', '>= 2.0.1'
|
11
11
|
gem 'minitest', '>= 5.8.3'
|
12
12
|
gem 'mocha', '>= 1.1.0'
|
13
|
+
gem 'rake', '>= 11.1.2'
|
13
14
|
gem 'rdoc', '>= 4.2.0'
|
14
15
|
gem 'simplecov', '>= 0.10.0'
|
15
16
|
gem 'yard', '>= 0.8.7.6'
|
data/Gemfile.lock
CHANGED
@@ -6,13 +6,13 @@ GEM
|
|
6
6
|
descendants_tracker (0.0.4)
|
7
7
|
thread_safe (~> 0.3, >= 0.3.1)
|
8
8
|
docile (1.1.5)
|
9
|
-
docker-api (1.
|
9
|
+
docker-api (1.26.2)
|
10
10
|
excon (>= 0.38.0)
|
11
11
|
json
|
12
|
-
excon (0.
|
12
|
+
excon (0.48.0)
|
13
13
|
faraday (0.9.2)
|
14
14
|
multipart-post (>= 1.2, < 3)
|
15
|
-
git (1.
|
15
|
+
git (1.3.0)
|
16
16
|
github_api (0.13.1)
|
17
17
|
addressable (~> 2.4.0)
|
18
18
|
descendants_tracker (~> 0.0.4)
|
@@ -32,29 +32,29 @@ GEM
|
|
32
32
|
rake
|
33
33
|
rdoc
|
34
34
|
json (1.8.3)
|
35
|
-
jwt (1.5.
|
35
|
+
jwt (1.5.1)
|
36
36
|
metaclass (0.0.4)
|
37
37
|
mini_portile2 (2.0.0)
|
38
|
-
minitest (5.8.
|
38
|
+
minitest (5.8.4)
|
39
39
|
mocha (1.1.0)
|
40
40
|
metaclass (~> 0.0.1)
|
41
41
|
multi_json (1.11.2)
|
42
42
|
multi_xml (0.5.5)
|
43
43
|
multipart-post (2.0.0)
|
44
|
-
nokogiri (1.6.7.
|
44
|
+
nokogiri (1.6.7.2)
|
45
45
|
mini_portile2 (~> 2.0.0.rc2)
|
46
|
-
oauth2 (1.
|
46
|
+
oauth2 (1.1.0)
|
47
47
|
faraday (>= 0.8, < 0.10)
|
48
|
-
jwt (~> 1.0)
|
48
|
+
jwt (~> 1.0, < 1.5.2)
|
49
49
|
multi_json (~> 1.3)
|
50
50
|
multi_xml (~> 0.5)
|
51
|
-
rack (
|
51
|
+
rack (>= 1.2, < 3)
|
52
52
|
rack (1.6.4)
|
53
|
-
rake (
|
54
|
-
rdoc (4.2.
|
53
|
+
rake (11.1.2)
|
54
|
+
rdoc (4.2.2)
|
55
55
|
json (~> 1.4)
|
56
|
-
rubyzip (1.
|
57
|
-
simplecov (0.11.
|
56
|
+
rubyzip (1.2.0)
|
57
|
+
simplecov (0.11.2)
|
58
58
|
docile (~> 1.1.0)
|
59
59
|
json (~> 1.8)
|
60
60
|
simplecov-html (~> 0.10.0)
|
@@ -67,10 +67,11 @@ PLATFORMS
|
|
67
67
|
|
68
68
|
DEPENDENCIES
|
69
69
|
bundler (>= 1.6.1)
|
70
|
-
docker-api (>= 1.
|
70
|
+
docker-api (>= 1.26.2)
|
71
71
|
jeweler (>= 2.0.1)
|
72
72
|
minitest (>= 5.8.3)
|
73
73
|
mocha (>= 1.1.0)
|
74
|
+
rake (>= 11.1.2)
|
74
75
|
rdoc (>= 4.2.0)
|
75
76
|
rubyzip (>= 1.1.7)
|
76
77
|
simplecov (>= 0.10.0)
|
data/README.md
CHANGED
@@ -6,6 +6,13 @@
|
|
6
6
|
Map-Reduce where both the mappers and the reducer run inside Docker containers.
|
7
7
|
|
8
8
|
|
9
|
+
## Prerequisites
|
10
|
+
|
11
|
+
`contained-mr` requires [docker](https://github.com/docker/docker) version 1.9
|
12
|
+
or above. If used, [docker-swarm](https://github.com/docker/swarm) must be at
|
13
|
+
vesion 1.0 or above.
|
14
|
+
|
15
|
+
|
9
16
|
## Development Environment
|
10
17
|
|
11
18
|
`contained-mr` requires access to a Docker Swarm daemon. The easiest way to
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/contained_mr.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: contained_mr 0.
|
5
|
+
# stub: contained_mr 0.6.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "contained_mr"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.6.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Victor Costan"]
|
14
|
-
s.date = "2016-
|
14
|
+
s.date = "2016-03-28"
|
15
15
|
s.description = "Plumbing for running mappers and reducers inside Docker containers"
|
16
16
|
s.email = "victor@costan.us"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -75,33 +75,36 @@ Gem::Specification.new do |s|
|
|
75
75
|
s.specification_version = 4
|
76
76
|
|
77
77
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
78
|
-
s.add_runtime_dependency(%q<docker-api>, [">= 1.
|
78
|
+
s.add_runtime_dependency(%q<docker-api>, [">= 1.26.2"])
|
79
79
|
s.add_runtime_dependency(%q<rubyzip>, [">= 1.1.7"])
|
80
80
|
s.add_development_dependency(%q<bundler>, [">= 1.6.1"])
|
81
81
|
s.add_development_dependency(%q<jeweler>, [">= 2.0.1"])
|
82
82
|
s.add_development_dependency(%q<minitest>, [">= 5.8.3"])
|
83
83
|
s.add_development_dependency(%q<mocha>, [">= 1.1.0"])
|
84
|
+
s.add_development_dependency(%q<rake>, [">= 11.1.2"])
|
84
85
|
s.add_development_dependency(%q<rdoc>, [">= 4.2.0"])
|
85
86
|
s.add_development_dependency(%q<simplecov>, [">= 0.10.0"])
|
86
87
|
s.add_development_dependency(%q<yard>, [">= 0.8.7.6"])
|
87
88
|
else
|
88
|
-
s.add_dependency(%q<docker-api>, [">= 1.
|
89
|
+
s.add_dependency(%q<docker-api>, [">= 1.26.2"])
|
89
90
|
s.add_dependency(%q<rubyzip>, [">= 1.1.7"])
|
90
91
|
s.add_dependency(%q<bundler>, [">= 1.6.1"])
|
91
92
|
s.add_dependency(%q<jeweler>, [">= 2.0.1"])
|
92
93
|
s.add_dependency(%q<minitest>, [">= 5.8.3"])
|
93
94
|
s.add_dependency(%q<mocha>, [">= 1.1.0"])
|
95
|
+
s.add_dependency(%q<rake>, [">= 11.1.2"])
|
94
96
|
s.add_dependency(%q<rdoc>, [">= 4.2.0"])
|
95
97
|
s.add_dependency(%q<simplecov>, [">= 0.10.0"])
|
96
98
|
s.add_dependency(%q<yard>, [">= 0.8.7.6"])
|
97
99
|
end
|
98
100
|
else
|
99
|
-
s.add_dependency(%q<docker-api>, [">= 1.
|
101
|
+
s.add_dependency(%q<docker-api>, [">= 1.26.2"])
|
100
102
|
s.add_dependency(%q<rubyzip>, [">= 1.1.7"])
|
101
103
|
s.add_dependency(%q<bundler>, [">= 1.6.1"])
|
102
104
|
s.add_dependency(%q<jeweler>, [">= 2.0.1"])
|
103
105
|
s.add_dependency(%q<minitest>, [">= 5.8.3"])
|
104
106
|
s.add_dependency(%q<mocha>, [">= 1.1.0"])
|
107
|
+
s.add_dependency(%q<rake>, [">= 11.1.2"])
|
105
108
|
s.add_dependency(%q<rdoc>, [">= 4.2.0"])
|
106
109
|
s.add_dependency(%q<simplecov>, [">= 0.10.0"])
|
107
110
|
s.add_dependency(%q<yard>, [">= 0.8.7.6"])
|
data/lib/contained_mr/job.rb
CHANGED
@@ -65,9 +65,11 @@ class ContainedMr::Job
|
|
65
65
|
end
|
66
66
|
|
67
67
|
tar_io = mapper_tar_context mapper_input
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
Docker::Image.build_from_tar tar_io, mapper_image_options
|
69
|
+
|
70
|
+
# NOTE: The build process returns a short image ID. We need to perform
|
71
|
+
# another API call to get the canonical ID.
|
72
|
+
@mapper_image_id = Docker::Image.get(mapper_image_tag).id
|
71
73
|
end
|
72
74
|
|
73
75
|
# Builds the Docker image used to run this job's reducer.
|
@@ -82,9 +84,11 @@ class ContainedMr::Job
|
|
82
84
|
end
|
83
85
|
|
84
86
|
tar_io = reducer_tar_context
|
85
|
-
|
86
|
-
|
87
|
-
|
87
|
+
Docker::Image.build_from_tar tar_io, reducer_image_options
|
88
|
+
|
89
|
+
# NOTE: The build process returns a short image ID. We need to perform
|
90
|
+
# another API call to get the canonical ID.
|
91
|
+
@reducer_image_id = Docker::Image.get(reducer_image_tag).id
|
88
92
|
end
|
89
93
|
|
90
94
|
# Runs one of the job's mappers.
|
@@ -49,6 +49,24 @@ module ContainedMr::JobLogic
|
|
49
49
|
"#{@name_prefix}/reducer.#{@id}"
|
50
50
|
end
|
51
51
|
|
52
|
+
# @return {Hash<Symbol, Object>} options passed to the Docker API when
|
53
|
+
# building when building the mapper image
|
54
|
+
def mapper_image_options
|
55
|
+
{
|
56
|
+
t: mapper_image_tag, forcerm: 1,
|
57
|
+
buildargs: { 'affinity:image' => "=#{@template.image_tag}" }.to_json
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return {Hash<Symbol, Object>} options passed to the Docker API when
|
62
|
+
# building when building the mapper image
|
63
|
+
def reducer_image_options
|
64
|
+
{
|
65
|
+
t: reducer_image_tag, forcerm: 1,
|
66
|
+
buildargs: { 'affinity:image' => "=#{@template.image_tag}" }.to_json
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
52
70
|
# @return {Hash<String, Object>} params used to create a mapper container
|
53
71
|
def mapper_container_options(i)
|
54
72
|
ulimits = @mapper_options[:ulimits].map do |k, v|
|
@@ -77,8 +77,11 @@ class ContainedMr::Template
|
|
77
77
|
#
|
78
78
|
# @param {IO} tar_io IO implementation that produces the image's .tar file
|
79
79
|
def build_image(tar_io)
|
80
|
-
|
81
|
-
|
80
|
+
Docker::Image.build_from_tar tar_io, t: image_tag, forcerm: 1
|
81
|
+
|
82
|
+
# NOTE: The build process returns a short image ID. We need to perform
|
83
|
+
# another API call to get the canonical ID.
|
84
|
+
@image_id = Docker::Image.get(image_tag).id
|
82
85
|
end
|
83
86
|
private :build_image
|
84
87
|
end
|
@@ -70,6 +70,7 @@ module ContainedMr::TemplateLogic
|
|
70
70
|
def job_dockerfile(job_definition, input_source)
|
71
71
|
<<DOCKER_END
|
72
72
|
FROM #{image_tag}
|
73
|
+
ARG affinity:image=
|
73
74
|
COPY #{input_source} #{job_definition['input'] || '/input'}
|
74
75
|
WORKDIR #{job_definition['chdir'] || '/'}
|
75
76
|
ENTRYPOINT #{JSON.dump(job_definition['cmd'] || ['/bin/sh'])}
|
data/test/test_job.rb
CHANGED
@@ -23,7 +23,7 @@ class TestJob < MiniTest::Test
|
|
23
23
|
|
24
24
|
image = Docker::Image.get @job.mapper_image_tag
|
25
25
|
assert image, 'Docker::Image'
|
26
|
-
|
26
|
+
assert_equal image.id, @job.mapper_image_id
|
27
27
|
|
28
28
|
1.upto 3 do |i|
|
29
29
|
assert_nil @job.mapper_runner(i), "Mapper #{i} started prematurely"
|
@@ -48,8 +48,7 @@ class TestJob < MiniTest::Test
|
|
48
48
|
def test_created_mapper_image_tags
|
49
49
|
@job.build_mapper_image File.read('testdata/input.hello')
|
50
50
|
|
51
|
-
|
52
|
-
image = images.find { |i| i.id.start_with? @job.mapper_image_id }
|
51
|
+
image = Docker::Image.get @job.mapper_image_id
|
53
52
|
assert image, 'Docker::Image in collection returned by Docker::Image.all'
|
54
53
|
assert image.info['RepoTags'], "Image missing RepoTags: #{image.inspect}"
|
55
54
|
assert_includes image.info['RepoTags'],
|
@@ -97,12 +96,11 @@ class TestJob < MiniTest::Test
|
|
97
96
|
@job.build_reducer_image
|
98
97
|
image = Docker::Image.get @job.reducer_image_tag
|
99
98
|
assert image, 'Docker::Image'
|
100
|
-
|
99
|
+
assert_equal image.id, @job.reducer_image_id
|
101
100
|
|
102
101
|
assert_nil @job.reducer_runner, "Reducer started prematurely"
|
103
102
|
|
104
|
-
|
105
|
-
image = images.find { |i| i.id.start_with? @job.reducer_image_id }
|
103
|
+
image = Docker::Image.get @job.reducer_image_id
|
106
104
|
assert image, 'Docker::Image in collection returned by Docker::Image.all'
|
107
105
|
assert image.info['RepoTags'], "Image missing RepoTags: #{image.inspect}"
|
108
106
|
assert_includes image.info['RepoTags'],
|
data/test/test_job_logic.rb
CHANGED
@@ -17,6 +17,22 @@ class TestJobLogic < MiniTest::Test
|
|
17
17
|
assert_equal 'contained_mrtests/reducer.testjob', @job.reducer_image_tag
|
18
18
|
end
|
19
19
|
|
20
|
+
def test_mapper_image_options
|
21
|
+
golden = {
|
22
|
+
t: 'contained_mrtests/mapper.testjob', forcerm: 1,
|
23
|
+
buildargs: '{"affinity:image":"=contained_mrtests/base.hello"}'
|
24
|
+
}
|
25
|
+
assert_equal golden, @job.mapper_image_options
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_reducer_image_options
|
29
|
+
golden = {
|
30
|
+
t: 'contained_mrtests/reducer.testjob', forcerm: 1,
|
31
|
+
buildargs: '{"affinity:image":"=contained_mrtests/base.hello"}'
|
32
|
+
}
|
33
|
+
assert_equal golden, @job.reducer_image_options
|
34
|
+
end
|
35
|
+
|
20
36
|
def test_mapper_container_options
|
21
37
|
assert_equal @template, @job.template
|
22
38
|
assert_equal 'contained_mrtests', @job.name_prefix
|
data/test/test_template.rb
CHANGED
@@ -20,8 +20,7 @@ class TestTemplate < MiniTest::Test
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_created_image_tags
|
23
|
-
|
24
|
-
image = images.find { |i| i.id.start_with? @template.image_id }
|
23
|
+
image = Docker::Image.get @template.image_id
|
25
24
|
assert image, 'Docker::Image in collection returned by Docker::Image.all'
|
26
25
|
assert image.info['RepoTags'], "Image missing RepoTags: #{image.inspect}"
|
27
26
|
assert_includes image.info['RepoTags'],
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: contained_mr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Costan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docker-api
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.26.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.26.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rubyzip
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 1.1.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 11.1.2
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 11.1.2
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rdoc
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|