hodor 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.gitmodules +3 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/Guardfile +11 -0
- data/README.md +105 -0
- data/Rakefile +105 -0
- data/bin/hodor +18 -0
- data/hodor.gemspec +47 -0
- data/lib/config/log4r_config.xml +35 -0
- data/lib/hodor.rb +83 -0
- data/lib/hodor/api/hdfs.rb +222 -0
- data/lib/hodor/api/oozie.rb +215 -0
- data/lib/hodor/api/oozie/action.rb +52 -0
- data/lib/hodor/api/oozie/bundle.rb +27 -0
- data/lib/hodor/api/oozie/coordinator.rb +53 -0
- data/lib/hodor/api/oozie/hadoop_job.rb +29 -0
- data/lib/hodor/api/oozie/job.rb +192 -0
- data/lib/hodor/api/oozie/materialization.rb +56 -0
- data/lib/hodor/api/oozie/query.rb +115 -0
- data/lib/hodor/api/oozie/session.rb +170 -0
- data/lib/hodor/api/oozie/workflow.rb +58 -0
- data/lib/hodor/cli.rb +146 -0
- data/lib/hodor/command.rb +164 -0
- data/lib/hodor/configuration.rb +80 -0
- data/lib/hodor/environment.rb +437 -0
- data/lib/hodor/ui/table.rb +130 -0
- data/lib/hodor/version.rb +3 -0
- data/lib/tasks/hdfs.thor +138 -0
- data/lib/tasks/master.thor +61 -0
- data/lib/tasks/oozie.thor +399 -0
- data/lib/tasks/sandbox.thor +87 -0
- data/spec/integration/api/oozie/action_spec.rb +69 -0
- data/spec/integration/api/oozie/bundle_spec.rb +33 -0
- data/spec/integration/api/oozie/coordinator_spec.rb +66 -0
- data/spec/integration/api/oozie/hadoop_job_spec.rb +29 -0
- data/spec/integration/api/oozie/job_spec.rb +15 -0
- data/spec/integration/api/oozie/materialization_spec.rb +66 -0
- data/spec/integration/api/oozie/query_spec.rb +43 -0
- data/spec/integration/api/oozie/session_spec.rb +18 -0
- data/spec/integration/api/oozie/workflow_spec.rb +65 -0
- data/spec/integration/api/oozie_spec.rb +198 -0
- data/spec/integration/fixtures/api/running_coordinators/req_resp_00.memo +6 -0
- data/spec/integration/fixtures/api/sample_action/req_resp_00.memo +5 -0
- data/spec/integration/fixtures/api/sample_action/req_resp_01.memo +7 -0
- data/spec/integration/fixtures/api/sample_bundle/req_resp_00.memo +6 -0
- data/spec/integration/fixtures/api/sample_coordinator/req_resp_00.memo +5 -0
- data/spec/integration/fixtures/api/sample_materialization/req_resp_00.memo +5 -0
- data/spec/integration/fixtures/api/sample_materialization/req_resp_01.memo +7 -0
- data/spec/integration/fixtures/api/sample_workflow/req_resp_00.memo +5 -0
- data/spec/spec_helper.rb +92 -0
- data/spec/support/d_v_r.rb +125 -0
- data/spec/support/hodor_api.rb +15 -0
- data/spec/unit/hodor/api/hdfs_spec.rb +63 -0
- data/spec/unit/hodor/api/oozie_spec.rb +32 -0
- data/spec/unit/hodor/environment_spec.rb +52 -0
- data/topics/hdfs/corresponding_paths.txt +31 -0
- data/topics/hdfs/overview.txt +10 -0
- data/topics/master/clusters.yml.txt +36 -0
- data/topics/master/overview.txt +17 -0
- data/topics/oozie/blocking_coordinators.txt +46 -0
- data/topics/oozie/composing_job_properties.txt +68 -0
- data/topics/oozie/display_job.txt +52 -0
- data/topics/oozie/driver_scenarios.txt +42 -0
- data/topics/oozie/inspecting_jobs.txt +59 -0
- data/topics/oozie/jobs.yml.txt +185 -0
- data/topics/oozie/overview.txt +43 -0
- data/topics/oozie/workers_and_drivers.txt +40 -0
- metadata +455 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
INSPECTING JOBS
|
2
|
+
-----------------------------------------------------------------------------------------------
|
3
|
+
The most important concept that is shared by all commands within Hodor''s Oozie namespace is the
|
4
|
+
notion of "current job". Oozie''s job system is hierarhical. Coorinators contain workflows.
|
5
|
+
Workflows contain actions. Actions may contain Hive jobs, decision nodes, Hadoop jobs or other
|
6
|
+
workflows. So, it is a hierarchy, that can be many levels deep. In that respect, Oozie jobs
|
7
|
+
present much like a file system. Unix long ago implemented a great why to traverse and inspect
|
8
|
+
such a hierachy: ''cd'' and ''ls''. And Hodor''s Oozie namespace support the same conceptual methods.
|
9
|
+
For example, to change to an Oozie workflow:
|
10
|
+
|
11
|
+
$ hodor oozie:change_job 0035114-151002103648730-oozie-oozi-W # Change to job with this ID
|
12
|
+
$ hodor oozie:change_job 14 # Change to job at index 14
|
13
|
+
|
14
|
+
This will change the "current job" to the job indicated by the argument, but displays nothing.
|
15
|
+
To display the state of the current job:
|
16
|
+
|
17
|
+
$ hodor oozie:display_job
|
18
|
+
$ hodor oozie:display_job info # Equivalent since "info" is default attribute
|
19
|
+
$ hodor oozie:display_job -k # Display only "killed" children
|
20
|
+
$ hodor oozie:display_job info -m "11/14" # Display children that match "11/14" string
|
21
|
+
$ hodor oozie:display_job -m "11/14" # Display children that match "11/14" string
|
22
|
+
|
23
|
+
The above command will display general information (i.e. "info") about the "current job", but
|
24
|
+
the command supports a wider range of display attributes and options. For example, you can
|
25
|
+
change the number of children displayed, view the config settings passed in from the
|
26
|
+
job.properties file, the current job''s log file, or the json REST response:
|
27
|
+
|
28
|
+
$ hodor oozie:display_job conf -l 100 # display 100 children
|
29
|
+
$ hodor oozie:display_job conf -m time # display job properties matching ''time''
|
30
|
+
$ hodor oozie:display_job log -w fail.log # display job log, write to file ''fail.log''
|
31
|
+
$ hodor oozie:display_job json # display json response
|
32
|
+
|
33
|
+
And if you want to change to the parent of the current job:
|
34
|
+
|
35
|
+
$ hodor oozie:change_job ..
|
36
|
+
|
37
|
+
Just as file systems have a ''pwd'', Hodor''s Oozie namespace supports ''pwj'' for Path of working
|
38
|
+
job, that will display your current position in the Oozie hierarchy of jobs.
|
39
|
+
|
40
|
+
$ hodor oozie:pwj
|
41
|
+
|
42
|
+
Use of ''oozie:change_job'' is optional, because ''oozie:display_job'' will also change the
|
43
|
+
current job, by default:
|
44
|
+
|
45
|
+
$ hodor oozie:display_job 0035114-151002103648730-oozie-oozi-W
|
46
|
+
$ hodor oozie:display_job 0035114-151002103648730-oozie-oozi-W log # display log for job
|
47
|
+
$ hodor oozie:display_job 14 -l 50 -o 50 # info for job 14, starting at offset 50
|
48
|
+
|
49
|
+
Like the previous change_job command, the display_job command will also change to the specified
|
50
|
+
job, and then display its state. If oozie:display_job does both changing and displaying
|
51
|
+
the job, then why should "oozie:change_job" exist? Because display_job''s behavior is
|
52
|
+
configurable, via the ~/.hodor.yml file. If you set:
|
53
|
+
|
54
|
+
:display_job_query_mode: true
|
55
|
+
|
56
|
+
in ~/.hodor.yml, then display_job does not change_job, it only displays the state of whatever
|
57
|
+
job is current. In which case, you will need to use "oozie:change_job" and "oozie:display_job"
|
58
|
+
in concert. So, pick which ever methodology you prefer, or that makes sense for you particular
|
59
|
+
job inspection scenario.
|
@@ -0,0 +1,185 @@
|
|
1
|
+
The "jobs.yml" File
|
2
|
+
---------------------------------------------------------------------------
|
3
|
+
Within each driver directory, Hodor expects to find a "jobs.yml" file.
|
4
|
+
Essentially a project file, that provides metadata about all the jobs
|
5
|
+
that you have grouped together under a single drivers subdirectory. The
|
6
|
+
"jobs.yml" file enumerates the jobs in that directory, indicates
|
7
|
+
what workers it depends upon, which run scenario each driver expects and
|
8
|
+
finally specifies the job property overrides each driver requires. For
|
9
|
+
example, a typical driver directory might look like the following:
|
10
|
+
|
11
|
+
|
12
|
+
drivers/
|
13
|
+
testbench/
|
14
|
+
jobs.yml
|
15
|
+
my_test_driver.xml
|
16
|
+
another_test_driver.xml
|
17
|
+
|
18
|
+
The "jobs.xml" file in the above directory structure enable you to
|
19
|
+
co-locate, deploy and run both drivers (my_test_driver and another_test_driver),
|
20
|
+
managed by Hodor's Oozie namespace. A typical jobs.yml file might look
|
21
|
+
something like the following:
|
22
|
+
|
23
|
+
my_test_driver:
|
24
|
+
deploy: workers/my_test_workflow
|
25
|
+
properties: |
|
26
|
+
scenario=hourly/incremental
|
27
|
+
driver=testbench/my_test_driver
|
28
|
+
sla_events=start_miss
|
29
|
+
startTime=2015-10-30T13:26Z
|
30
|
+
endTime=2015-10-30T13:45Z
|
31
|
+
|
32
|
+
another_test_driver:
|
33
|
+
deploy: workers/ingestion_flow.xml
|
34
|
+
properties: |
|
35
|
+
scenario=hourly/incremental
|
36
|
+
driver=testbench/another_test_driver
|
37
|
+
sla_events=duration_miss
|
38
|
+
startTime=2015-10-30T13:26Z
|
39
|
+
endTime=2015-10-30T13:45Z
|
40
|
+
|
41
|
+
In the above jobs.yml file, there are two sections, one for each job.
|
42
|
+
Each section must have "deploy" and "properties" key/value pairs. The deploy
|
43
|
+
key is used by the "oozie:deploy" command to determine which worker
|
44
|
+
directories a particular driver requires on the remote HDFS volume. For
|
45
|
+
example, to deploy the "my_test_driver", run:
|
46
|
+
|
47
|
+
$ cd drivers/testbench
|
48
|
+
$ hodor oozie:deploy my_test_driver
|
49
|
+
|
50
|
+
The deploy command will load the jobs.yml deploy key for the job named
|
51
|
+
"my_test_driver", and its value to determine what the deploy command should
|
52
|
+
upload to HDFS.
|
53
|
+
|
54
|
+
The "properties" key contains properties vales that will override the
|
55
|
+
property values in the hierarhcy of job.properties.erb files. The
|
56
|
+
job.properties.erb files (one of them) is expected to include the follow
|
57
|
+
variable substitution:
|
58
|
+
|
59
|
+
FILE: job.properties.erb -------------
|
60
|
+
# Embed current job and run properties here
|
61
|
+
<%= job[:properties] %>
|
62
|
+
|
63
|
+
PWD=${drivers}/scenarios/${scenario}
|
64
|
+
oozie.coord.application.path=${PWD}/coordinator.xml
|
65
|
+
completion_flags=${drivers}/${driver}/${scenario}
|
66
|
+
|
67
|
+
The "<%= job[:properties %>" variable expansion inserts the properties
|
68
|
+
section for the particular job you name in the run_job command:
|
69
|
+
|
70
|
+
$ cd drivers/testbench
|
71
|
+
$ hodor oozie:run_job my_test_driver
|
72
|
+
|
73
|
+
The above command loads the jobs.yml file from the current directory,
|
74
|
+
and uses your "my_test_driver" argument to determine which yml section
|
75
|
+
to use. The properties key from that section is then used to dynamically
|
76
|
+
compose a combined job.properties file, that replaces the
|
77
|
+
"<%= job[:properties] %>" with the properties for "my_test_driver".
|
78
|
+
|
79
|
+
So, both the run_job command and deploy_job command use different key/value
|
80
|
+
pairs within the same section of the jobs.yml file as input to their
|
81
|
+
processing.
|
82
|
+
|
83
|
+
Supporting Workflows Applications
|
84
|
+
---------------------------------
|
85
|
+
The previous example forces use of a coordinator application via its
|
86
|
+
definition:
|
87
|
+
|
88
|
+
oozie.coord.application.path=${PWD}/coordinator.xml
|
89
|
+
|
90
|
+
But what if you want your job to be a workflow application instead of
|
91
|
+
a coordinator. In that case, modify your job.properties.erb file as
|
92
|
+
follows:
|
93
|
+
|
94
|
+
<% if job.has_key?(:postfix) %>
|
95
|
+
<%= job[:postfix] %>
|
96
|
+
<% else %>
|
97
|
+
PWD=${drivers}/scenarios/${scenario}
|
98
|
+
oozie.coord.application.path=${PWD}/coordinator.xml
|
99
|
+
completion_flags=${drivers}/${driver}/${scenario}
|
100
|
+
<% end %>
|
101
|
+
|
102
|
+
This allows you to pass in a postfix if you want to use something other
|
103
|
+
than the standard coordinator application definition. Note: the term
|
104
|
+
'postfix' is not a special term. It can be any name as long as you define
|
105
|
+
it in the jobs.yml file as follows:
|
106
|
+
|
107
|
+
adhoc:
|
108
|
+
depends:
|
109
|
+
properties: |
|
110
|
+
run_query=guest/show_tables.hql
|
111
|
+
postfix: |
|
112
|
+
PWD=${drivers}/hivebox
|
113
|
+
oozie.wf.application.path=${PWD}/query.xml
|
114
|
+
|
115
|
+
|
116
|
+
Using "Launch Markers"
|
117
|
+
----------------------
|
118
|
+
Another option for specifying which jobs.yml section to use for
|
119
|
+
deploying and running a job is to use launch markers. Instead of passing
|
120
|
+
a job name as an argument to the "oozie:deploy_job" and "oozie:run_job"
|
121
|
+
command, you can modify the jobs.yml file with launch markers:
|
122
|
+
|
123
|
+
^my_test_driver:
|
124
|
+
deploy: workers/my_test_workflow
|
125
|
+
properties: |
|
126
|
+
scenario=hourly/incremental
|
127
|
+
driver=testbench/my_test_driver
|
128
|
+
sla_events=start_miss
|
129
|
+
startTime=2015-10-30T13:26Z
|
130
|
+
endTime=2015-10-30T13:45Z
|
131
|
+
|
132
|
+
another_test_driver:
|
133
|
+
deploy: workers/ingestion_flow.xml
|
134
|
+
properties: |
|
135
|
+
scenario=hourly/incremental
|
136
|
+
driver=testbench/another_test_driver
|
137
|
+
sla_events=duration_miss
|
138
|
+
startTime=2015-10-30T13:26Z
|
139
|
+
endTime=2015-10-30T13:45Z
|
140
|
+
|
141
|
+
Note the '^' symbol in front of "my_test_driver". This indicates to
|
142
|
+
"oozie:deploy_job" and "oozie:run_job" that this job section is
|
143
|
+
active. So, instead of specifying the job name on the command line,
|
144
|
+
a short-hand is possible:
|
145
|
+
|
146
|
+
$ cd drivers/testbench
|
147
|
+
$ hodor oozie:deploy_job # deploys the marked job
|
148
|
+
$ hodor oozie:deploy_job -c # alternate that does a clean deploy
|
149
|
+
$ hodor oozie:run_job # runs the marked job
|
150
|
+
|
151
|
+
Silencing Git
|
152
|
+
-------------
|
153
|
+
One minor annoyance with the "jobs.yml" approach, is that the file will
|
154
|
+
change in ways that shouldn't be commited to the Git master. For example,
|
155
|
+
if you want to change the start and end time property values, so you can
|
156
|
+
rerun a workflow for a different time period, you don't necessarily want
|
157
|
+
to check that in. Moreover, if you use launch markers, you don't want those
|
158
|
+
to being commited to master either. But anytime the jobs.yml file is
|
159
|
+
edited for either of these purposes, Git is going to bug you about
|
160
|
+
committing your changes.
|
161
|
+
|
162
|
+
This is optional, but if you want Git to ignore launch marker and
|
163
|
+
time edits within the jobs.yml file, this is possible using "Git
|
164
|
+
Attributes". This is a little known but highly useful feature of Git
|
165
|
+
covered here:
|
166
|
+
|
167
|
+
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes
|
168
|
+
|
169
|
+
To utilize Git attributes to silence Git's baggering about these "throw-away"
|
170
|
+
edits, do the following:
|
171
|
+
|
172
|
+
$ cd drivers
|
173
|
+
$ cat << HERE >> .gitattributes
|
174
|
+
jobs.yml filter=clean_jobs_yml
|
175
|
+
HERE
|
176
|
+
$ cd <repo_root> # root of your hadoop project's git repo
|
177
|
+
$ cat << HERE >> .git/config
|
178
|
+
[include]
|
179
|
+
path = ../.gitconfig
|
180
|
+
[HERE]
|
181
|
+
$ cat << HERE >> .gitconfig
|
182
|
+
[filter "clean_jobs_yml"]
|
183
|
+
clean = "perl -pe \"s/^\\^//g; s/ime=20\\d\\d-\\d\\d-\\d\\d.*$/ime=<dynamic>/g\""
|
184
|
+
smudge = cat
|
185
|
+
[HERE]
|
@@ -0,0 +1,43 @@
|
|
1
|
+
Hodor's Oozie namespace provides a scriptable and easy-to-use interface to the Oozie server running
|
2
|
+
on the target Hadoop cluster, and the workflows and coordinator jobs it is executing. Using the
|
3
|
+
commands in this namespace, you can run oozie jobs, inspect their progress, diagnose failures,
|
4
|
+
and kill oozie jobs, without shelling into remote machines. While many of these capabilities are
|
5
|
+
afforded by graphical interfaces in the Hadoop ecosystem (i.e. Hue), Hodor's Oozie interface has
|
6
|
+
several major advantages. First, Hodor's Oozie interface is more compatible with Git and modern
|
7
|
+
software development practices, allowing you to commit your Oozie workflows to GitHub and utilize
|
8
|
+
its teamwork features, such as branch commenting, peer reviews, pull requests etc. In addition,
|
9
|
+
Hodor's dynamic cluster targetting and variable expansion system (via clusters.yml and jobs.yml
|
10
|
+
files), enable you to build Oozie workflows and coordinators that can be easily and transparently
|
11
|
+
retargetted to multiple Hadoop clusters.
|
12
|
+
|
13
|
+
The Oozie namespace implements several core concepts, such as the notion of "current job",
|
14
|
+
which is the foundation on which the "oozie:change_job" and "oozie:display_job" commands
|
15
|
+
operate. Other concepts central to the Oozie namespace include "worker and driver workflows",
|
16
|
+
"scenarios", the "jobs.yml" file etc. Understanding these concepts will go a long way
|
17
|
+
toward understanding the behavior of the commands within the Oozie namespace. There are two
|
18
|
+
ways to get more information about these core Oozie "topics". First, you can run the
|
19
|
+
"oozie:topic <title>" command to display the help page for a particular topic. The "HELP
|
20
|
+
TOPICS" section (shown next) provides more details about what topics are available and how to
|
21
|
+
view them. You can also run the "oozie:topics" command to see a list of available topics.
|
22
|
+
|
23
|
+
The other way to get assistance with Oozie topics is to study Hodor's rspec test suite. The
|
24
|
+
test_repo, located at spec/test_repo, is an example Hadoop git repo that adheres to and
|
25
|
+
implements the various conventions and concepts discussed within the Oozie topics pages. So,
|
26
|
+
the topics page will provide you with an explanation, and the test_repo an illustration.
|
27
|
+
|
28
|
+
HELP TOPICS:
|
29
|
+
------------
|
30
|
+
* Inspecting Jobs - to view help for how to inspect Oozie jobs, type:
|
31
|
+
$ hodor oozie:topic inspecting_jobs
|
32
|
+
* Composing Job Properties - to view help on the job.property hierarchy, type:
|
33
|
+
$ hodor oozie:topic composing_job_properties
|
34
|
+
* Workers and Drivers - to view help on worker versus driver workflows, type:
|
35
|
+
$ hodor oozie:topic workers_and_drivers
|
36
|
+
* Driver Scenarios - to view help on driver "scenarios", type:
|
37
|
+
$ hodor oozie:topic driver_scenarios
|
38
|
+
* Blocking Coordinators - to view help on blocking vs non-blocking coordinators, type:
|
39
|
+
$ hodor oozie:topic blocking_coordinators
|
40
|
+
* Deploying and Running jobs - for information about the jobs.yml file, type:
|
41
|
+
$ hodor oozie:topic jobs.yml
|
42
|
+
|
43
|
+
\x5
|
@@ -0,0 +1,40 @@
|
|
1
|
+
Kinds of Oozie Jobs: Workers versus Drivers
|
2
|
+
---------------------------------------------------------------------------------
|
3
|
+
The are two distinct and toplevel concerns when dealing with oozie workflows:
|
4
|
+
|
5
|
+
1. Defining the data flows and how each transforms and produces data
|
6
|
+
2. Giving these independent data flows a context and schedule to run on
|
7
|
+
|
8
|
+
A "worker" is an Oozie workflow that does the former. It isn't concerned about
|
9
|
+
what context it runs within, how many times it has retried, whether SLA alerts
|
10
|
+
are being reported on its results, when it runs etc. It does one straight-forward
|
11
|
+
job: translate input data to output data.
|
12
|
+
|
13
|
+
A "driver" is an Oozie workflow and coordinator pair, that runs one or more
|
14
|
+
workers as sub-workflows, passing them the aforementioned context as parameters.
|
15
|
+
Drivers concern themselves with everthing workers do not, like what order
|
16
|
+
multiple workers should run in, reporting SLA violations when its child workers
|
17
|
+
fail, deciding between an hourly or daily run schedule etc.
|
18
|
+
|
19
|
+
Hodor expects your Hadoop project get repo to be structured as follows:
|
20
|
+
|
21
|
+
<git_repo>
|
22
|
+
- workers/
|
23
|
+
- w1/
|
24
|
+
workflow.xml
|
25
|
+
hive_scripts
|
26
|
+
etc
|
27
|
+
- w2
|
28
|
+
workflow.xml
|
29
|
+
hive_scripts
|
30
|
+
etc.
|
31
|
+
- drivers/
|
32
|
+
- d1/
|
33
|
+
workflow.xml
|
34
|
+
- d2/
|
35
|
+
workflow.xml
|
36
|
+
|
37
|
+
|
38
|
+
The workers directory contains all workers, organized as you see fit. While the
|
39
|
+
drivers directory contains all drivers, also organized according to preference.
|
40
|
+
|
metadata
ADDED
@@ -0,0 +1,455 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hodor
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dean Hallman
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-02-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.19.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.19.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: log4r
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: open4
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: terminal-table
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: awesome_print
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: bundler
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.7'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.7'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '10.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '10.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: byebug
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rest-client
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: chronic
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: ox
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: rspec
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: wrong
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: simplecov
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: ruby-lint
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: rubocop
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: rspec-nc
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '0'
|
244
|
+
type: :development
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
251
|
+
- !ruby/object:Gem::Dependency
|
252
|
+
name: guard
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
254
|
+
requirements:
|
255
|
+
- - ">="
|
256
|
+
- !ruby/object:Gem::Version
|
257
|
+
version: '0'
|
258
|
+
type: :development
|
259
|
+
prerelease: false
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
261
|
+
requirements:
|
262
|
+
- - ">="
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: '0'
|
265
|
+
- !ruby/object:Gem::Dependency
|
266
|
+
name: guard-rspec
|
267
|
+
requirement: !ruby/object:Gem::Requirement
|
268
|
+
requirements:
|
269
|
+
- - ">="
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: '0'
|
272
|
+
type: :development
|
273
|
+
prerelease: false
|
274
|
+
version_requirements: !ruby/object:Gem::Requirement
|
275
|
+
requirements:
|
276
|
+
- - ">="
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
version: '0'
|
279
|
+
- !ruby/object:Gem::Dependency
|
280
|
+
name: pry
|
281
|
+
requirement: !ruby/object:Gem::Requirement
|
282
|
+
requirements:
|
283
|
+
- - ">="
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: '0'
|
286
|
+
type: :development
|
287
|
+
prerelease: false
|
288
|
+
version_requirements: !ruby/object:Gem::Requirement
|
289
|
+
requirements:
|
290
|
+
- - ">="
|
291
|
+
- !ruby/object:Gem::Version
|
292
|
+
version: '0'
|
293
|
+
- !ruby/object:Gem::Dependency
|
294
|
+
name: pry-remote
|
295
|
+
requirement: !ruby/object:Gem::Requirement
|
296
|
+
requirements:
|
297
|
+
- - ">="
|
298
|
+
- !ruby/object:Gem::Version
|
299
|
+
version: '0'
|
300
|
+
type: :development
|
301
|
+
prerelease: false
|
302
|
+
version_requirements: !ruby/object:Gem::Requirement
|
303
|
+
requirements:
|
304
|
+
- - ">="
|
305
|
+
- !ruby/object:Gem::Version
|
306
|
+
version: '0'
|
307
|
+
- !ruby/object:Gem::Dependency
|
308
|
+
name: pry-nav
|
309
|
+
requirement: !ruby/object:Gem::Requirement
|
310
|
+
requirements:
|
311
|
+
- - ">="
|
312
|
+
- !ruby/object:Gem::Version
|
313
|
+
version: '0'
|
314
|
+
type: :development
|
315
|
+
prerelease: false
|
316
|
+
version_requirements: !ruby/object:Gem::Requirement
|
317
|
+
requirements:
|
318
|
+
- - ">="
|
319
|
+
- !ruby/object:Gem::Version
|
320
|
+
version: '0'
|
321
|
+
description: Hodor is a ruby-based framework, API and Command Line Interface that
|
322
|
+
automates and simplifies the way you specify, deploy, debug and administer Hadoop
|
323
|
+
and Oozie solutions. Hadoop lacks a mature toolchain to manage a codebase with modern
|
324
|
+
software development discipline. To address this need, Hodor comprises a combination
|
325
|
+
of tools and conventions that enable in the Hadoop environment many of the modern
|
326
|
+
software development practices, and deployment facilities we take for granted in
|
327
|
+
normal software development.
|
328
|
+
email:
|
329
|
+
- rdhallman@gmail.com
|
330
|
+
executables:
|
331
|
+
- hodor
|
332
|
+
extensions: []
|
333
|
+
extra_rdoc_files: []
|
334
|
+
files:
|
335
|
+
- ".gitignore"
|
336
|
+
- ".gitmodules"
|
337
|
+
- ".rspec"
|
338
|
+
- ".ruby-gemset"
|
339
|
+
- ".ruby-version"
|
340
|
+
- ".travis.yml"
|
341
|
+
- Gemfile
|
342
|
+
- Guardfile
|
343
|
+
- README.md
|
344
|
+
- Rakefile
|
345
|
+
- bin/hodor
|
346
|
+
- hodor.gemspec
|
347
|
+
- lib/config/log4r_config.xml
|
348
|
+
- lib/hodor.rb
|
349
|
+
- lib/hodor/api/hdfs.rb
|
350
|
+
- lib/hodor/api/oozie.rb
|
351
|
+
- lib/hodor/api/oozie/action.rb
|
352
|
+
- lib/hodor/api/oozie/bundle.rb
|
353
|
+
- lib/hodor/api/oozie/coordinator.rb
|
354
|
+
- lib/hodor/api/oozie/hadoop_job.rb
|
355
|
+
- lib/hodor/api/oozie/job.rb
|
356
|
+
- lib/hodor/api/oozie/materialization.rb
|
357
|
+
- lib/hodor/api/oozie/query.rb
|
358
|
+
- lib/hodor/api/oozie/session.rb
|
359
|
+
- lib/hodor/api/oozie/workflow.rb
|
360
|
+
- lib/hodor/cli.rb
|
361
|
+
- lib/hodor/command.rb
|
362
|
+
- lib/hodor/configuration.rb
|
363
|
+
- lib/hodor/environment.rb
|
364
|
+
- lib/hodor/ui/table.rb
|
365
|
+
- lib/hodor/version.rb
|
366
|
+
- lib/tasks/hdfs.thor
|
367
|
+
- lib/tasks/master.thor
|
368
|
+
- lib/tasks/oozie.thor
|
369
|
+
- lib/tasks/sandbox.thor
|
370
|
+
- spec/integration/api/oozie/action_spec.rb
|
371
|
+
- spec/integration/api/oozie/bundle_spec.rb
|
372
|
+
- spec/integration/api/oozie/coordinator_spec.rb
|
373
|
+
- spec/integration/api/oozie/hadoop_job_spec.rb
|
374
|
+
- spec/integration/api/oozie/job_spec.rb
|
375
|
+
- spec/integration/api/oozie/materialization_spec.rb
|
376
|
+
- spec/integration/api/oozie/query_spec.rb
|
377
|
+
- spec/integration/api/oozie/session_spec.rb
|
378
|
+
- spec/integration/api/oozie/workflow_spec.rb
|
379
|
+
- spec/integration/api/oozie_spec.rb
|
380
|
+
- spec/integration/fixtures/api/running_coordinators/req_resp_00.memo
|
381
|
+
- spec/integration/fixtures/api/sample_action/req_resp_00.memo
|
382
|
+
- spec/integration/fixtures/api/sample_action/req_resp_01.memo
|
383
|
+
- spec/integration/fixtures/api/sample_bundle/req_resp_00.memo
|
384
|
+
- spec/integration/fixtures/api/sample_coordinator/req_resp_00.memo
|
385
|
+
- spec/integration/fixtures/api/sample_materialization/req_resp_00.memo
|
386
|
+
- spec/integration/fixtures/api/sample_materialization/req_resp_01.memo
|
387
|
+
- spec/integration/fixtures/api/sample_workflow/req_resp_00.memo
|
388
|
+
- spec/spec_helper.rb
|
389
|
+
- spec/support/d_v_r.rb
|
390
|
+
- spec/support/hodor_api.rb
|
391
|
+
- spec/unit/hodor/api/hdfs_spec.rb
|
392
|
+
- spec/unit/hodor/api/oozie_spec.rb
|
393
|
+
- spec/unit/hodor/environment_spec.rb
|
394
|
+
- topics/hdfs/corresponding_paths.txt
|
395
|
+
- topics/hdfs/overview.txt
|
396
|
+
- topics/master/clusters.yml.txt
|
397
|
+
- topics/master/overview.txt
|
398
|
+
- topics/oozie/blocking_coordinators.txt
|
399
|
+
- topics/oozie/composing_job_properties.txt
|
400
|
+
- topics/oozie/display_job.txt
|
401
|
+
- topics/oozie/driver_scenarios.txt
|
402
|
+
- topics/oozie/inspecting_jobs.txt
|
403
|
+
- topics/oozie/jobs.yml.txt
|
404
|
+
- topics/oozie/overview.txt
|
405
|
+
- topics/oozie/workers_and_drivers.txt
|
406
|
+
homepage: ''
|
407
|
+
licenses:
|
408
|
+
- MIT
|
409
|
+
metadata: {}
|
410
|
+
post_install_message:
|
411
|
+
rdoc_options: []
|
412
|
+
require_paths:
|
413
|
+
- lib
|
414
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
415
|
+
requirements:
|
416
|
+
- - ">="
|
417
|
+
- !ruby/object:Gem::Version
|
418
|
+
version: '0'
|
419
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
420
|
+
requirements:
|
421
|
+
- - ">="
|
422
|
+
- !ruby/object:Gem::Version
|
423
|
+
version: '0'
|
424
|
+
requirements: []
|
425
|
+
rubyforge_project:
|
426
|
+
rubygems_version: 2.5.2
|
427
|
+
signing_key:
|
428
|
+
specification_version: 4
|
429
|
+
summary: Manages Hadoop and Oozie data pipelines, through development, testing, deployment
|
430
|
+
and monitoring
|
431
|
+
test_files:
|
432
|
+
- spec/integration/api/oozie/action_spec.rb
|
433
|
+
- spec/integration/api/oozie/bundle_spec.rb
|
434
|
+
- spec/integration/api/oozie/coordinator_spec.rb
|
435
|
+
- spec/integration/api/oozie/hadoop_job_spec.rb
|
436
|
+
- spec/integration/api/oozie/job_spec.rb
|
437
|
+
- spec/integration/api/oozie/materialization_spec.rb
|
438
|
+
- spec/integration/api/oozie/query_spec.rb
|
439
|
+
- spec/integration/api/oozie/session_spec.rb
|
440
|
+
- spec/integration/api/oozie/workflow_spec.rb
|
441
|
+
- spec/integration/api/oozie_spec.rb
|
442
|
+
- spec/integration/fixtures/api/running_coordinators/req_resp_00.memo
|
443
|
+
- spec/integration/fixtures/api/sample_action/req_resp_00.memo
|
444
|
+
- spec/integration/fixtures/api/sample_action/req_resp_01.memo
|
445
|
+
- spec/integration/fixtures/api/sample_bundle/req_resp_00.memo
|
446
|
+
- spec/integration/fixtures/api/sample_coordinator/req_resp_00.memo
|
447
|
+
- spec/integration/fixtures/api/sample_materialization/req_resp_00.memo
|
448
|
+
- spec/integration/fixtures/api/sample_materialization/req_resp_01.memo
|
449
|
+
- spec/integration/fixtures/api/sample_workflow/req_resp_00.memo
|
450
|
+
- spec/spec_helper.rb
|
451
|
+
- spec/support/d_v_r.rb
|
452
|
+
- spec/support/hodor_api.rb
|
453
|
+
- spec/unit/hodor/api/hdfs_spec.rb
|
454
|
+
- spec/unit/hodor/api/oozie_spec.rb
|
455
|
+
- spec/unit/hodor/environment_spec.rb
|