mortar 0.15.36 → 0.15.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mortar/command/base.rb +2 -2
- data/lib/mortar/command/config.rb +52 -11
- data/lib/mortar/command/jobs.rb +1 -1
- data/lib/mortar/command/local.rb +1 -136
- data/lib/mortar/command/spark.rb +26 -57
- data/lib/mortar/local/controller.rb +2 -31
- data/lib/mortar/local/pig.rb +1 -1
- data/lib/mortar/pigversion.rb +52 -43
- data/lib/mortar/version.rb +1 -1
- data/spec/mortar/command/base_spec.rb +2 -2
- data/spec/mortar/command/config_spec.rb +63 -0
- data/spec/mortar/command/describe_spec.rb +4 -4
- data/spec/mortar/command/illustrate_spec.rb +7 -7
- data/spec/mortar/command/jobs_spec.rb +61 -13
- data/spec/mortar/command/local_spec.rb +9 -234
- data/spec/mortar/command/validate_spec.rb +2 -2
- data/spec/mortar/local/controller_spec.rb +7 -41
- data/spec/mortar/local/pig_spec.rb +29 -30
- metadata +5 -8
- data/lib/mortar/local/sqoop.rb +0 -162
- data/lib/mortar/templates/script/sqoop.sh +0 -40
- data/spec/mortar/local/sqoop_spec.rb +0 -57
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mortar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.15.
|
4
|
+
version: 0.15.37
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mortar Data
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.8.
|
33
|
+
version: 0.8.14
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.8.
|
40
|
+
version: 0.8.14
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: netrc
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -249,7 +249,6 @@ files:
|
|
249
249
|
- lib/mortar/local/params.rb
|
250
250
|
- lib/mortar/local/pig.rb
|
251
251
|
- lib/mortar/local/python.rb
|
252
|
-
- lib/mortar/local/sqoop.rb
|
253
252
|
- lib/mortar/pigversion.rb
|
254
253
|
- lib/mortar/plugin.rb
|
255
254
|
- lib/mortar/project.rb
|
@@ -304,7 +303,6 @@ files:
|
|
304
303
|
- lib/mortar/templates/script/runpig.sh
|
305
304
|
- lib/mortar/templates/script/runpython.sh
|
306
305
|
- lib/mortar/templates/script/runstillson.sh
|
307
|
-
- lib/mortar/templates/script/sqoop.sh
|
308
306
|
- lib/mortar/templates/udf/python_udf.py
|
309
307
|
- lib/mortar/updater.rb
|
310
308
|
- lib/mortar/version.rb
|
@@ -337,7 +335,6 @@ files:
|
|
337
335
|
- spec/mortar/local/params_spec.rb
|
338
336
|
- spec/mortar/local/pig_spec.rb
|
339
337
|
- spec/mortar/local/python_spec.rb
|
340
|
-
- spec/mortar/local/sqoop_spec.rb
|
341
338
|
- spec/mortar/plugin_spec.rb
|
342
339
|
- spec/mortar/project_spec.rb
|
343
340
|
- spec/mortar/s3_spec.rb
|
@@ -365,7 +362,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
365
362
|
version: '0'
|
366
363
|
requirements: []
|
367
364
|
rubyforge_project:
|
368
|
-
rubygems_version: 2.4.
|
365
|
+
rubygems_version: 2.4.8
|
369
366
|
signing_key:
|
370
367
|
specification_version: 4
|
371
368
|
summary: Client library and CLI to interact with the Mortar service.
|
data/lib/mortar/local/sqoop.rb
DELETED
@@ -1,162 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright 2012 Mortar Data Inc.
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
15
|
-
#
|
16
|
-
|
17
|
-
require "erb"
|
18
|
-
require 'tempfile'
|
19
|
-
require "mortar/helpers"
|
20
|
-
require "mortar/local/installutil"
|
21
|
-
|
22
|
-
class Mortar::Local::Sqoop
|
23
|
-
include Mortar::Local::InstallUtil
|
24
|
-
include Mortar::Helpers
|
25
|
-
|
26
|
-
def install_or_update
|
27
|
-
@command = "#{local_install_directory}/python/bin/python"
|
28
|
-
if should_do_install?
|
29
|
-
action "Installing sqoop to #{local_install_directory_name}" do
|
30
|
-
do_install
|
31
|
-
end
|
32
|
-
elsif should_do_update?
|
33
|
-
action "Updating to latest sqoop in #{local_install_directory_name}" do
|
34
|
-
do_install
|
35
|
-
end
|
36
|
-
end
|
37
|
-
true
|
38
|
-
end
|
39
|
-
|
40
|
-
def sqoop_url
|
41
|
-
default_url = full_host + "/" + "resource/sqoop"
|
42
|
-
return ENV.fetch('SQOOP_DISTRO_URL', default_url)
|
43
|
-
end
|
44
|
-
|
45
|
-
def should_do_install?
|
46
|
-
return (not (File.exists?(sqoop_directory)))
|
47
|
-
end
|
48
|
-
|
49
|
-
def should_do_update?
|
50
|
-
return is_newer_version('sqoop', sqoop_url)
|
51
|
-
end
|
52
|
-
|
53
|
-
def sqoop_directory
|
54
|
-
return "#{local_install_directory}/sqoop"
|
55
|
-
end
|
56
|
-
|
57
|
-
def sqoop_dir_in_tgz
|
58
|
-
"sqoop-1.4.4-mortar"
|
59
|
-
end
|
60
|
-
|
61
|
-
def do_install
|
62
|
-
local_tgz = File.join(local_install_directory, "sqoop-1.4.4-mortar.tar.gz")
|
63
|
-
if File.exists?(local_tgz)
|
64
|
-
FileUtils.rm(local_tgz)
|
65
|
-
end
|
66
|
-
download_file(sqoop_url, local_tgz)
|
67
|
-
|
68
|
-
if File.exists?(sqoop_directory)
|
69
|
-
FileUtils.rm_rf(sqoop_directory)
|
70
|
-
end
|
71
|
-
|
72
|
-
extract_tgz(local_tgz, local_install_directory)
|
73
|
-
|
74
|
-
FileUtils.mv(File.join(local_install_directory, sqoop_dir_in_tgz), sqoop_directory)
|
75
|
-
|
76
|
-
# This has been seening coming out of the tgz w/o +x so we do
|
77
|
-
# here to be sure it has the necessary permissions
|
78
|
-
FileUtils.chmod(0755, "#{sqoop_directory}/bin/sqoop")
|
79
|
-
FileUtils.chmod(0755, "#{sqoop_directory}/hadoop/bin/hadoop")
|
80
|
-
|
81
|
-
File.delete(local_tgz)
|
82
|
-
note_install("sqoop")
|
83
|
-
end
|
84
|
-
|
85
|
-
def sqoop_command_script_template_path
|
86
|
-
File.expand_path("../../templates/script/sqoop.sh", __FILE__)
|
87
|
-
end
|
88
|
-
|
89
|
-
def hadoop_home
|
90
|
-
"#{sqoop_directory}/hadoop"
|
91
|
-
end
|
92
|
-
|
93
|
-
def export(connstr, s3dest, options)
|
94
|
-
template_params = sqoop_export_template_parameters(connstr, s3dest, options)
|
95
|
-
return run_templated_script(sqoop_command_script_template_path, template_params)
|
96
|
-
end
|
97
|
-
|
98
|
-
def sqoop_export_template_parameters(connstr, s3dest, options)
|
99
|
-
pig = Mortar::Local::Pig.new()
|
100
|
-
parameters = {
|
101
|
-
"sqoop_dir" => sqoop_directory,
|
102
|
-
"jdb_conn_string" => connstr,
|
103
|
-
"destination" => s3dest,
|
104
|
-
"hadoop_home" => hadoop_home,
|
105
|
-
"classpath" => pig.template_params_classpath,
|
106
|
-
"postgres_jar" => "#{pig.lib_directory}/lib-cluster/postgresql.jar",
|
107
|
-
"jdbc_conn" => connstr,
|
108
|
-
"s3dest" => s3dest,
|
109
|
-
"project_root" => project_root,
|
110
|
-
"sqoop_opts" => sqoop_java_options
|
111
|
-
}
|
112
|
-
parameters["dbtable"] = options[:dbtable] if options[:dbtable]
|
113
|
-
parameters["sqlquery"] = options[:sqlquery] if options[:sqlquery]
|
114
|
-
parameters["inc_column"] = options[:inc_column] if options[:inc_column]
|
115
|
-
parameters["inc_value"] = options[:inc_value] if options[:inc_value]
|
116
|
-
if options[:inc_value] and 0 == options[:inc_value].to_i
|
117
|
-
parameters[:inc_mode] = "lastmodified"
|
118
|
-
elsif options[:inc_value]
|
119
|
-
parameters[:inc_mode] = "append"
|
120
|
-
end
|
121
|
-
parameters["dbuser"] = options[:username] if options[:username]
|
122
|
-
parameters["dbpass"] = options[:password] if options[:password]
|
123
|
-
parameters["jdbcdriver"] = options[:jdbcdriver] if options[:jdbcdriver]
|
124
|
-
parameters["driverjar"] = options[:driverjar] if options[:driverjar]
|
125
|
-
parameters["direct_import"] = true if options[:direct]
|
126
|
-
return parameters
|
127
|
-
end
|
128
|
-
|
129
|
-
def sqoop_java_options
|
130
|
-
opts = {}
|
131
|
-
opts['fs.s3n.awsAccessKeyId'] = ENV['AWS_ACCESS_KEY']
|
132
|
-
opts['fs.s3n.awsSecretAccessKey'] = ENV['AWS_SECRET_KEY']
|
133
|
-
opts['fs.s3.awsAccessKeyId'] = ENV['AWS_ACCESS_KEY']
|
134
|
-
opts['fs.s3.awsSecretAccessKey'] = ENV['AWS_SECRET_KEY']
|
135
|
-
opts['fs.s3.impl'] = 'org.apache.hadoop.fs.s3native.NativeS3FileSystem'
|
136
|
-
opts['fs.s3n.impl'] = 'org.apache.hadoop.fs.s3native.NativeS3FileSystem'
|
137
|
-
return opts
|
138
|
-
end
|
139
|
-
|
140
|
-
# So this part kind of sucks. In order to partition a query across multiple map
|
141
|
-
# reduce tasks sqoop does a query to to find the range of identifiying values,
|
142
|
-
# divides this range across the number of tasks to be executed and then modifies
|
143
|
-
# the query for each m/r task. To do this Sqoop needs to know at what point in the
|
144
|
-
# query that it should place its portion of the where clause. This is done via the
|
145
|
-
# $CONDITIONS marker. So that's well and good when you're running sqoop on a cluster
|
146
|
-
# but our users will be running on their own machine and don't know or care for this
|
147
|
-
# parrallel queries stuff. So to make their lives easier we make a best effort to
|
148
|
-
# add the clause for them in a safe way.
|
149
|
-
def prep_query(original_query)
|
150
|
-
if original_query.include? "$CONDITIONS"
|
151
|
-
return original_query
|
152
|
-
elsif original_query.downcase.include? "where"
|
153
|
-
idxwhere = original_query.downcase.index("where")
|
154
|
-
select_where = original_query[0..idxwhere+"where".length-1]
|
155
|
-
clause = original_query[idxwhere+"where".length+1..original_query.length]
|
156
|
-
return "#{select_where} (#{clause}) AND \$CONDITIONS"
|
157
|
-
else
|
158
|
-
return "#{original_query} WHERE \$CONDITIONS"
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
set -e
|
4
|
-
|
5
|
-
export HADOOP_CLASSPATH="<%= @project_root %>/lib/*:<%= @postgres_jar %>"
|
6
|
-
<% if @driverjar %>
|
7
|
-
export HADOOP_CLASSPATH="$HADOOP_CLASSPATH:<%= @driverjar %>"
|
8
|
-
<% end %>
|
9
|
-
export HADOOP_COMMON_HOME="<%= @hadoop_home %>"
|
10
|
-
export HADOOP_MAPRED_HOME="<%= @hadoop_home %>"
|
11
|
-
export HADOOP_HOME_WARN_SUPPRESS="t"
|
12
|
-
|
13
|
-
# Only setting these to get rid of warnings that sqoop is showing
|
14
|
-
export HCAT_HOME="<%= @hadoop_home %>"
|
15
|
-
export HBASE_HOME="<%= @hadoop_home %>"
|
16
|
-
|
17
|
-
SQOOP_OPTS="<% @sqoop_opts.each do |k,v| %>-D<%= k %>=<%= v %> <% end %>"
|
18
|
-
OPTARGS='<%= "--driver #{@jdbcdriver}" if @jdbcdriver %>'
|
19
|
-
OPTARGS="$OPTARGS <%= "--username #{@dbuser}" if @dbuser %>"
|
20
|
-
OPTARGS="$OPTARGS <%= "--password #{@dbpass}" if @dbpass %>"
|
21
|
-
OPTARGS="$OPTARGS <%= "--direct" if @direct_import %>"
|
22
|
-
<% if @inc_column and @inc_value %>
|
23
|
-
OPTARGS="$OPTARGS --incremental <%= @inc_mode %>"
|
24
|
-
OPTARGS="$OPTARGS --check-column <%= @inc_column %> "
|
25
|
-
SQOOP_OPTS="$SQOOP_OPTS -Dsqoop.test.import.rootDir=<%= @s3dest %>/.tmp"
|
26
|
-
<% end %>
|
27
|
-
|
28
|
-
export HADOOP_OPTS="$SQOOP_OPTS";
|
29
|
-
|
30
|
-
<%= @sqoop_dir %>/bin/sqoop \
|
31
|
-
import \
|
32
|
-
$SQOOP_OPTS \
|
33
|
-
<%= "--table #{@dbtable}" if @dbtable %> \
|
34
|
-
<%= "--query '#{@sqlquery}'" if @sqlquery %> \
|
35
|
-
-m 1 \
|
36
|
-
--connect <%= @jdbc_conn %> \
|
37
|
-
--target-dir <%= @s3dest %> \
|
38
|
-
$OPTARGS \
|
39
|
-
<% if @inc_column and @inc_value %>--last-value '<%= @inc_value %>'<% end %>
|
40
|
-
|
@@ -1,57 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright 2012 Mortar Data Inc.
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
15
|
-
#
|
16
|
-
|
17
|
-
require 'spec_helper'
|
18
|
-
require 'fakefs/spec_helpers'
|
19
|
-
require 'mortar/local/sqoop'
|
20
|
-
require 'launchy'
|
21
|
-
|
22
|
-
|
23
|
-
module Mortar::Local
|
24
|
-
describe Sqoop do
|
25
|
-
|
26
|
-
context "prepare query" do
|
27
|
-
|
28
|
-
it "adds a where clause if none exists" do
|
29
|
-
sqoop = Mortar::Local::Sqoop.new
|
30
|
-
expect(sqoop.prep_query("SELECT * FROM customers")).to eq("SELECT * FROM customers WHERE \$CONDITIONS")
|
31
|
-
end
|
32
|
-
|
33
|
-
it "wraps existing where clause and appends condition" do
|
34
|
-
original = "SELECT * FROM customers WHERE customer_id = 1"
|
35
|
-
expected = "SELECT * FROM customers WHERE (customer_id = 1) AND \$CONDITIONS"
|
36
|
-
sqoop = Mortar::Local::Sqoop.new
|
37
|
-
expect(sqoop.prep_query(original)).to eq(expected)
|
38
|
-
end
|
39
|
-
|
40
|
-
it "wraps a complex where clause and appends condition" do
|
41
|
-
original = "SELECT * FROM customers WHERE (customer_id = 1 and customer_name = 'tom') or customer_id=2"
|
42
|
-
expected = "SELECT * FROM customers WHERE ((customer_id = 1 and customer_name = 'tom') or customer_id=2) AND \$CONDITIONS"
|
43
|
-
sqoop = Mortar::Local::Sqoop.new
|
44
|
-
expect(sqoop.prep_query(original)).to eq(expected)
|
45
|
-
end
|
46
|
-
|
47
|
-
it "does nothing if the user was polite enough to supply the clause themselves" do
|
48
|
-
query = "SELECT * FROM customers WHERE (customer_id = 1) AND \$CONDITIONS"
|
49
|
-
sqoop = Mortar::Local::Sqoop.new
|
50
|
-
expect(sqoop.prep_query(query)).to eq(query)
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
end
|