hodor 1.0.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.
- 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
|