pyOpenLooKeng——华为数据分析引擎OpenLooKeng的Python客户端实现|Python 主题月

22,099 阅读4分钟

本文正在参加「Python主题月」,详情查看 活动链接

前不久,2020 openEuler 高校开发者大赛暂告一段落。我们团队在这次比赛中承接了“为openLooKeng开发Python客户端”项目,成功进入决赛并拿到了二等奖的好成绩,也对开源社区有了新的认识和体会。应邀在此介绍一下我们的pyOpenLooKeng和参赛历程。

openLooKeng是什么?

openLooKeng,原名Hetu,是一个分布式、低延迟、可靠的数据引擎,提供了统一的SQL接口,具备高性能、跨数据中心/云查询、数据源扩展等功能,让大数据交互式分析变得更简单。

openLooKeng使用了FaceBook开源的分布式SQL引擎Presto来提供交互式的查询分析能力,除此之外还实现了许多features,例如动态过滤、位图索引、多缓存、跨DC(Data Center,数据中心)连接器等,这些让openLooKeng有了更好的性能、更强的扩展能力和可用性,真正实现了“SQL on Everything”这一理念。

我们的pyOpenLooKeng是怎么做的?

这是我们项目的仓库:gitee.com/openeuler20…

项目简析

OpenLooKeng采用REST通信,包括CLI、JDBC与 Coordinator, Coordinator与 Worker。Python client也可以使用REST通信,将Statement 按照 OpenLooKeng求封装成REST请求,发送恰 Coordinator执行,包含以下请求:

​ 1. 提交查询请求 POST /v1/statement

​ 2. 查询直至查询完成: GET /v1/statement/{ID}

​ 3. 删除某个查询:DELETE /v1/statement/{queryId}

同时,OpenLooKeng需要提供加密和认证功能,需要支持HTTPS加密以及BasicKerberos认证。 Python客户端作为OpenLooKeng的模块,需要符合OpenLooKeng的开发规范,同时客户端需要经过充分测试,单元测试覆盖率需要符合OpenLooKeng的要求,并且功能完成,能够正常访问OpenLooKeng的业务。

image-20210508102306307

架构介绍

  • auth: 架构用于获取请求会话,该会话由HTTPBasic或Kerberos验证;

  • err: 包含操作期间可能遇到的错误和警告 ,

  • common: 一些常见的DB-API逻辑的基类;

  • connections: 管理openLooKeng连接,用于获取游标,设置加密的身份验证信息等;

  • cursor: cursor表示数据库游标,用于管理提取操作的上下文。

arch

功能介绍

pyopenLooKeng采用了PEP-249v2.0 数据库API规范。PEP-249 DB-API为不同的数据库提供了一致的访问接口,比如我们可以很轻松地将访问的数据库从Mysql等移植到OpenLooKeng上,只需要进行少量的代码更改。

image-20210508103839914

类似于PyMysql,我们需要使用cur.execute()函数来提交查询请求。fetch函数族(fetchone() fetchmany() fetchall())来获取结果集;通过cancel()函数来取消查询。

pyOpenLooKeng还额外实现了一些其他的功能,比如Connection中可以获得集群信息,工作节点信息,以及查询的数据信息和阶段的数据信息。

在这一过程中,我们发现了openLooKeng的v1/stage的RESTful接口是无法使用的,我们在社区中进行了返回,提出了issue:gitee.com/openlookeng…

我们也支持HTTPS加密以及Basic与Kerberos认证,

详细代码如下:

from pyopenLooKeng import connections, auth

myAuth = auth.BasicAuthentication(username='user', password='password')
# Kerberos authentication can also be used
conn = connections.connect(host='host', port=8080, catalog='system', schema='runtime',
                           protocol="https", https_verify="trust", auth=myAuth)
print(conn.cluster())
print(conn.query())
# ...
cur = conn.cursor()
cur.execute("SHOW TABLES")
res = cur.fetchall()
print(res)
# (('nodes',), ('queries',), ('tasks',), ('transactions',))

在HTTPS加密的时候,我们也实现了两种方法:忽略证书验证,使用python第三方库certifi的证书;所以,我们可以把openLooKeng的公钥放到certifi.where()指向的文件中,提高了pyOpenLooKeng的安全性和便利性。

参赛体会

这是我们第一次参加开源社区的比赛,在此过程中我们有很多的感悟和体会。

  1. 开源社区很有帮助,最开始我们遇到过一个安装卡死在waiting cluster to start的问题,尝试过很多次无法解决,是社区微信群的一位前辈表示他遇到过,需要手动配置并修改一个配置文件。最后我们成功了。第二个就是stage接口的bug,最开始我以为是自己环境配置的问题,在与社区进行了沟通后确定,应该是系统的代码中出现了Bug。在社区许德智老师的引导下,我提交了openLooKeng的issue。
  2. 充分利用好工具,比如gitee的issue双周报和wiki,能够给使用者提供很多方便,也有利于开发者时间安排。
  3. 从开源软件中汲取经验,最开始我们面对PEP-249时是无从下手的,我们后来参考了pymysql的实现,从中获得了很多的帮助。
  4. 开源不只是把自己的代码发布出来,还要有清晰明了的文档,代码需要符合社区的开发规范,经过充分的测试,最重要的是要长时间的维护。

未来我们团队也会继续完善本项目,为openLooKeng的发展多助力,也祝愿我们的openLooKeng越来越好!