本文正在参加「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加密以及Basic与Kerberos认证。 Python客户端作为OpenLooKeng的模块,需要符合OpenLooKeng的开发规范,同时客户端需要经过充分测试,单元测试覆盖率需要符合OpenLooKeng的要求,并且功能完成,能够正常访问OpenLooKeng的业务。
架构介绍
-
auth: 架构用于获取请求会话,该会话由HTTPBasic或Kerberos验证;
-
err: 包含操作期间可能遇到的错误和警告 ,
-
common: 一些常见的DB-API逻辑的基类;
-
connections: 管理openLooKeng连接,用于获取游标,设置加密的身份验证信息等;
-
cursor: cursor表示数据库游标,用于管理提取操作的上下文。
功能介绍
pyopenLooKeng采用了PEP-249v2.0 数据库API规范。PEP-249 DB-API为不同的数据库提供了一致的访问接口,比如我们可以很轻松地将访问的数据库从Mysql等移植到OpenLooKeng上,只需要进行少量的代码更改。
类似于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的安全性和便利性。
参赛体会
这是我们第一次参加开源社区的比赛,在此过程中我们有很多的感悟和体会。
- 开源社区很有帮助,最开始我们遇到过一个安装卡死在waiting cluster to start的问题,尝试过很多次无法解决,是社区微信群的一位前辈表示他遇到过,需要手动配置并修改一个配置文件。最后我们成功了。第二个就是stage接口的bug,最开始我以为是自己环境配置的问题,在与社区进行了沟通后确定,应该是系统的代码中出现了Bug。在社区许德智老师的引导下,我提交了openLooKeng的issue。
- 充分利用好工具,比如gitee的issue双周报和wiki,能够给使用者提供很多方便,也有利于开发者时间安排。
- 从开源软件中汲取经验,最开始我们面对PEP-249时是无从下手的,我们后来参考了pymysql的实现,从中获得了很多的帮助。
- 开源不只是把自己的代码发布出来,还要有清晰明了的文档,代码需要符合社区的开发规范,经过充分的测试,最重要的是要长时间的维护。
未来我们团队也会继续完善本项目,为openLooKeng的发展多助力,也祝愿我们的openLooKeng越来越好!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/9471.html