HBase Stargate REST服务器的Python客户端
项目描述
Python的HBase Stargate (REST API)客户端包装器。
阅读Stargate的官方文档。
描述
starbase目前是Apache HBase REST API (Stargate)的客户端实现。
需要了解的信息
请注意,REST API速度较慢(这并非该库的错!)。如果您可以直接操作HBase,则最好这样做。
先决条件
您需要安装并运行Hadoop、HBase、Thrift和Stargate。如果您想简化操作,请阅读我在Ubuntu 12.04 LTS上安装Cloudera manager(免费)的说明此处或此处。
安装并运行所有内容后(默认情况下,Stargate在127.0.0.1:8000上运行),您应该能够无问题地运行src/starbase/client/test.py(单元测试)。
支持的Python版本
2.6.8 及以上版本
2.7
3.3
功能特性
项目仍在开发中,因此API并非所有功能都可用。
已实现的功能
连接到星门。
显示软件版本。
显示集群版本。
显示集群状态。
列出表。
检索表模式。
检索表元数据。
获取表的列族列表。
创建表。
删除表。
修改表模式。
向单行(单列或多列)中插入(PUT)数据。
更新(POST)单行(单列或多列)的数据。
从表中选取(GET)单行,可选地只选取指定的列。
通过id删除(DELETE)单行。
批量插入(PUT)。
批量更新(POST)。
基本HTTP认证正在工作。您可以在连接中提供登录名和密码。
检索表中的所有行(表扫描)。
开发中的功能
表扫描。
语法globbing。
安装
从PyPI安装最新稳定版本。
$ pip install starbase
或从github安装最新稳定版本。
$ pip install -e git+https://github.com/barseghyanartur/starbase@stable#egg=starbase
使用方法和示例
使用API进行操作从创建连接实例开始。
必需的导入
from starbase import Connection
创建连接实例
默认为127.0.0.1:8000。在创建连接实例时指定host和port参数,如果您的设置不同。
c = Connection()
使用自定义配置,将类似于以下内容。
c = Connection(host='192.168.88.22', port=8001)
显示表
假设有两个名为table1和table2的现有表,以下内容将被打印出来。
c.tables()
输出。
['table1', 'table2']
操作表模式
每次需要操作表(如果需要创建表)时,都需要创建一个表实例。
创建表实例(注意,在此步骤中未创建表)。
t = c.table('table3')
创建新表
假设数据库中尚未存在名为table3的表,创建一个名为table3的表,具有列(列族)column1、column2、column3(这是表实际创建的点)。在下面的示例中,column1、column2和column3是列族(简称列)。列在表模式中声明。
t.create('column1', 'column2', 'column3')
输出。
201
检查表是否存在
t.exists()
输出。
True
显示表列(列族)
t.columns()
输出。
['column1', 'column2', 'column3']
向表中添加列
添加给定的列(column4、column5、column6、column7)。
t.add_columns('column4', 'column5', 'column6', 'column7')
输出。
200
从表中删除列
删除给定的列(column6、column7)。
t.drop_columns('column6', 'column7')
输出。
201
删除整个表模式
t.drop()
输出。
200
操作表数据
向单行插入数据
HBase是一个键/值存储。在HBase中,列(也称为列族)是声明表模式的一部分,并且在创建表时必须定义。列有限定符,这些限定符不在表模式中声明。列限定符的数量不受限制。
在单行内,一个值通过列族和限定符(从键/值存储的概念)映射。值可以是任何可转换为字符串的类型(JSON对象、数据结构、XML等)。
在下面的示例中,key11、key12、key21等。是限定符。显然,column1、column2和column3是列族。
列族必须由可打印字符组成。限定符可以是任意任意字节。
表行通过行键(唯一标识符,UID或称为主键)进行标识。在下面的示例中,my-key-1 是行键(UID)。
总结上面所说,HBase 将(行键、列族、列限定符和时间戳)映射到一个值。
t.insert(
'my-key-1',
{
'column1': {'key11': 'value 11', 'key12': 'value 12',
'key13': 'value 13'},
'column2': {'key21': 'value 21', 'key22': 'value 22'},
'column3': {'key32': 'value 31', 'key32': 'value 32'}
}
)
输出。
200
注意,您还可以使用 native 方式命名列和单元格(限定符)。以下结果与上一个示例的结果相同。
t.insert(
'my-key-1',
{
'column1:key11': 'value 11', 'column1:key12': 'value 12',
'column1:key13': 'value 13',
'column2:key21': 'value 21', 'column2:key22': 'value 22',
'column3:key32': 'value 31', 'column3:key32': 'value 32'
}
)
输出。
200
更新行数据
t.update(
'my-key-1',
{'column4': {'key41': 'value 41', 'key42': 'value 42'}}
)
输出。
200
删除行、行列或行单元格数据
删除行单元格(限定符)数据。在下面的示例中,my-key-1 是表行UID,column4 是列族,key41 是限定符。注意,仅删除给定行的限定符数据。列 column4 的所有其他可能的限定符将保持不变。
t.remove('my-key-1', 'column4', 'key41')
输出。
200
删除行列(列族)数据。注意,在这种情况下,整个列数据(给定行的所有限定符的数据)将被删除。
t.remove('my-key-1', 'column4')
输出。
200
删除整个行数据。注意,在这种情况下,整个行数据,包括给定行的所有列和限定符,将被删除。
t.remove('my-key-1')
输出。
200
获取表数据
获取包含所有列和限定符的单个行数据。
t.fetch('my-key-1')
输出。
{
'column1': {'key11': 'value 11', 'key12': 'value 12', 'key13': 'value 13'},
'column2': {'key21': 'value 21', 'key22': 'value 22'},
'column3': {'key32': 'value 31', 'key32': 'value 32'}
}
获取包含选定列的单个行数据(限制为 column1 和 column2 列及其所有限定符)。
t.fetch('my-key-1', ['column1', 'column2'])
输出。
{
'column1': {'key11': 'value 11', 'key12': 'value 12', 'key13': 'value 13'},
'column2': {'key21': 'value 21', 'key22': 'value 22'},
}
进一步缩小结果集(限制为 column1 的限定符 key1 和 key2 以及 column3 的限定符 key32)。
t.fetch('my-key-1', {'column1': ['key11', 'key13'], 'column3': ['key32']})
输出。
{
'column1': {'key11': 'value 11', 'key13': 'value 13'},
'column3': {'key32': 'value 32'}
}
注意,您还可以使用 native 方式命名列和单元格(限定符)。下面的示例与上面的示例完全相同。
t.fetch('my-key-1', ['column1:key11', 'column1:key13', 'column3:key32'])
输出。
{
'column1': {'key11': 'value 11', 'key13': 'value 13'},
'column3': {'key32': 'value 32'}
}
如果您将 perfect_dict 参数设置为 False,您将获得 native 数据结构。
t.fetch(
'my-key-1',
['column1:key11', 'column1:key13', 'column3:key32'],
perfect_dict=False
)
输出。
{
'column1:key11': 'value 11',
'column1:key13': 'value 13',
'column3:key32': 'value 32'
}
批量操作与表数据
批量操作(插入和更新)与正常插入和更新类似,但以批量方式完成。建议尽可能批量操作。
批量插入
在下面的示例中,我们将批量插入 5000 条记录。
data = {
'column1': {'key11': 'value 11', 'key12': 'value 12', 'key13': 'value 13'},
'column2': {'key21': 'value 21', 'key22': 'value 22'},
}
b = t.batch()
if b:
for i in range(0, 5000):
b.insert('my-key-%s' % i, data)
b.commit(finalize=True)
输出。
{'method': 'PUT', 'response': [200], 'url': 'table3/bXkta2V5LTA='}
批量更新
在下面的示例中,我们将批量更新 5000 条记录。
data = {
'column3': {'key31': 'value 31', 'key32': 'value 32'},
}
b = t.batch()
if b:
for i in range(0, 5000):
b.update('my-key-%s' % i, data)
b.commit(finalize=True)
输出。
{'method': 'POST', 'response': [200], 'url': 'table3/bXkta2V5LTA='}
注意:表的 batch 方法接受一个可选的 size 参数(整数)。如果设置,每次堆满时将触发自动提交。
表数据搜索(行扫描)
表扫描正在开发中(因此,扫描 API 可能会更改)。返回的结果集是一个生成器。
获取所有行
t.fetch_all_rows()
输出。
<generator object results at 0x28e9190>
获取给定过滤器的行
rf = '{"type": "RowFilter", "op": "EQUAL", "comparator": {"type": "RegexStringComparator", "value": "^row_1.+"}}'
t.fetch_all_rows(with_row_id=True, filter_string=rf)
输出。
<generator object results at 0x28e9190>
关于表操作的更多信息
默认情况下,在执行 fetch、insert、update、remove(表行操作)方法之前,会检查表是否存在。这是安全的,但会带来额外的(虽然轻微的)HTTP 请求。如果您绝对确定要避免这些检查,可以禁用它们。可以通过将以下属性设置为 False 来禁用每种类型的行操作:check_if_exists_on_row_fetch、check_if_exists_on_row_insert、check_if_exists_on_row_remove 和 check_if_exists_on_row_update。
t.check_if_exists_on_row_fetch = False
t.fetch('row1')
也可以通过调用表实例的 disable_row_operation_if_exists_checks 方法一次性禁用它们。
t.disable_row_operation_if_exists_checks()
t.remove('row1')
对于表格扫描操作也是如此。将表格实例的 check_if_exists_on_scanner_operations 值设置为 False,将跳过扫描操作的检查。
t.check_if_exists_on_scanner_operations = False
t.fetch_all_rows(flat=True)
异常处理
接受 fail_silently 参数的方法按类列出如下。
starbase.client.connection.Connection
cluster_version
cluster_status
drop_table
tables
table_exists
version
starbase.client.table.Table
add_columns
batch
create
drop
drop_columns
exists
insert
fetch
fetch_all_rows
regions
remove
schema
update
starbase.client.table.Batch
commit
insert
update
starbase.client.transport.HttpRequest
类 starbase.client.table.Batch 接受 fail_silently 作为构造函数参数。
更多示例
显示软件版本
print connection.version
输出。
{u'JVM': u'Sun Microsystems Inc. 1.6.0_43-20.14-b01',
u'Jersey': u'1.8',
u'OS': u'Linux 3.5.0-30-generic amd64',
u'REST': u'0.0.2',
u'Server': u'jetty/6.1.26'}
显示集群版本
print connection.cluster_version
输出。
u'0.94.7'
显示集群状态
print connection.cluster_status
输出。
{u'DeadNodes': [],
u'LiveNodes': [{u'Region': [{u'currentCompactedKVs': 0,
...
u'regions': 3,
u'requests': 0}
显示表模式
print table.schema()
输出。
{u'ColumnSchema': [{u'BLOCKCACHE': u'true',
u'BLOCKSIZE': u'65536',
...
u'IS_ROOT': u'false',
u'name': u'messages'}
打印表元数据
print table.regions()
失败的请求
默认情况下,失败请求的重试次数为零。这意味着如果请求失败,则不会重复执行。可以重试失败的请求(例如,在超时等情况)。
为了实现这一点,已引入了 starbase.client.connection.Connection 的两个附加参数
retries (int)
retry_delay (int)
c = Connection(
retries = 3, # Retry 3 times
retry_delay = 5 # Wait for 5 seconds between retries
)
注意!重试次数可能导致应用程序的性能问题(响应速度降低)。目前,删除不存在列、行或表等失败的请求都将以相同的方式处理,都会导致重试。这可能会在未来改变(更智能地检测值得重试的失败请求)。
许可证
GPL 2.0/LGPL 2.1
支持
如有任何问题,请联系作者部分的电子邮件。
项目详情
starbase-0.3.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 347a515798c29dacdb1b8012ee8f065223add2f90ad329e7fa897b5df9b21f28 |
|
MD5 | b92e5137c4604e6b008466f0536b1156 |
|
BLAKE2b-256 | 34b80a52074c4a7dcde4e8d39757d0bd8358e190821b021ffeb751e8edd0512a |