Kafka - SQL 引擎分享

哥不是小蘿莉發表於2016-04-14

1.概述

  大多數情況下,我們使用 Kafka 只是作為訊息處理。在有些情況下,我們需要多次讀取 Kafka 叢集中的資料。當然,我們可以通過呼叫 Kafka 的 API 來完成,但是針對不同的業務需求,我們需要去編寫不同的介面,在經過編譯,打包,釋出等一系列流程。最後才能看到我們預想的結果。那麼,我們能不能有一種簡便的方式去實現這一部分功能,通過編寫 SQL 的方式,來視覺化我們的結果。今天,筆者給大家分享一些心得,通過使用 SQL 的形式來完成這些需求。

2.內容

  實現這些功能,其架構和思路並不複雜。這裡筆者將整個實現流程,通過一個原理圖來呈現。如下圖所示:

  這裡筆者給大家詳述一下上圖的含義,訊息資料來源存放與 Kafka 叢集當中,開啟低階和高階兩個消費執行緒,將消費的結果以 RPC 的方式共享出去(即:請求者)。資料共享出去後,迴流經到 SQL 引擎處,將記憶體中的資料翻譯成 SQL Tree,這裡使用到了 Apache 的 Calcite 專案來承擔這一部分工作。然後,我們通過 Thrift 協議來響應 Web Console 的 SQL 請求,最後將結果返回給前端,讓其以圖表的實行視覺化。

3.外掛配置

  這裡,我們需要遵循 Calcite 的 JSON Models,比如,針對 Kafka 叢集,我們需要配置一下內容:

{
    version: '1.0',
    defaultSchema: 'kafka',  
    schemas: [  
        {
            name: 'kafka',  
            type: 'custom',
            factory: 'cn.smartloli.kafka.visual.engine.KafkaMemorySchemaFactory',  
            operand: {
                database: 'kafka_db'
            }  
        } 
    ]
}

  另外,這裡最好對錶也做一個表述,配置內容如下所示:

[
    {
        "table":"Kafka",
        "schemas":{
            "_plat":"varchar",
            "_uid":"varchar",
            "_tm":"varchar",
            "ip":"varchar",
            "country":"varchar",
            "city":"varchar",
            "location":"jsonarray"
        }
    }
]

4.操作

  下面,筆者給大家演示通過 SQL 來操作相關內容。相關截圖如下所示:

  在查詢處,填寫相關 SQL 查詢語句。點選 Table 按鈕,得到如下所示結果:

  我們,可以將獲取的結果以報表的形式進行匯出。

  當然,我們可以在 Profile 模組下,瀏覽查詢歷史記錄和當前正在執行的查詢任務。至於其他模組,都屬於輔助功能(展示叢集資訊,Topic 的 Partition 資訊等)這裡就不多贅述了。

5.總結

  分析下來,整體架構和實現的思路都不算太複雜,也不存在太大的難點,需要注意一些實現上的細節,比如消費 API 針對叢集訊息引數的調整,特別是低階消費 API,尤為需要注意,其 fetch_size 的大小,以及 offset 是需要我們自己維護的。在使用 Calcite 作為 SQL 樹時,我們要遵循其 JSON Model 和標準的 SQL 語法來運算元據源。

6.結束語

這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!

 

相關文章