pyOpenLooKeng——華爲數據分析引擎OpenLooKeng的Python客戶端實現|Python 主題月

本文正在參加「Python主題月」,詳情查看 活動連接node

前不久,2020 openEuler 高校開發者大賽暫告一段落。咱們團隊在此次比賽中承接了「爲openLooKeng開發Python客戶端」項目,成功進入決賽並拿到了二等獎的好成績,也對開源社區有了新的認識和體會。應邀在此介紹一下咱們的pyOpenLooKeng和參賽歷程。python

openLooKeng是什麼?

openLooKeng,原名Hetu,是一個分佈式、低延遲、可靠的數據引擎,提供了統一的SQL接口,具有高性能、跨數據中心/雲查詢、數據源擴展等功能,讓大數據交互式分析變得更簡單。mysql

openLooKeng使用了FaceBook開源的分佈式SQL引擎Presto來提供交互式的查詢分析能力,除此以外還實現了許多features,例如動態過濾、位圖索引、多緩存、跨DC(Data Center,數據中心)鏈接器等,這些讓openLooKeng有了更好的性能、更強的擴展能力和可用性,真正實現了「SQL on Everything」這一理念。git

咱們的pyOpenLooKeng是怎麼作的?

這是咱們項目的倉庫: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加密以及BasicKerberos認證。 Python客戶端做爲OpenLooKeng的模塊,須要符合OpenLooKeng的開發規範,同時客戶端須要通過充分測試,單元測試覆蓋率須要符合OpenLooKeng的要求,而且功能完成,可以正常訪問OpenLooKeng的業務。markdown

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愈來愈好!

相關文章
相關標籤/搜索