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