Categories
程式開發

Rheos SQL: 高效易用的實時流式SQL處理平台


一、動機

01 實時即未來

自2015年“streaming 101: the world beyond batch”[1] 發表以來,已經過去了將近5年。現在,越來越多的人相信,批處理是流式處理的特殊情況,基於流式處理的實時數據分析才是未來發展的方向。

與傳統批處理相比,流式處理的優勢 有以下幾點:

  1. 輸出結果的延時更低:從之前的 小時級天級 ,降為 分鐘級秒級
  2. 模型更契合:很多大規模數據,比如訪問網站的用戶行為數據,生成的模式是源源不斷的,流式處理模型更符合數據本身生成的模式。

流處理的框架,在 開源和商用領域 也取得了很好的發展[2],如今更加成熟和穩定,足夠在生產環境廣泛使用。其中 Apache Flink [3]的模型定義和機制設計比較符合公司裡的業務場景,很多用戶都在其上建立自己的應用程序。

02 簡單強大的SQL語言

SQL是數據分析人員最熟悉的語言。相對於傳統運行在數據庫和批處理中的SQL,流式SQL有以下特點

  1. 面相無界的流式數據源。與流式處理一樣,流式SQL所針對的數據源也是無界流,沒有起始,也沒有終點。
  2. 依照流式處理的定義,增加相應的關鍵字和語義擴展。流式處理常見的概念有:窗口(Window),觸發器(Trigger),水位線(Watermark)等。

一些開源SQL引擎已經增加了對流式SQL的支持。比如,Calcite[4]添加了Window等關鍵字。流處理框架產品,也幾乎都增加了原生對於SQL的支持,比如 Flink SQL [5]和 KSQL [6]。使用SQL而不是更底層的API來描述業務邏輯的好處有:

  1. 節省開發成本:作為簡單易用的高級語言,SQL的描述能力更強,同樣的邏輯開發起來更快速。
  2. 節省維護成本:修改清晰易懂的SQL腳本,比修改複雜的代碼邏輯更容易。
  3. 更好的透明性:對底層細節的隱藏,使得用SQL語言表達的邏輯可以規避掉一部分底層實現變動帶來的遷移。

當然,由於抽象層次更高,SQL可能只能覆蓋 80% 的用戶場景,所以,流處理框架通過支持User Defined Function(UDF)和Complex Event Processing(CEP)來滿足更高級別用戶的需求。

03 擁抱開源社區的同時彌補缺陷

開源社區在流處理和流式SQL處理領域都已經做了大量的工作,沒有必要從頭開始重新造輪子。但是,與其他開源社區產品一樣,在公司內部做到開箱即用,還是會存在一些差距,主要表現為以下幾個方面:

  1. SQL語法和語義本身不夠全面:真正的線上業務場景複雜,使用到的外圍系統眾多,開源產品不能直接全部滿足。舉個例子,公司內部有一種將RESTful服務作為維表,與源數據進行JOIN的需求,但在當前的開源產品中,並不能找到原生的支持。
  2. 易用性:開源的SQL處理引擎是作為框架形式提供的,用戶需要自己管理SQL腳本、UDF,並考慮如何與底層的執行引擎做集成。
  3. 穩定性:開源產品的接口變動是不受單個公司控制的,業務團隊都希望只花力氣在業務邏輯的開發,而不是不斷地因平台層的接口變動而修改邏輯。
  4. 監控與報警:開源產品通常是提供基礎監控的,但是要在生產環境廣泛使用,且往往需要與公司內部的監控報警系統集成。在開源基礎上,也需要依照實際情況添加更多的監控指標。

二、功能

本章羅列了Rheos SQL作為流式SQL處理引擎所支持的功能。

01 SQL語義與語法

當前支持的語法模塊如下表所示:

Rheos SQL: 高效易用的實時流式SQL處理平台 1

02 與外部資源對接模塊

當前支持訪問的外部模塊如下表所示:

Rheos SQL: 高效易用的實時流式SQL處理平台 2

三、架構

Rheos SQL: 高效易用的實時流式SQL處理平台 3

如上圖所示,在總體架構上,Rheos SQL分為三層:核心服務層(Core Service Layer),SQL開發工具包層(SQL SDK Layer)以及 基礎服務層 (Infrastructure Layer)。

01 核心服務層(Core Service Layer)

該層主要負責管理面相用戶的SQL資源,是用戶接觸的主要接口。

以RESTful服務的形式,將Rheos SQL的核心資源暴露給用戶,核心資源包括

  1. SQL腳本(SQL Script):用戶所編寫的SQL語句,用以描述業務邏輯,屬性包括存貯的位置等。
  2. UDF包(UDF Package):用戶的自定義函數包,屬性包括存儲的位置,包中支持的函數等。
  3. SQL作業(SQL Job):SQL運行時的抽象,是SQL腳本的實例化之後,在集群中運行的實例,屬性包括關聯的SQL腳本,啟動參數等。
    SQL源腳本的管理模塊:管理SQL腳本的生命週期,比如支持運行時拉取。
    包管理模塊:管理用戶上傳包的生命週期,比如運行時加載。

02 SQL開發工具包層(SQL SDK Layer)

該層負責在開源流式SQL引擎上增強擴展,支持更豐富的語義和語法。

核心SQL模塊(Core SQL Modules):負責SQL的解析,優化和執行計劃生成。
與外部資源對接模塊(Connects):加載和拉取存儲在外部依賴中的數據,比如Kafa-Connect會維護Kafka的Consumer,從Kafka消費數據,並交給流處理引擎。
用戶自定義函數模塊(UDF):支持自定義函數和組件,比如對源數據的自定義解析函數。
執行提供模塊(Executor Provider):抽象層,隱藏底層實現細節,保證對外編程接口穩定。

當前,SQL工具包是在FLINK SQL的基礎上,提供了功能擴展。

該層的設計可以幫助我們在不影響用戶的同時,靈活切換底層基礎服務的實現。比如,Rheos SQL可以內部升級FLINK的版本,或者使用其他流處理框架實現流處理的功能,而用戶對接的則一直是Rheos SQL定義的語法與編程接口。

03 基礎服務層(Infrastructure Layer)

該層負責運行時基礎設施的提供與維護。在公司內部,所有集群都運行在 K8S 平台,並有流平台團隊提供了流處理基礎設施的管理。

當前,Rheos SQL選用的流處理框架是 Apache Flink ,流平台團隊管理了Flink集群的創建與維護,並支持資源額度管理、基礎監控暴露收集等。

四、用戶體驗

Rheos SQL: 高效易用的實時流式SQL處理平台 4

上圖展示了Rheos SQL平台的使用流程,其用戶體驗可歸結如下

首先,像開發其他應用程序一樣,編寫SQL源代碼,並提交到代碼庫。在我們的實現中,提供對接兩種代碼庫的實現

  1. Git:作為公司廣泛使用的代碼庫管理工具,Git本身就提供強大的版本控制和歷史信息追踪,推薦部署到生產環境的Rheos SQL應用都採用這種源代碼庫。
  2. DB:直接將SQL源腳本提交到Rheos SQL系統,落庫。適用於跑DEMO,或者功能性驗證階段。

如果是比較高級的用戶,需要編寫UDF或者在SQL工具包的基礎上定制功能,可以在本地編碼結束後,上傳到遠程的存儲。流平台團隊提供了MAVEN插件,可以在IDE中方便地完成上傳。在實現時,我們使用的對象存儲是 Swift [7]。

除此之外,用戶需要將SQL腳本和自定義的包在Rheos SQL的系統中註冊,完成源信息的提交(Metadata Onboard)。

為了盡快找到程序中的bug,驗證邏輯和配置細節,Rheos SQL平台提供了 線上驗證和配置 的功能。

一切就緒後,可以在Rheos SQL平台提交作業。 Rheos SQL會將這個SQL作業,轉化成 底層流平台 具體實現的作業。

在當前實現中,Rheos SQL作業會被註冊成Flink的作業,存放到流平台上。在運行時,Rheos SQL的工具包會根據用戶註冊的信息,動態拉取SQL腳本的源代碼,並加載用戶自定義的擴展包,進行解析、優化並在流框架上執行用戶邏輯。

作業運行起來後,可以通過Rheos SQL的門戶網站操作和監控。

五、與維表的JOIN

01 用例

在現有的業務場景中,有很多使用源表數據與外部存儲JOIN的用例。

Rheos SQL: 高效易用的實時流式SQL處理平台 5

上圖是實際應用的一個例子,輸出與用戶購買行為相關的統計信息。 SQL作業的數據源是存放在 Kafka 中的用戶交易數據。

處理的第一步,是將源表與一張RESTful形式的維表根據user域做JOIN,構造出cguid_view臨時表。

處理的第二步,是將cguid_view臨時表,與存放在Cassandra中的一張維表,根據user和itemId域做JOIN,輸出event_view臨時表。

處理的第三步,是在event_view臨時表上做聚合,將最終的結果輸出到Cassandra。

02 實現細節

為了提升性能,在實現維表JOIN時,Rheos SQL重點做了以下兩方面的工作:

  1. LRU緩存:為了減少與外部存儲的頻繁交互,在內存中會默認開啟LRU的緩存。同樣的KEY,在緩存失效前,會優先從緩存中返回。新的KEY在首次取回之後,也會加入到緩存中。
  2. 異步查詢:為了在等待外部存儲返回結果前,避免同步等待IO,Rheos SQL使用了FLINK的Async API實現異步查詢。 Rheos SQL中的所有維表實現,都繼承自一個支持異步的抽像類,子類實現數據拿取的業務邏輯,並將結果以Future的形式返回給父類。父類負責對結果的最終處理。

六、Debug和監控

為了加快迭代速度,及時發現問題,Rheos SQL在不同的階段提供了豐富的工具幫助用戶調試和監控SQL作業。

01 本地測試框架

SQL開放工具集中,提供了一個 本地測試框架 ,具體功能為:

  1. 以文件的形式,定義SQL作業的輸入和輸出。
  2. 本地啟動所有的外部依賴模塊,將輸入寫到源和對應的維表。
  3. 運行SQL的處理邏輯,並將輸出寫入到目標存儲和文件。
  4. 比較目標輸出是否與用戶一開始定義的一致,並返回比較結果。

在這個測試框架的幫助下,用戶可以本地完成SQL腳本的開發和測試工作,並初步驗證邏輯的正確性,及時對bug做好修正。

02 SQL邏輯圖

用戶在Rheos SQL系統中註冊好SQL之後,可以查看 SQL的邏輯執行圖

Rheos SQL: 高效易用的實時流式SQL處理平台 6

上圖是一個實際應用中的例子。源表和維表在第一次JOIN之後,將聚合的結果寫入到了TEMP_VIEW,然後從臨時表中選取了部分數據輸出到目標表。

用戶通過邏輯執行圖,可以驗證邏輯是否符合預期,在將SQL作業真正運行前,發現問題並修正。

03 線上SQL作業的監控

除去Flink本身提供的監控指標之外,Rheos SQL還提供了很多從SQL表級別暴露的信息。根據表類型的不同,部分指標詳情如下:

  1. 源表:消費者尚未讀取的數據量(Consumer Lag),讀入數據條數,讀入數據量等。
  2. 維表:接受數據條數,讀取外部數據響應時間,與外部系統建立的連接數等。
  3. 目標表:輸出的數據條數,寫入外部系統失敗的條數等。

用戶通過對業務指標的監控,可以在作業運行時感知到異常情況的發生,及時採取應對措施。

總結與展望

Rheos SQL平台 在開源流式SQL處理框架的基礎上,提供了豐富的語義與擴展。用戶可以在Rheos SQL平台上,方便地開發、調試、監控SQL作業,節省流式作業的開發,維護成本。接下來,Rheos SQL在進一步滿足用戶需求的同時,將會在 資源管理、動態擴容以及CEP語義支持 等方面,投入更多的努力。

參考文獻

[1] https://www.oreilly.com/radar/the-world-beyond-batch-streaming-101/

[2] https://www.upsolver.com/blog/popular-stream-processing-frameworks-compared

[3] https://flink.apache.org/

[4] https://calcite.apache.org/

[5] https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/sql/

[6] https://www.confluent.io/product/ksql/

[7] https://wiki.openstack.org/wiki/Swift

本文轉載自公眾號eBay技術薈(ID:eBayTechRecruiting)。

原文鏈接

https://mp.weixin.qq.com/s/jBHvtaBHqBuOm6PMWnF1yQ