hodor 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +2 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +5 -0
  8. data/Gemfile +4 -0
  9. data/Guardfile +11 -0
  10. data/README.md +105 -0
  11. data/Rakefile +105 -0
  12. data/bin/hodor +18 -0
  13. data/hodor.gemspec +47 -0
  14. data/lib/config/log4r_config.xml +35 -0
  15. data/lib/hodor.rb +83 -0
  16. data/lib/hodor/api/hdfs.rb +222 -0
  17. data/lib/hodor/api/oozie.rb +215 -0
  18. data/lib/hodor/api/oozie/action.rb +52 -0
  19. data/lib/hodor/api/oozie/bundle.rb +27 -0
  20. data/lib/hodor/api/oozie/coordinator.rb +53 -0
  21. data/lib/hodor/api/oozie/hadoop_job.rb +29 -0
  22. data/lib/hodor/api/oozie/job.rb +192 -0
  23. data/lib/hodor/api/oozie/materialization.rb +56 -0
  24. data/lib/hodor/api/oozie/query.rb +115 -0
  25. data/lib/hodor/api/oozie/session.rb +170 -0
  26. data/lib/hodor/api/oozie/workflow.rb +58 -0
  27. data/lib/hodor/cli.rb +146 -0
  28. data/lib/hodor/command.rb +164 -0
  29. data/lib/hodor/configuration.rb +80 -0
  30. data/lib/hodor/environment.rb +437 -0
  31. data/lib/hodor/ui/table.rb +130 -0
  32. data/lib/hodor/version.rb +3 -0
  33. data/lib/tasks/hdfs.thor +138 -0
  34. data/lib/tasks/master.thor +61 -0
  35. data/lib/tasks/oozie.thor +399 -0
  36. data/lib/tasks/sandbox.thor +87 -0
  37. data/spec/integration/api/oozie/action_spec.rb +69 -0
  38. data/spec/integration/api/oozie/bundle_spec.rb +33 -0
  39. data/spec/integration/api/oozie/coordinator_spec.rb +66 -0
  40. data/spec/integration/api/oozie/hadoop_job_spec.rb +29 -0
  41. data/spec/integration/api/oozie/job_spec.rb +15 -0
  42. data/spec/integration/api/oozie/materialization_spec.rb +66 -0
  43. data/spec/integration/api/oozie/query_spec.rb +43 -0
  44. data/spec/integration/api/oozie/session_spec.rb +18 -0
  45. data/spec/integration/api/oozie/workflow_spec.rb +65 -0
  46. data/spec/integration/api/oozie_spec.rb +198 -0
  47. data/spec/integration/fixtures/api/running_coordinators/req_resp_00.memo +6 -0
  48. data/spec/integration/fixtures/api/sample_action/req_resp_00.memo +5 -0
  49. data/spec/integration/fixtures/api/sample_action/req_resp_01.memo +7 -0
  50. data/spec/integration/fixtures/api/sample_bundle/req_resp_00.memo +6 -0
  51. data/spec/integration/fixtures/api/sample_coordinator/req_resp_00.memo +5 -0
  52. data/spec/integration/fixtures/api/sample_materialization/req_resp_00.memo +5 -0
  53. data/spec/integration/fixtures/api/sample_materialization/req_resp_01.memo +7 -0
  54. data/spec/integration/fixtures/api/sample_workflow/req_resp_00.memo +5 -0
  55. data/spec/spec_helper.rb +92 -0
  56. data/spec/support/d_v_r.rb +125 -0
  57. data/spec/support/hodor_api.rb +15 -0
  58. data/spec/unit/hodor/api/hdfs_spec.rb +63 -0
  59. data/spec/unit/hodor/api/oozie_spec.rb +32 -0
  60. data/spec/unit/hodor/environment_spec.rb +52 -0
  61. data/topics/hdfs/corresponding_paths.txt +31 -0
  62. data/topics/hdfs/overview.txt +10 -0
  63. data/topics/master/clusters.yml.txt +36 -0
  64. data/topics/master/overview.txt +17 -0
  65. data/topics/oozie/blocking_coordinators.txt +46 -0
  66. data/topics/oozie/composing_job_properties.txt +68 -0
  67. data/topics/oozie/display_job.txt +52 -0
  68. data/topics/oozie/driver_scenarios.txt +42 -0
  69. data/topics/oozie/inspecting_jobs.txt +59 -0
  70. data/topics/oozie/jobs.yml.txt +185 -0
  71. data/topics/oozie/overview.txt +43 -0
  72. data/topics/oozie/workers_and_drivers.txt +40 -0
  73. 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