hbasegate 0.1.0
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/.gitignore +18 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +21 -0
- data/README.md +62 -0
- data/hbasegate.gemspec +22 -0
- data/lib/hbasegate/hbase_configuration.rb +16 -0
- data/lib/hbasegate/htable.rb +48 -0
- data/lib/hbasegate/result.rb +16 -0
- data/lib/hbasegate/version.rb +3 -0
- data/lib/hbasegate.rb +20 -0
- data/test/htable_spec.rb +102 -0
- data/test/result_spec.rb +41 -0
- metadata +77 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
GEM
|
|
2
|
+
remote: http://rubygems.org/
|
|
3
|
+
specs:
|
|
4
|
+
ansi (1.4.3)
|
|
5
|
+
builder (3.2.0)
|
|
6
|
+
hashie (2.0.3)
|
|
7
|
+
minitest (4.7.1)
|
|
8
|
+
minitest-reporters (0.14.16)
|
|
9
|
+
ansi
|
|
10
|
+
builder
|
|
11
|
+
minitest (>= 2.12, < 5.0)
|
|
12
|
+
powerbar
|
|
13
|
+
powerbar (1.0.11)
|
|
14
|
+
ansi (~> 1.4.0)
|
|
15
|
+
hashie (>= 1.1.0)
|
|
16
|
+
|
|
17
|
+
PLATFORMS
|
|
18
|
+
java
|
|
19
|
+
|
|
20
|
+
DEPENDENCIES
|
|
21
|
+
minitest-reporters (>= 0.5.0)
|
data/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
hbasegate
|
|
2
|
+
=========
|
|
3
|
+
|
|
4
|
+
JRuby gem wrapping Java API for HBase
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
Add this line to your application's Gemfile:
|
|
9
|
+
|
|
10
|
+
gem 'hbasegate'
|
|
11
|
+
|
|
12
|
+
And then execute:
|
|
13
|
+
|
|
14
|
+
$ bundle install
|
|
15
|
+
|
|
16
|
+
Or install it yourself as:
|
|
17
|
+
|
|
18
|
+
$ gem install hbasegate
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
Require the gem
|
|
23
|
+
|
|
24
|
+
$ require 'hbasegate'
|
|
25
|
+
|
|
26
|
+
Create your configuration. This is optional since you can also define the config in a hbase-site.xml file as
|
|
27
|
+
shown in <a href"http://hbase.apache.org/book/config.files.html#client_dependencies">the hbase book</a>. The
|
|
28
|
+
minimal configuration is the specification of one or more ZooKeeper servers. This is used to find the HBase
|
|
29
|
+
API.
|
|
30
|
+
|
|
31
|
+
$ config = HBaseGate::HBaseConfiguration.create
|
|
32
|
+
$ config['hbase.zookeeper.quorum'] = 'zk1.test.com, zk2.test.com'
|
|
33
|
+
|
|
34
|
+
Get a handle to the table:
|
|
35
|
+
|
|
36
|
+
$ table = HBaseGate::HTable.new(config, 'test_db')
|
|
37
|
+
|
|
38
|
+
And use it:
|
|
39
|
+
|
|
40
|
+
$ r = table.get('me')
|
|
41
|
+
$ puts r
|
|
42
|
+
|
|
43
|
+
You specify column families, columns and values in an array of arrays. Each element of the inner array specifies on
|
|
44
|
+
item.
|
|
45
|
+
|
|
46
|
+
$ r = table.get('me', [['family']])
|
|
47
|
+
$ r = table.get('me', [['family', 'column']])
|
|
48
|
+
$ r = table.get('me', [['family1', 'column1'], ['family2', 'column2']])
|
|
49
|
+
$ r = table.put('me', [['family1', 'column1', 'value1'], ['family2', 'column2', 'value2']])
|
|
50
|
+
$ r = table.delete('me')
|
|
51
|
+
$ r = table.delete('me', [['family']])
|
|
52
|
+
$ r = table.delete('me', [['family', 'column']])
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
## Contributing
|
|
57
|
+
|
|
58
|
+
1. Fork it
|
|
59
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
60
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
61
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
62
|
+
5. Create new Pull Request
|
data/hbasegate.gemspec
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'hbasegate/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = "hbasegate"
|
|
8
|
+
spec.version = HBaseGate::VERSION
|
|
9
|
+
spec.authors = ["Knut O. Hellan"]
|
|
10
|
+
spec.email = ["knut.hellan@gmail.com"]
|
|
11
|
+
spec.description = %q{JRuby gem wrapping Java API for HBase}
|
|
12
|
+
spec.summary = %q{More ruby friendly API than using Java directly}
|
|
13
|
+
spec.homepage = "http://github.com/khellan/hbasegate"
|
|
14
|
+
spec.license = "MIT"
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files`.split($/)
|
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ["lib"]
|
|
20
|
+
|
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
|
22
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module HBaseGate
|
|
2
|
+
java_import 'org.apache.hadoop.conf.Configuration'
|
|
3
|
+
java_import 'org.apache.hadoop.hbase.HBaseConfiguration'
|
|
4
|
+
|
|
5
|
+
class Configuration
|
|
6
|
+
# Retrieve the value stored for name.
|
|
7
|
+
def [](name)
|
|
8
|
+
get(name)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Store value for name.
|
|
12
|
+
def []=(name, value)
|
|
13
|
+
set(name, value)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module HBaseGate
|
|
2
|
+
java_import 'org.apache.hadoop.hbase.client.Delete'
|
|
3
|
+
java_import 'org.apache.hadoop.hbase.client.Get'
|
|
4
|
+
java_import 'org.apache.hadoop.hbase.client.HTable'
|
|
5
|
+
java_import 'org.apache.hadoop.hbase.client.Put'
|
|
6
|
+
|
|
7
|
+
class HTable
|
|
8
|
+
alias_method :original_delete, :delete
|
|
9
|
+
alias_method :original_get, :get
|
|
10
|
+
alias_method :original_put, :put
|
|
11
|
+
|
|
12
|
+
# Read row key with an array of family, column arrays.
|
|
13
|
+
def get(key, entries = nil)
|
|
14
|
+
get = Get.new(key.to_java_bytes)
|
|
15
|
+
augment_action(entries, get.method(:add_family), get.method(:add_column))
|
|
16
|
+
original_get(get).to_h
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Store row key with an array of family, column, value arrays.
|
|
20
|
+
def put(key, entries = nil)
|
|
21
|
+
put = Put.new(key.to_java_bytes)
|
|
22
|
+
(entries || []).each.each do |family, qualifier, value|
|
|
23
|
+
put.add(family.to_java_bytes, qualifier.to_java_bytes, value.to_java_bytes)
|
|
24
|
+
end
|
|
25
|
+
original_put(put)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Delete row key with an array of family, column arrays.
|
|
29
|
+
def delete(key, entries = nil)
|
|
30
|
+
delete = Delete.new(key.to_java_bytes)
|
|
31
|
+
augment_action(entries, delete.method(:delete_family), delete.method(:delete_column))
|
|
32
|
+
original_delete(delete)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
# Iterate over the entries and use the given functions on them.
|
|
37
|
+
def augment_action(entries, family_do, qualifier_do)
|
|
38
|
+
(entries || []).each do |family, qualifier|
|
|
39
|
+
case
|
|
40
|
+
when qualifier
|
|
41
|
+
qualifier_do.call(family.to_java_bytes, qualifier.to_java_bytes)
|
|
42
|
+
when family
|
|
43
|
+
family_do.call(family.to_java_bytes)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module HBaseGate
|
|
2
|
+
java_import 'org.apache.hadoop.hbase.client.Result'
|
|
3
|
+
|
|
4
|
+
class Result
|
|
5
|
+
# Return a nested hash of the result.
|
|
6
|
+
def to_h
|
|
7
|
+
get_no_version_map.entry_set.reduce({}) do |families, family_entries|
|
|
8
|
+
columns = family_entries.get_value.entry_set.reduce({}) do |columns, column_entry|
|
|
9
|
+
columns.update(
|
|
10
|
+
String.from_java_bytes(column_entry.get_key) => String.from_java_bytes(column_entry.get_value))
|
|
11
|
+
end
|
|
12
|
+
families.update(String.from_java_bytes(family_entries.get_key) => columns)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
data/lib/hbasegate.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'java'
|
|
2
|
+
|
|
3
|
+
$: << File.dirname(__FILE__)
|
|
4
|
+
|
|
5
|
+
require 'commons-configuration-1.6'
|
|
6
|
+
require 'commons-lang-2.5'
|
|
7
|
+
require 'commons-logging-1.1.1'
|
|
8
|
+
require 'guava-11.0.2'
|
|
9
|
+
require 'hadoop-auth'
|
|
10
|
+
require 'hadoop-common'
|
|
11
|
+
require 'hbase'
|
|
12
|
+
require 'slf4j-api-1.6.1.jar'
|
|
13
|
+
require 'zookeeper-3.4.5'
|
|
14
|
+
|
|
15
|
+
require 'hbasegate/hbase_configuration'
|
|
16
|
+
require 'hbasegate/htable'
|
|
17
|
+
require 'hbasegate/result'
|
|
18
|
+
require 'hbasegate/version'
|
|
19
|
+
|
|
20
|
+
$:.pop
|
data/test/htable_spec.rb
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'minitest/autorun'
|
|
2
|
+
require 'minitest/spec'
|
|
3
|
+
|
|
4
|
+
require_relative '../lib/hbasegate'
|
|
5
|
+
|
|
6
|
+
class HBaseGate::Get
|
|
7
|
+
def to_h
|
|
8
|
+
self
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe HBaseGate::HTable do
|
|
13
|
+
table = HBaseGate::HTable.new(nil, 't')
|
|
14
|
+
table.set_write_buffer_size(2097152)
|
|
15
|
+
|
|
16
|
+
describe '#get_write_buffer_size' do
|
|
17
|
+
it 'has default value' do
|
|
18
|
+
table.get_write_buffer_size.must_equal 2097152
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe '#original_put' do
|
|
23
|
+
it 'responds to original put' do
|
|
24
|
+
table.respond_to?(:original_put).must_equal true
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe '#put' do
|
|
29
|
+
it 'writes to the table' do
|
|
30
|
+
table.put('a', [['b', 'c', 'd']])
|
|
31
|
+
expected = HBaseGate::Put.new('a'.to_java_bytes)
|
|
32
|
+
expected.add('b'.to_java_bytes, 'c'.to_java_bytes, 'd'.to_java_bytes)
|
|
33
|
+
result = table.get_write_buffer
|
|
34
|
+
result.get(0).must_equal expected
|
|
35
|
+
result.size.must_equal 1
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe '#original_get' do
|
|
40
|
+
it 'responds to original get' do
|
|
41
|
+
table.respond_to?(:original_get).must_equal true
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe '#get' do
|
|
46
|
+
my_table = table.dup
|
|
47
|
+
def my_table.original_get(get)
|
|
48
|
+
get
|
|
49
|
+
end
|
|
50
|
+
it 'reads a full row' do
|
|
51
|
+
expected = HBaseGate::Get.new('a'.to_java_bytes)
|
|
52
|
+
my_table.get('a').must_equal expected
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'reads a specific column' do
|
|
56
|
+
expected = HBaseGate::Get.new('a'.to_java_bytes)
|
|
57
|
+
expected.add_column('b'.to_java_bytes, 'c'.to_java_bytes)
|
|
58
|
+
my_table.get('a', [['b', 'c']]).must_equal expected
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it 'reads a complete column family' do
|
|
62
|
+
expected = HBaseGate::Get.new('a'.to_java_bytes)
|
|
63
|
+
expected.add_family('b'.to_java_bytes)
|
|
64
|
+
my_table.get('a', [['b']]).must_equal expected
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe '#original_delete' do
|
|
69
|
+
it 'responds to original delete' do
|
|
70
|
+
table.respond_to?(:original_delete).must_equal true
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe '#delete' do
|
|
75
|
+
my_table = table.dup
|
|
76
|
+
def my_table.original_delete(delete)
|
|
77
|
+
@action = delete
|
|
78
|
+
end
|
|
79
|
+
def my_table.action
|
|
80
|
+
@action
|
|
81
|
+
end
|
|
82
|
+
it 'deletes a full row' do
|
|
83
|
+
expected = HBaseGate::Delete.new('a'.to_java_bytes)
|
|
84
|
+
my_table.delete('a')
|
|
85
|
+
my_table.action.must_equal expected
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it 'deletes a specific column' do
|
|
89
|
+
expected = HBaseGate::Delete.new('a'.to_java_bytes)
|
|
90
|
+
expected.delete_column('b'.to_java_bytes, 'c'.to_java_bytes)
|
|
91
|
+
my_table.delete('a', [['b', 'c']])
|
|
92
|
+
my_table.action.must_equal expected
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'deletes a complete column family' do
|
|
96
|
+
expected = HBaseGate::Delete.new('a'.to_java_bytes)
|
|
97
|
+
expected.delete_family('b'.to_java_bytes)
|
|
98
|
+
my_table.delete('a', [['b']])
|
|
99
|
+
my_table.action.must_equal expected
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
data/test/result_spec.rb
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'minitest/autorun'
|
|
2
|
+
require 'minitest/spec'
|
|
3
|
+
|
|
4
|
+
require_relative '../lib/hbasegate'
|
|
5
|
+
|
|
6
|
+
java_import 'org.apache.hadoop.hbase.KeyValue'
|
|
7
|
+
|
|
8
|
+
describe HBaseGate::Result do
|
|
9
|
+
describe '#to_h' do
|
|
10
|
+
result = HBaseGate::Result.new(
|
|
11
|
+
[
|
|
12
|
+
KeyValue.new('a'.to_java_bytes, 'b'.to_java_bytes, 'c'.to_java_bytes, 'd'.to_java_bytes),
|
|
13
|
+
KeyValue.new('a'.to_java_bytes, 'b'.to_java_bytes, 'e'.to_java_bytes, 'f'.to_java_bytes)
|
|
14
|
+
])
|
|
15
|
+
actual = result.to_h
|
|
16
|
+
it 'returns a hash' do
|
|
17
|
+
actual.class.must_equal Hash
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'has family b' do
|
|
21
|
+
actual.has_key?('b').must_equal true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'has a column c in the family b' do
|
|
25
|
+
actual['b'].has_key?('c').must_equal true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'has a column e in the family b' do
|
|
29
|
+
actual['b'].has_key?('e').must_equal true
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'has a value d for column c in family b' do
|
|
33
|
+
actual['b']['c'].must_equal 'd'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'has a value f for column e in family b' do
|
|
37
|
+
actual['b']['e'].must_equal 'f'
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
metadata
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: hbasegate
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
prerelease:
|
|
5
|
+
version: 0.1.0
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Knut O. Hellan
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2013-04-17 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: bundler
|
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - ~>
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: '1.3'
|
|
21
|
+
none: false
|
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ~>
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.3'
|
|
27
|
+
none: false
|
|
28
|
+
prerelease: false
|
|
29
|
+
type: :development
|
|
30
|
+
description: JRuby gem wrapping Java API for HBase
|
|
31
|
+
email:
|
|
32
|
+
- knut.hellan@gmail.com
|
|
33
|
+
executables: []
|
|
34
|
+
extensions: []
|
|
35
|
+
extra_rdoc_files: []
|
|
36
|
+
files:
|
|
37
|
+
- .gitignore
|
|
38
|
+
- Gemfile
|
|
39
|
+
- Gemfile.lock
|
|
40
|
+
- README.md
|
|
41
|
+
- hbasegate.gemspec
|
|
42
|
+
- lib/hbasegate.rb
|
|
43
|
+
- lib/hbasegate/hbase_configuration.rb
|
|
44
|
+
- lib/hbasegate/htable.rb
|
|
45
|
+
- lib/hbasegate/result.rb
|
|
46
|
+
- lib/hbasegate/version.rb
|
|
47
|
+
- test/htable_spec.rb
|
|
48
|
+
- test/result_spec.rb
|
|
49
|
+
homepage: http://github.com/khellan/hbasegate
|
|
50
|
+
licenses:
|
|
51
|
+
- MIT
|
|
52
|
+
post_install_message:
|
|
53
|
+
rdoc_options: []
|
|
54
|
+
require_paths:
|
|
55
|
+
- lib
|
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - ! '>='
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '0'
|
|
61
|
+
none: false
|
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - ! '>='
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '0'
|
|
67
|
+
none: false
|
|
68
|
+
requirements: []
|
|
69
|
+
rubyforge_project:
|
|
70
|
+
rubygems_version: 1.8.24
|
|
71
|
+
signing_key:
|
|
72
|
+
specification_version: 3
|
|
73
|
+
summary: More ruby friendly API than using Java directly
|
|
74
|
+
test_files:
|
|
75
|
+
- test/htable_spec.rb
|
|
76
|
+
- test/result_spec.rb
|
|
77
|
+
...
|