跳转到主要内容

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。在创建连接实例时指定hostport参数,如果您的设置不同。

c = Connection()

使用自定义配置,将类似于以下内容。

c = Connection(host='192.168.88.22', port=8001)

显示表

假设有两个名为table1table2的现有表,以下内容将被打印出来。

c.tables()

输出。

['table1', 'table2']

操作表模式

每次需要操作表(如果需要创建表)时,都需要创建一个表实例。

创建表实例(注意,在此步骤中未创建表)。

t = c.table('table3')

创建新表

假设数据库中尚未存在名为table3的表,创建一个名为table3的表,具有列(列族)column1column2column3(这是表实际创建的点)。在下面的示例中,column1column2column3是列族(简称列)。列在表模式中声明。

t.create('column1', 'column2', 'column3')

输出。

201

检查表是否存在

t.exists()

输出。

True

显示表列(列族)

t.columns()

输出。

['column1', 'column2', 'column3']

向表中添加列

添加给定的列(column4column5column6column7)。

t.add_columns('column4', 'column5', 'column6', 'column7')

输出。

200

从表中删除列

删除给定的列(column6column7)。

t.drop_columns('column6', 'column7')

输出。

201

删除整个表模式

t.drop()

输出。

200

操作表数据

向单行插入数据

HBase是一个键/值存储。在HBase中,列(也称为列族)是声明表模式的一部分,并且在创建表时必须定义。列有限定符,这些限定符不在表模式中声明。列限定符的数量不受限制。

在单行内,一个值通过列族和限定符(从键/值存储的概念)映射。值可以是任何可转换为字符串的类型(JSON对象、数据结构、XML等)。

在下面的示例中,key11key12key21等。是限定符。显然,column1column2column3是列族。

列族必须由可打印字符组成。限定符可以是任意任意字节。

表行通过行键(唯一标识符,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'}
}

获取包含选定列的单个行数据(限制为 column1column2 列及其所有限定符)。

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 的限定符 key1key2 以及 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>

关于表操作的更多信息

默认情况下,在执行 fetchinsertupdateremove(表行操作)方法之前,会检查表是否存在。这是安全的,但会带来额外的(虽然轻微的)HTTP 请求。如果您绝对确定要避免这些检查,可以禁用它们。可以通过将以下属性设置为 False 来禁用每种类型的行操作:check_if_exists_on_row_fetchcheck_if_exists_on_row_insertcheck_if_exists_on_row_removecheck_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'}

失败的请求

默认情况下,失败请求的重试次数为零。这意味着如果请求失败,则不会重复执行。可以重试失败的请求(例如,在超时等情况)。

为了实现这一点,已引入了 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

支持

如有任何问题,请联系作者部分的电子邮件。

作者

Artur Barseghyan <artur.barseghyan@gmail.com>

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

starbase-0.3.3.tar.gz (51.1 kB 查看哈希值)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面