Python 操作 HBase 最佳实践

2024-06-12 21:58

本文主要是介绍Python 操作 HBase 最佳实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这几天玩了一下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(), "-Xms32m", "-Xmx256m", "-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使用比较简单,主要是一些细节的处理,比如外部包引用、类型转换等。

 
往期推荐

1、HBase最佳实践 | 聊聊HBase核心配置参数
2、Apache Hudi:剑指数据湖的增量处理框架
3、Hadoop社区比 Ozone 更重要的事情
4、MapReduce Shuffle 和 Spark Shuffle 结业篇

 

这篇关于Python 操作 HBase 最佳实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055452

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C++学习 贝蒂的主页:Betty’s blog 1. 泛型编程 首先让我们来思考一个问题,如何实现一个交换函数? void swap(int& x, int& y){int tmp = x;x = y;y = tmp;} 相信大家很快就能写出上面这段代码,但是如果要求这个交换函数支持字符型

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

SQL Server中,always on服务器的相关操作

在SQL Server中,建立了always on服务,可用于数据库的同步备份,当数据库出现问题后,always on服务会自动切换主从服务器。 例如192.168.1.10为主服务器,12为从服务器,当主服务器出现问题后,always on自动将主服务器切换为12,保证数据库正常访问。 对于always on服务器有如下操作: 1、切换主从服务器:假如需要手动切换主从服务器时(如果两个服务

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

python 喷泉码

因为要完成毕业设计,毕业设计做的是数据分发与传输的东西。在网络中数据容易丢失,所以我用fountain code做所发送数据包的数据恢复。fountain code属于有限域编码的一部分,有很广泛的应用。 我们日常生活中使用的二维码,就用到foutain code做数据恢复。你遮住二维码的四分之一,用手机的相机也照样能识别。你遮住的四分之一就相当于丢失的数据包。 为了实现并理解foutain