本文正在參加「Python主題月」,詳情查看 活動連接node
前不久,2020 openEuler 高校開發者大賽暫告一段落。咱們團隊在此次比賽中承接了「爲openLooKeng開發Python客戶端」項目,成功進入決賽並拿到了二等獎的好成績,也對開源社區有了新的認識和體會。應邀在此介紹一下咱們的pyOpenLooKeng和參賽歷程。python
openLooKeng,原名Hetu,是一個分佈式、低延遲、可靠的數據引擎,提供了統一的SQL接口,具有高性能、跨數據中心/雲查詢、數據源擴展等功能,讓大數據交互式分析變得更簡單。mysql
openLooKeng使用了FaceBook開源的分佈式SQL引擎Presto來提供交互式的查詢分析能力,除此以外還實現了許多features,例如動態過濾、位圖索引、多緩存、跨DC(Data Center,數據中心)鏈接器等,這些讓openLooKeng有了更好的性能、更強的擴展能力和可用性,真正實現了「SQL on Everything」這一理念。git
這是咱們項目的倉庫:gitee.com/openeuler20…sql
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的業務。markdown
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的安全性和便利性。
這是咱們第一次參加開源社區的比賽,在此過程當中咱們有不少的感悟和體會。
將來咱們團隊也會繼續完善本項目,爲openLooKeng的發展多助力,也祝願咱們的openLooKeng愈來愈好!