博文推薦|使用 Pulsar IO 打造流資料管道

ApachePulsar發表於2021-12-06
本文翻譯自 StreamNative 部落格。部落格原作者:Ioannis Polyzos,StreamNative 解決方案工程師。原文連結:https://streamnative.io/blog/...

背景

構建現代資料基礎設施一直是當今企業的難題。當今的企業需要管理全天候生成和交付的大量異構資料。然而,由於企業對資料的數量和速度等等有多種要求,沒有“一刀切”的解決方案。相反,企業需在不同系統之間移動資料,以便儲存、處理和提供資料。

粗看搭建基礎設施的歷史,企業使用了許多不同的工具來嘗試移動資料,例如用於流式工作負載的 Apache Kafka 和用於訊息工作負載的 RabbitMQ。現在,Apache Pulsar 的誕生為企業簡化了這個過程。

Apache Pulsar 是一個雲原生的分散式訊息流平臺。Pulsar 旨在滿足現代資料需求,支援靈活的訊息傳遞語義、分層儲存、多租戶和異地複製(跨區域資料複製)。自 2018 年畢業成為 Apache 軟體基金會頂級專案以來,Pulsar 專案經歷了快速的社群增長、周邊生態的發展和全球使用者的增長。將 Pulsar 用作資料基礎設施的支柱,公司能夠以快速且可擴充套件的方式移動資料。在這篇博文中,我們將介紹如何使用 Pulsar IO 在 Pulsar 和外部系統之間輕鬆匯入和匯出資料。

1. Pulsar IO 簡介

Pulsar IO 是一個完整的工具包,用於建立、部署和管理與外部系統(如鍵/值儲存、分散式檔案系統、搜尋索引、資料庫、資料倉儲、其他訊息傳遞系統等)整合的 Pulsar 聯結器。由於 Pulsar IO 構建在 Pulsar 的無伺服器計算層(稱為 Pulsar Function)之上,因此編寫 Pulsar IO 聯結器就像編寫 Pulsar Function 一樣簡單。

藉助 Pulsar IO,使用者可以使用現有的 Pulsar 聯結器或編寫自己的自定義聯結器,輕鬆地將資料移入和移出 Pulsar。Pulsar IO 擁有以下優勢:

  • 多樣的聯結器:當前 Pulsar 生態中有許多現有的 Pulsar IO 聯結器用於外部系統,例如 Apache Kafka、Cassandra 和 Aerospike。使用這些聯結器有助於縮短生產時間,因為建立整合所需的所有部件都已就位。開發人員只需要提供配置(如連線 url 和憑據)來執行聯結器。
  • 託管執行時:Pulsar IO 帶有託管執行時,負責執行、排程、擴充套件和容錯。開發人員可以專注於配置和業務邏輯。
  • 多介面:通過 Pulsar IO 提供的介面,使用者可以減少用於生成和使用應用程式的樣板程式碼。
  • 高擴充套件性:在需要更多例項來處理傳入流量的場景下,使用者可以通過更改一個簡單的配置值輕鬆橫向擴充套件;如果使用者使用 Kubernetes 執行時,可根據流量需求進行彈性擴充套件。
  • 充分利用 schema:Pulsar IO 通過在資料模型上指定 schema 型別來幫助使用者充分運用 schema,Pulsar IO 支援 JSON、Avro 和 Protobufs 等 schema 型別。

2. Pulsar IO 執行時

由於 Pulsar IO 建立在 Pulsar Function 之上,因此 Pulsar IO 和 Pulsar Function 具有相同的執行時選項。部署 Pulsar IO 聯結器時,使用者有以下選擇:

  • 執行緒:在與工作執行緒相同的 JVM 中執行。(通常用於測試的和本地執行,不推薦用於生產部署。)
  • 程式:在不同的程式中執行,使用者可以使用多個工作執行緒跨多個節點橫向擴充套件。
  • Kubernetes:在 Kubernetes 叢集中作為 Pod 執行,worker 與 Kubernetes 協調。這種執行時方式保證使用者可以充分利用 Kubernetes 這樣的雲原生環境提供的優勢,比如輕鬆橫向擴充套件。雲原生環境提供的優勢,比如輕鬆橫向擴充套件。

3. Pulsar IO 介面

如前所述,Pulsar IO 減少了生成和消費應用程式所需的樣板程式碼。它通過提供不同的基本介面來實現這一點,這些介面抽象出樣板程式碼並允許我們專注於業務邏輯。

Pulsar IO 支援 Source 和 Sink 的基本介面。Source 聯結器(Source connector)允許使用者將資料從外部系統帶入 Pulsar,而 Sink 聯結器(Sink Connector)可用於將資料移出 Pulsar 並移入外部系統,例如資料庫。

還有一種特殊型別的 Source 聯結器,稱為 Push Source。Push Source 聯結器可以輕鬆實現某些需要推送資料的整合。舉例來說,Push Source 可以是變更資料捕獲源系統,它在接收到新變更後,會自動將該變更推送到 Pulsar。

Source 介面

public interface Source<T> extends AutoCloseable {
 
    /**
     * Open connector with configuration.
     *
     * @param config initialization config
     * @param sourceContext environment where the source connector is running
     * @throws Exception IO type exceptions when opening a connector
     */
    void open(final Map<String, Object> config, SourceContext sourceContext) throws Exception;
 
    /**
     * Reads the next message from source.
     * If source does not have any new messages, this call should block.
     * @return next message from source.  The return result should never be null
     * @throws Exception
     */
    Record<T> read() throws Exception;
}

Push Source 介面

public interface BatchSource<T> extends AutoCloseable {
 
    /**
     * Open connector with configuration.
     *
     * @param config config that's supplied for source
     * @param context environment where the source connector is running
     * @throws Exception IO type exceptions when opening a connector
     */
    void open(final Map<String, Object> config, SourceContext context) throws Exception;
 
    /**
     * Discovery phase of a connector.  This phase will only be run on one instance, i.e. instance 0, of the connector.
     * Implementations use the taskEater consumer to output serialized representation of tasks as they are discovered.
     *
     * @param taskEater function to notify the framework about the new task received.
     * @throws Exception during discover
     */
    void discover(Consumer<byte[]> taskEater) throws Exception;
 
    /**
     * Called when a new task appears for this connector instance.
     *
     * @param task the serialized representation of the task
     */
    void prepare(byte[] task) throws Exception;
 
    /**
     * Read data and return a record
     * Return null if no more records are present for this task
     * @return a record
     */
    Record<T> readNext() throws Exception;
}

Sink 介面

public interface Sink<T> extends AutoCloseable {
    /**
     * Open connector with configuration.
     *
     * @param config initialization config
     * @param sinkContext environment where the sink connector is running
     * @throws Exception IO type exceptions when opening a connector
     */
    void open(final Map<String, Object> config, SinkContext sinkContext) throws Exception;
 
    /**
     * Write a message to Sink.
     *
     * @param record record to write to sink
     * @throws Exception
     */
    void write(Record<T> record) throws Exception;
}

4. 總結

Apache Pulsar 能夠作為現代資料基礎設施的支柱,它使企業能夠以快速且可擴充套件的方式搬運資料。Pulsar IO 是一個聯結器框架,它為開發人員提供了所有必要的工具來建立、部署和管理與不同系統整合的 Pulsar 聯結器。Pulsar IO 抽象掉所有樣板程式碼,使開發人員可以專注於應用程式邏輯。

5. 延伸閱讀

如果您有興趣瞭解更多資訊並構建自己的聯結器,請檢視以下資源:


譯者簡介

宋博,就職於北京百觀科技有限公司,高階開發工程師,專注於微服務,雲端計算,大資料領域。

加入 Apache Pulsar 中文交流群 ??

圖片

點選連結 ,檢視 Apache Pulsar 乾貨集錦

相關文章