美文网首页玩转大数据
Python 操作 HBase 实践

Python 操作 HBase 实践

作者: 大数据技术架构 | 来源:发表于2020-02-05 12:33 被阅读0次

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

    1 介绍

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

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

    2 环境准备

    2.1 安装 happybase

    1、在线安装

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

    # pip install happybase
    

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

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

    2、离线安装

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

    离线安装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 查询数据

    1、创建HBase连接

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

    2、查询(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
    

    3、关闭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这个工具类(历史原因)。

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

    1、引入相关jar

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

    2、启动JVM

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

    设置JVM参数:

    jpype.startJVM(jpype.getDefaultJVMPath(), "-Xms32m", "-Xmx256m", "-ea", jvm_classpath)
    

    3、引用Java类

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

    4、类型转换

    这里涉及到一个类型转换,将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使用比较简单,主要是一些细节的处理,比如外部包引用、类型转换等。

    往期文章精选

    Apache Hudi 0.5.1版本重磅发布

    贝壳找房基于 Flink 的实时平台建设

    网易基于 HBase 的最佳实践

    小米流式平台架构演进与实践

    如果您喜欢这篇文章,点【在看】与转发都是一种鼓励,期待得到您的认可 ❥(^_-)

    相关文章

      网友评论

        本文标题:Python 操作 HBase 实践

        本文链接:https://www.haomeiwen.com/subject/kntsxhtx.html