30

Python happybase 操作 HBase 最佳实践

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzUxOTU5Mjk2OA%3D%3D&%3Bmid=2247485159&%3Bidx=1&%3Bsn=59e4a41b7a6079ac2c276848b8a2c5b4
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

这几天玩了一下Python,不得不说Python真的很好用,但同时也遇到了很多坑。这里主要分享通过Python的happybase模块查询HBase的实践。 因为HBase rowkey规则要依赖一个外包jar包,因此也涉及到通过jpype模块在Python中使用Java(这块也是不得已为之)。 Python从小白到入门,描述不对的地方请多指出。

关键词:happybase,jpype

1. 介绍

我们知道Python操作HBase通过thrift方式,因此要求HBase服务端先启动ThriftServer服务(这里不多说了)。 happybase是一个与HBase交互的Python库,底层使用了Python的thrift包操作HBase。

下面我们从0到1讲述Python访问HBase的实践!还会介绍如何调用Java工具类生成HBase rowkey。

2. 环境准备

2.1.安装 happybase

【在线安装】

先检查happybase模块是否已安装。Python安装happybase:

# pip install happybase

这里会自动安装thriftpy2依赖,也可以先在线安装thriftpy2。

建议可以在线安装的先尝试在线安装,毕竟方便

【离线安装】

有时候我们的部署节点连不上外网,无法在线安装时,这时可以离线安装依赖。[在线安装不用理会这部分]

离线安装happybase要先安装依赖thriftpy2,比如happybase1.2.0依赖thriftpy2>=0.4:

# pip install thriftpy2-0.4.8.tar.gz # pip install happybase-1.2.0.tar.gz

https://pypi.org/project/thriftpy2/#files https://pypi.org/project/happybase/#files

相关依赖包下载地址如上。请记住这个Python软件包仓库地址: https://pypi.org

2.2.安装 jpype

如果不涉及在Python中调用Java,这部分可以跳过!

我们选择离线安装jpype(在线会遇到错误,可能与文件类型有关系)。jpype依赖numpy模块,因此要先安装numpy,可以在线或者离线安装。

# pip install numpy # pip install JPype1-0.7.0.tar.gz

https://pypi.org/project/JPype1/#files

注意:

上述离线安装是在linux环境下,如果是windows本地环境,是 JPype1-****.whl 文件,有两个注意点:

  • 检查并确认安装了 wheel 模块,用于安装whl文件(建议在线安装 wheel)

  • 查看Python支持的whl文件类型,下载相应JPype1包,如:

D:\soft\Python>python.exe >>> import pip; print(pip.pep425tags.get_supported())

https://www.lfd.uci.edu/~gohlke/pythonlibs/

还要注意本地安装的Python是32位还是64位的,对应下载。

3. 操作实践

3.1.使用 happybase 查询数据

· 创建HBase连接

connection = happybase.Connection('thriftserver的IP', 9090, table_prefix=b'ns1',
table_prefix_separator=b':')

· 查询(GET )数据

table = connection.table(tablename)

# row_key = b'\x01\x91!\x02\x00\x00\x00\x04007720181210'
row = table.row(row_key)

if row.__len__() != 0:
print(row[b'f:column1']) # 输出bytes
print(row.get(b'f:column1', '').decode()) # 输出string

·关闭HBase连接

connection.close()

除了通过row方法get数据外,happybase还支持scan,put,delete等各种常规操作。此外还支持batch操作。happybase官方文档可以访问:

https://happybase.readthedocs.io/en/latest/index.html

happybase还支持连接池的方式访问HBase:

https://happybase.readthedocs.io/en/latest/user.html#using-the-connection-pool

这部分全是API使用方面的,比较容易理解,一般查看文档就能完成。

3.2.引用 Java 类处理 Rowkey

在3.1中我们使用了row_key这个变量,实际上row_key是pk_id经过一个MD5Util生成的。我们要在Python中使用MD5这个工具类。

注:数据写入时使用了第3方的MD5Util……历史原因

前面说了要利用Jpype模块实现,以下可以说是JPype的使用手册。

引入相关jar

jars = ["/app/lib/**-1.2.0.jar:/app/lib/commons-codec-1.9.jar"] jvm_classpath = "-Djava.class.path={}".format(":".join(jars))

启动JVM

if not jpype.isJVMStarted():     jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", jvm_classpath)

设置JVM参数:

jpype.startJVM(jpype.getDefaultJVMPath(), <strong>"-Xms32m", "-Xmx256m"</strong>, "-ea", jvm_classpath)

引用Java类

MD5Util = JClass("com.****.MD5Util")
BytesUtil = JClass("com.****.BytesUtil")
rowkey_bs = MD5Util.getHashBytes(BytesUtil.toBytes(pk_id))

类型转换

这里涉及到一个类型转换,将Java返回的byte[],即字节数组,转换成Python中的bytes,即字节串。这个转换也值得一记。

Hex = JClass("org.apache.commons.codec.binary.Hex")
row_key = bytes.fromhex(Hex.encodeHexString(rowkey_bs))

至此,我们 实现了 rowkey的转换:string -> byte[] -> bytes

另外,我们启动了JVM但没有关闭,这里是不想重复启动JVM,实际使用的时候还可以打印一些日志来描述JVM的状态。

4. 结束语

本文我们使用Python提供的happybase包进行了HBase查询,并且通过jpype实现了在Python中使用Java代码。说起来其实happybase API使用比较简单,主要是一些细节的处理,比如外部包引用、类型转换等。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK