hbase-jruby 0.2.2-java → 0.2.3-java
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.
- data/CHANGELOG.md +7 -0
- data/README.md +6 -4
- data/lib/hbase-jruby/dependency.rb +2 -1
- data/lib/hbase-jruby/hbase.rb +12 -4
- data/lib/hbase-jruby/pom/pom.xml.erb +38 -1
- data/lib/hbase-jruby/scoped.rb +11 -0
- data/lib/hbase-jruby/scoped/aggregation.rb +2 -0
- data/lib/hbase-jruby/table.rb +18 -2
- data/lib/hbase-jruby/version.rb +1 -1
- data/test/helper.rb +6 -1
- data/test/test_hbase.rb +32 -0
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
0.2.3
|
5
|
+
-----
|
6
|
+
- Fix: [Thread.current[:htable] must be local to each connection](https://github.com/junegunn/hbase-jruby/issues/4)
|
7
|
+
- Fix: [`HBase.log4j=` to support XML based configuration](https://github.com/junegunn/hbase-jruby/issues/5)
|
8
|
+
- Automatically set versions to 1 when counting records
|
9
|
+
- New dependency profile: `cdh4.2`
|
10
|
+
|
4
11
|
0.2.2
|
5
12
|
-----
|
6
13
|
- Added `HBase::Table#delete_row` method
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
```ruby
|
13
13
|
require 'hbase-jruby'
|
14
14
|
|
15
|
-
HBase.resolve_dependency! 'cdh4.
|
15
|
+
HBase.resolve_dependency! 'cdh4.2.0'
|
16
16
|
|
17
17
|
hbase = HBase.new
|
18
18
|
table = hbase[:test_table]
|
@@ -68,6 +68,7 @@ Call `HBase.resolve_dependency!` helper method passing one of the arguments list
|
|
68
68
|
|
69
69
|
| Argument | Dependency | Required executable |
|
70
70
|
|------------|--------------------------|---------------------|
|
71
|
+
| cdh4.2[.*] | Cloudera CDH4.2 | mvn |
|
71
72
|
| cdh4.1[.*] | Cloudera CDH4.1 | mvn |
|
72
73
|
| cdh3[u*] | Cloudera CDH3 | mvn |
|
73
74
|
| 0.94[.*] | Apache HBase 0.94 | mvn |
|
@@ -78,9 +79,9 @@ Call `HBase.resolve_dependency!` helper method passing one of the arguments list
|
|
78
79
|
#### Examples
|
79
80
|
|
80
81
|
```ruby
|
81
|
-
# Load JAR files from CDH4
|
82
|
+
# Load JAR files from CDH4 using Maven
|
83
|
+
HBase.resolve_dependency! 'cdh4.2.0'
|
82
84
|
HBase.resolve_dependency! 'cdh4.1.3'
|
83
|
-
HBase.resolve_dependency! 'cdh4.1.1'
|
84
85
|
|
85
86
|
# Load JAR files of HBase 0.94.x using Maven
|
86
87
|
HBase.resolve_dependency! '0.94.1'
|
@@ -102,8 +103,9 @@ as described in [this page](http://maven.apache.org/guides/mini/guide-proxies.ht
|
|
102
103
|
You may want to suppress (or customize) log messages from HBase.
|
103
104
|
|
104
105
|
```ruby
|
105
|
-
# With an external log4j.properties file
|
106
|
+
# With an external log4j.properties or log4j.xml file
|
106
107
|
HBase.log4j = '/your/log4j.properties'
|
108
|
+
HBase.log4j = '/your/log4j.xml'
|
107
109
|
|
108
110
|
# With a Hash
|
109
111
|
HBase.log4j = { 'log4j.threshold' => 'ERROR' }
|
@@ -9,6 +9,7 @@ class HBase
|
|
9
9
|
# @private
|
10
10
|
SUPPORTED_PROFILES = {
|
11
11
|
# Prefix => Latest version
|
12
|
+
'cdh4.2' => 'cdh4.2.0',
|
12
13
|
'cdh4.1' => 'cdh4.1.3',
|
13
14
|
'cdh3' => 'cdh3u5',
|
14
15
|
'0.94' => '0.94.3',
|
@@ -18,7 +19,7 @@ class HBase
|
|
18
19
|
class << self
|
19
20
|
# @overload resolve_dependency!(dist, options)
|
20
21
|
# Resolve Hadoop and HBase dependency with a predefined Maven profile
|
21
|
-
# @param [String] dist HBase distribution: cdh4.1, cdh3, 0.94, 0.92, local
|
22
|
+
# @param [String] dist HBase distribution: cdh4.2, cdh4.1, cdh3, 0.94, 0.92, local
|
22
23
|
# @param [Hash] options Options
|
23
24
|
# @option options [Boolean] :verbose Enable verbose output
|
24
25
|
# @return [Array<String>] Loaded JAR files
|
data/lib/hbase-jruby/hbase.rb
CHANGED
@@ -10,7 +10,7 @@ class HBase
|
|
10
10
|
|
11
11
|
# @overload HBase.log4j=(filename)
|
12
12
|
# Configure Log4j logging with the given file
|
13
|
-
# @param [String] filename Path to log4j.properties file
|
13
|
+
# @param [String] filename Path to log4j.properties or log4j.xml file
|
14
14
|
# @return [nil]
|
15
15
|
# @overload HBase.log4j=(hash)
|
16
16
|
# Configure Log4j logging with the given Hash
|
@@ -26,10 +26,15 @@ class HBase
|
|
26
26
|
arg.each do |k, v|
|
27
27
|
props.setProperty k.to_s, v.to_s
|
28
28
|
end
|
29
|
-
|
29
|
+
org.apache.log4j.PropertyConfigurator.configure props
|
30
|
+
else
|
31
|
+
case File.extname(arg).downcase
|
32
|
+
when '.xml'
|
33
|
+
org.apache.log4j.xml.DOMConfigurator.configure arg
|
34
|
+
else
|
35
|
+
org.apache.log4j.PropertyConfigurator.configure arg
|
36
|
+
end
|
30
37
|
end
|
31
|
-
|
32
|
-
org.apache.log4j.PropertyConfigurator.configure arg
|
33
38
|
end
|
34
39
|
|
35
40
|
# Connects to HBase
|
@@ -78,6 +83,9 @@ class HBase
|
|
78
83
|
unless @closed
|
79
84
|
@htable_pool.close
|
80
85
|
HConnectionManager.deleteConnection(@config, true)
|
86
|
+
if Thread.current[:hbase_jruby]
|
87
|
+
Thread.current[:hbase_jruby].delete(self)
|
88
|
+
end
|
81
89
|
@closed = true
|
82
90
|
end
|
83
91
|
end
|
@@ -4,12 +4,49 @@
|
|
4
4
|
|
5
5
|
<groupId>hbase-jruby</groupId>
|
6
6
|
<artifactId>hbase-project</artifactId>
|
7
|
-
<version>0.2</version>
|
7
|
+
<version>0.2.3</version>
|
8
8
|
<packaging>jar</packaging>
|
9
9
|
|
10
10
|
<name>hbase-jruby</name>
|
11
11
|
|
12
12
|
<profiles>
|
13
|
+
<profile>
|
14
|
+
<id>cdh4.2</id>
|
15
|
+
<properties>
|
16
|
+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
17
|
+
<hadoop.version>2.0.0-<%= profiles['cdh4.2'] %></hadoop.version>
|
18
|
+
<hbase.version>0.94.2-<%= profiles['cdh4.2'] %></hbase.version>
|
19
|
+
</properties>
|
20
|
+
<repositories>
|
21
|
+
<repository>
|
22
|
+
<id>cloudera-releases</id>
|
23
|
+
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
|
24
|
+
<releases>
|
25
|
+
<enabled>true</enabled>
|
26
|
+
</releases>
|
27
|
+
<snapshots>
|
28
|
+
<enabled>false</enabled>
|
29
|
+
</snapshots>
|
30
|
+
</repository>
|
31
|
+
</repositories>
|
32
|
+
|
33
|
+
<dependencies>
|
34
|
+
<dependency>
|
35
|
+
<groupId>org.apache.hadoop</groupId>
|
36
|
+
<artifactId>hadoop-common</artifactId>
|
37
|
+
<version>${hadoop.version}</version>
|
38
|
+
<scope>compile</scope>
|
39
|
+
</dependency>
|
40
|
+
|
41
|
+
<dependency>
|
42
|
+
<groupId>org.apache.hbase</groupId>
|
43
|
+
<artifactId>hbase</artifactId>
|
44
|
+
<version>${hbase.version}</version>
|
45
|
+
<scope>compile</scope>
|
46
|
+
</dependency>
|
47
|
+
</dependencies>
|
48
|
+
</profile>
|
49
|
+
|
13
50
|
<profile>
|
14
51
|
<id>cdh4.1</id>
|
15
52
|
<properties>
|
data/lib/hbase-jruby/scoped.rb
CHANGED
@@ -48,6 +48,8 @@ class Scoped
|
|
48
48
|
# @param [Array<Object>] *rowkeys Rowkeys
|
49
49
|
# @return [Array<HBase::Result>]
|
50
50
|
def get rowkeys
|
51
|
+
check_closed
|
52
|
+
|
51
53
|
case rowkeys
|
52
54
|
when Array
|
53
55
|
htable.get(rowkeys.map { |rk| getify rk }).map { |result|
|
@@ -63,6 +65,8 @@ class Scoped
|
|
63
65
|
# @yield [row] Yields each row in the scope
|
64
66
|
# @yieldparam [HBase::Result] row
|
65
67
|
def each
|
68
|
+
check_closed
|
69
|
+
|
66
70
|
if block_given?
|
67
71
|
begin
|
68
72
|
scanner = htable.getScanner(filtered_scan)
|
@@ -531,9 +535,12 @@ private
|
|
531
535
|
}
|
532
536
|
end
|
533
537
|
|
538
|
+
# Scanner for just counting records
|
539
|
+
# @private
|
534
540
|
def filtered_scan_minimum
|
535
541
|
filtered_scan.tap do |scan|
|
536
542
|
scan.cache_blocks = false
|
543
|
+
scan.setMaxVersions 1
|
537
544
|
|
538
545
|
# A filter that will only return the first KV from each row
|
539
546
|
# A filter that will only return the key component of each KV
|
@@ -605,6 +612,10 @@ private
|
|
605
612
|
[val]
|
606
613
|
end
|
607
614
|
end
|
615
|
+
|
616
|
+
def check_closed
|
617
|
+
raise RuntimeError, "HBase connection is already closed" if @table.closed?
|
618
|
+
end
|
608
619
|
end#Scoped
|
609
620
|
end#HBase
|
610
621
|
|
@@ -24,6 +24,8 @@ module Aggregation
|
|
24
24
|
# @param [Symbol, org.apache.hadoop.hbase.coprocessor.ColumnInterpreter] type
|
25
25
|
# Column type (only :fixnum is supported as of now) or ColumnInterpreter object used to decode the value
|
26
26
|
def aggregate op, type = :fixnum
|
27
|
+
check_closed
|
28
|
+
|
27
29
|
aggregation_impl op, type
|
28
30
|
end
|
29
31
|
|
data/lib/hbase-jruby/table.rb
CHANGED
@@ -16,11 +16,13 @@ class Table
|
|
16
16
|
include HBase::Util
|
17
17
|
|
18
18
|
# (INTERNAL) Returns the underlying org.apache.hadoop.hbase.client.HTable object (local to current thread)
|
19
|
-
# @return [org.apache.hadoop.hbase.client.
|
19
|
+
# @return [org.apache.hadoop.hbase.client.PooledHTable]
|
20
20
|
def htable
|
21
21
|
check_closed
|
22
22
|
|
23
|
-
|
23
|
+
# [:hbase_jruby][HBase connection][Table name]
|
24
|
+
local_vars = Thread.current[:hbase_jruby] ||= {}
|
25
|
+
local_htables = local_vars[@hbase] ||= {}
|
24
26
|
local_htables[@name] ||= @pool.get_table(@name)
|
25
27
|
end
|
26
28
|
|
@@ -30,6 +32,12 @@ class Table
|
|
30
32
|
nil
|
31
33
|
end
|
32
34
|
|
35
|
+
# Returns whether if the connection is closed
|
36
|
+
# @return [Boolean]
|
37
|
+
def closed?
|
38
|
+
@hbase.closed?
|
39
|
+
end
|
40
|
+
|
33
41
|
[:get, :count, :aggregate,
|
34
42
|
:range, :project, :filter, :while,
|
35
43
|
:limit, :versions, :caching, :batch,
|
@@ -59,6 +67,8 @@ class Table
|
|
59
67
|
# @param [Hash<Hash>] data Data to put indexed by rowkeys
|
60
68
|
# @return [Fixnum] Number of puts succeeded
|
61
69
|
def put *args
|
70
|
+
check_closed
|
71
|
+
|
62
72
|
return put(args.first => args.last) if args.length == 2
|
63
73
|
|
64
74
|
puts = args.first.map { |rowkey, props| putify rowkey, props }
|
@@ -106,6 +116,8 @@ class Table
|
|
106
116
|
# ['a002', 'cf1'],
|
107
117
|
# ['a003'])
|
108
118
|
def delete *args
|
119
|
+
check_closed
|
120
|
+
|
109
121
|
specs = args.first.is_a?(Array) ? args : [args]
|
110
122
|
|
111
123
|
htable.delete specs.map { |spec|
|
@@ -131,6 +143,8 @@ class Table
|
|
131
143
|
# @param [*Object] rowkeys List of rowkeys of rows to delete
|
132
144
|
# @return [nil]
|
133
145
|
def delete_row *rowkeys
|
146
|
+
check_closed
|
147
|
+
|
134
148
|
htable.delete rowkeys.map { |rk| Delete.new(Util.to_bytes rk) }
|
135
149
|
end
|
136
150
|
|
@@ -150,6 +164,8 @@ class Table
|
|
150
164
|
# @example
|
151
165
|
# table.increment('a000', 'cf1:col1' => 1, 'cf1:col2' => 2)
|
152
166
|
def increment rowkey, *args
|
167
|
+
check_closed
|
168
|
+
|
153
169
|
if args.first.is_a?(Hash)
|
154
170
|
cols = args.first
|
155
171
|
htable.increment Increment.new(Util.to_bytes rowkey).tap { |inc|
|
data/lib/hbase-jruby/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -24,8 +24,12 @@ class TestHBaseJRubyBase < Test::Unit::TestCase
|
|
24
24
|
end
|
25
25
|
hbase.close
|
26
26
|
|
27
|
+
def connect
|
28
|
+
HBase.new 'hbase.zookeeper.quorum' => ZK
|
29
|
+
end
|
30
|
+
|
27
31
|
def setup
|
28
|
-
@hbase
|
32
|
+
@hbase = connect
|
29
33
|
@table = @hbase.table(TABLE)
|
30
34
|
|
31
35
|
# Drop & Create
|
@@ -47,5 +51,6 @@ class TestHBaseJRubyBase < Test::Unit::TestCase
|
|
47
51
|
if RECREATE
|
48
52
|
@table.drop! if @table && @table.exists?
|
49
53
|
end
|
54
|
+
@hbase.close
|
50
55
|
end
|
51
56
|
end
|
data/test/test_hbase.rb
CHANGED
@@ -4,6 +4,17 @@ $LOAD_PATH.unshift File.expand_path('..', __FILE__)
|
|
4
4
|
require 'helper'
|
5
5
|
|
6
6
|
class TestHBase < TestHBaseJRubyBase
|
7
|
+
def test_log4j
|
8
|
+
HBase.log4j = File.expand_path('../log4j/log4j.properties', __FILE__)
|
9
|
+
HBase.log4j = File.expand_path('../log4j/log4j.xml', __FILE__)
|
10
|
+
|
11
|
+
begin
|
12
|
+
HBase.log4j = File.expand_path('../log4j/log4j_invalid.xml', __FILE__)
|
13
|
+
assert false, "Exception must be thrown when invalid XML is given"
|
14
|
+
rescue Exception
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
7
18
|
def test_tables
|
8
19
|
assert @hbase.table_names.include?(TABLE)
|
9
20
|
assert @hbase.list.include?(TABLE)
|
@@ -15,13 +26,34 @@ class TestHBase < TestHBaseJRubyBase
|
|
15
26
|
table.exists?
|
16
27
|
assert @hbase.list.is_a?(Array)
|
17
28
|
|
29
|
+
assert_equal table.htable, Thread.current[:hbase_jruby][@hbase][TABLE]
|
30
|
+
|
18
31
|
assert !@hbase.closed?
|
32
|
+
assert !table.closed?
|
19
33
|
@hbase.close
|
20
34
|
assert @hbase.closed?
|
35
|
+
assert table.closed?
|
36
|
+
|
37
|
+
assert !Thread.current[:hbase_jruby].has_key?(@hbase)
|
21
38
|
|
22
39
|
assert_raise(RuntimeError) { @hbase.list }
|
23
40
|
assert_raise(RuntimeError) { table.exists? }
|
24
41
|
assert_raise(RuntimeError) { table.drop! }
|
42
|
+
# ...
|
43
|
+
|
44
|
+
# get, delete, put, delete_row, increment, each
|
45
|
+
assert_raise(RuntimeError) { table.first }
|
46
|
+
assert_raise(RuntimeError) { table.get :key }
|
47
|
+
assert_raise(RuntimeError) { table.put :key => {'cf1:a' => 100} }
|
48
|
+
assert_raise(RuntimeError) { table.delete :key }
|
49
|
+
assert_raise(RuntimeError) { table.delete_row :key }
|
50
|
+
assert_raise(RuntimeError) { table.increment :key, 'cf1:a' => 1 }
|
51
|
+
assert_raise(RuntimeError) { table.project('cf1:a').aggregate(:row_count) }
|
52
|
+
|
53
|
+
# Reconnect and check
|
54
|
+
@hbase = connect
|
55
|
+
table = @hbase[TABLE]
|
56
|
+
assert_equal table.htable, Thread.current[:hbase_jruby][@hbase][TABLE]
|
25
57
|
end
|
26
58
|
|
27
59
|
def test_admin
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: hbase-jruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.3
|
6
6
|
platform: java
|
7
7
|
authors:
|
8
8
|
- Junegunn Choi
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: test-unit
|