數據管理向數據湖的轉變確實是必然的,也是一次全平臺的變革。
數據湖將成為管理大量原始、非結構化和半結構化數據的基礎。它可以將歷史數據存儲為單一事實來源,這對于在不同部門和團隊之間保持數據一致性、完整性和可信度是至關重要的。
通過集成Apache Spark、Trino或ClickHouse等計算引擎,data lake變為data lakehouse。這不僅有助于存儲大量數據,而且有助于高效處理數據。
Apache Kafka是一種廣泛使用的事件流平臺,幾乎所有的公司都在使用。起初,Kafka一直被作為數據管道來進行實現,隨著其持久化能力與可靠性,它也被視為現代數據技術中的“新興的數據存儲庫”。
許多數據工程師使用 Kafka 保存最近讀取的數據,通常持續 7 天到一個月,然后再將這些數據傳輸到數據湖中。
在印象中“事件流平臺是針對實時數據的,而數據湖是針對歷史數據的”。然而,隨著數據組件的發展,越來越多的表明 Kafka 正在演變成一種新形式的數據湖。
一、為什么說Kafka是數據湖?
數據湖是一個集中式存儲庫,允許您存儲任意規模的所有結構化和非結構化數據。與以結構化和有組織的方式存儲數據的數據倉庫不同,數據湖以原始、本機格式保留數據,通常采用扁平架構。
目前流行的數據湖管理框架有三種,即Apache Iceberg、Apache Hudi和Delta Lake。雖然這些系統都有其獨特的功能和優勢,但這三個系統都被廣泛用于大規模存儲和管理歷史數據。
它們的設計和功能使處理大量數據變得更加容易,并且它們與 Apache Spark、Flink 等流行計算引擎的集成功能使它們適合各種大數據應用程序和分析用例。
Kafka 擁有所有數據湖屬性
Kafka 本質上非常適合作為數據湖。在討論 Kafka 是否是數據湖的新形式之前,我們首先檢查一下 Kafka 是否具備成為數據湖所需的所有屬性。
ACID屬性:正如 Martin Kleppmann 在 2018 年舊金山 Kafka 峰會主題演講“ Kafka 是數據庫嗎?”中強調的那樣。,Kafka 已經發展到包含所有類似數據庫的屬性,特別是原子性、一致性、隔離性和持久性 (ACID)。雖然許多人使用 Kafka 只存儲最近的數據,但 Kafka 實際上具有無限保留性,類似于現代數據湖。這種功能使 Kafka 成為存儲大量數據的有吸引力的選擇。
分層存儲:人們猶豫是否使用 Kafka 存儲長期數據的一個關鍵原因是認為 Kafka 是基于高性能機器的,其使用價格昂貴。但這已經是曾經的事實,Kafka 的經典設計需要將數據存儲在計算實例中,這可能比對象存儲或HDFS存儲昂貴得多。然而,這種情況已經改變。Confluence 構建的最新版本 Kafka以及Redpanda和Apache Pulsar等其他流行的事件流平臺都采用了分層存儲,將冷數據存儲在廉價的對象存儲中,從而降低了成本并使得持久數據成為可能。這種新設計使 Kafka 適合以低成本存儲大量數據,而無需擔心可擴展性。
存儲實時數據:雖然許多人使用數據湖來存儲歷史數據,但現代數據湖正在不斷發展并變得越來越實時,例如越來越多的人使用數據湖來支持流批一體的能力。這種演變是自然的,因為現代應用程序和設備可以連續生成大量數據。因此,數據湖正在實施優化以允許實時提取數據。作為一個事件流平臺,Kafka 本質上支持實時數據攝取。其架構非常適合存儲快速移動的實時數據和緩慢移動的歷史數據。
存儲不同類型的數據:Kafka 可以處理多種數據類型,從關系數據等結構化數據,到 JSON 和 Avro 等半結構化數據,甚至文本文檔、圖像和視頻等非結構化數據(盡管不常見)。這種多功能性在當今多樣化的數據環境中至關重要,它使 Kafka 能夠充當組織所有數據的集中存儲庫,從而降低管理多個存儲解決方案的復雜性和開銷。
二、Kafka適合成為新的數據湖嗎?
Kafka 擁有數據湖的所有屬性,但 Kafka 是否有潛力成為生產中的新數據湖?
這里有支持這個觀點的理由:
作為Data Source:許多業務直接將數據提取到 Kafka 中,然后再將其傳輸到數據倉庫或其他存儲系統中。如果使用Kafka作為永久保留數據的數據湖,就消除了在不同系統之間重新定位數據的必要性。消除數據移動不僅可以降低成本,還可以最大限度地減少數據不一致和丟失的可能性。
單一事實來源:利用 Kafka 作為數據湖意味著它可以作為整個組織真正的單一事實來源。數據不一致的發生是因為人們轉換數據。但如果我們使用數據源作為數據目的地,那么我們就不會遇到任何數據不一致的問題。此外,這種方法通過減少需要維護、同步和集成的系統數量,顯著簡化了數據架構,從而使基礎設施更易于管理、更不易出錯且更具成本效益。
豐富的生態系統:Kafka 擁有非常豐富且強大的生態系統,用于從各種數據源獲取數據,并且大多數計算引擎可以輕松使用來自 Kafka 的數據。這種靈活性極大地促進了 Kafka 與現有系統和工作流程的集成,從而減少了采用 Kafka 作為數據湖所需的工作量和復雜性。此外,Kafka 的功能不僅僅限于數據攝取和存儲。它還本身提供輕量級流處理功能(通過Kafka Streams),這意味著數據可以在攝取時實時處理。對于需要實時分析和決策能力的組織來說,這是一個顯著的優勢。
三、Kafka能取代現有的數據湖組件嗎?
首先我的答案是否定的,至少在不久的將來不會。
盡管 Kafka 能夠存儲實時和歷史數據,但這并不意味著它將取代廣泛使用的數據湖管理組件,如 Apache Iceberg、Apache Hudi 和 Delta Lake。
這些數據湖管理框架針對大規模數據存儲進行了優化,同時保持了 ACID 屬性。從功能上來說,Kafka 尚未整合關鍵功能,例如用于壓縮的數據類型感知、對查詢下推的支持以及對更新和插入的支持,對列式數據的支持,這使得它在提供歷史數據方面的吸引力較低。
近期可能采用的架構是利用Kafka作為統一的讀寫接口,將熱數據和溫數據存儲在Kafka中。然后,冷數據可以在用戶不知情的情況下透明地從 Kafka 逐步過渡到 Iceberg/Hudi/Delta。
這種方法利用了 Kafka 和現有數據湖的優勢。用戶可以直接調用Kafka API繼續讀寫數據,無需考慮底層結構和數據格式。這意味著底層數據轉換和存儲機制的復雜性被從最終用戶手中抽象出來,簡化了他們與系統的交互。
四、使用 Kafka 構建流數據 Lakehouse
Lakehouse融合了數據湖和數據倉庫功能,它提供了一個統一的平臺,可以處理大量結構化和非結構化數據,并支持高級分析和機器學習。
隨著Kafka演變成一個新的數據湖,本質上可以構建一個可以存儲和處理實時數據和歷史數據的“流式的Lakehouse”。
在 Kafka 之上構建流數據 Lakehouse 至少需要兩個關鍵組件:
流處理系統。第一個基本組件是流處理系統,例如Apache Flink,Spark Streaming。這些系統旨在處理存儲在 Kafka 中的實時數據流,使企業能夠通過分析生成的數據來做出更快、更明智的決策。
實時分析引擎。第二個關鍵組件是實時分析引擎,例如 Apache Spark、Trino 或 ClickHouse。這些引擎旨在分析處理后的數據、提供見解并促進決策。它們能夠以低延遲處理大量數據,這使得它們非常適合基于 Kafka 構建的流數據 Lakehouse 架構。
通過將 Kafka 與強大的流處理系統和強大的實時分析引擎相結合,企業可以創建能夠處理現代數據處理和分析需求的流數據 Lakehouse 架構。
該架構使組織能夠最大限度地發揮數據的價值,提供實時洞察,從而推動更好的決策并創造競爭優勢。
五、Kafka成為真正數據湖還需提供的能力
雖然 Kafka 非常強大且用途廣泛,但如果 Kafka 真正演變成一個數據湖,那么還有一些需要改進的地方。
壓縮的數據類型感知。目前,Kafka 將數據視為字節數組,不知道數據的實際結構和類型。這種意識的缺乏意味著 Kafka 執行的壓縮是通用的,并且不如理解數據結構時的效率高。如果 Kafka 能夠了解它正在處理的數據類型,它就可以更有效地執行數據壓縮。這一改進將通過最大限度地減少需要傳輸和處理的數據量來降低存儲需求并優化分析查詢的性能。
支持查詢下推。查詢下推是一種將查詢的部分內容(例如過濾器)下推到存儲層的技術,從而實現更高效的數據檢索和處理。目前,Kafka不支持查詢下推,這意味著所有數據都需要加載到內存中并進行處理,即使只需要一小部分數據。如果 Kafka 能夠支持查詢下推,那么它將通過減少需要加載到內存和處理的數據量來提高分析查詢的性能。
支持更新和刪除。目前,Kafka 被設計為僅追加日志,雖然有處理更新和刪除的解決方法,但它們并不像傳統數據庫那樣簡單和高效。如果Kafka能夠原生支持更新和刪除操作,那么數據維護將會變得更加簡單和高效。它還將使 Kafka 成為一個更完整、更通用的數據存儲解決方案,從而提高其作為數據湖的適用性。對于許多組織來說,這一新增功能將改變游戲規則,簡化其數據架構并減少與數據維護相關的開銷。
結論
如果Kafka完成了數據湖能力的支持,那么對于整個數據產品來說就是一次整合和變革,將根本性縮短現有的數據處理鏈路,同時可以統一數據源,減少數據產品間的轉換適配等成本。
Kafka天生的“流式底子”能力,也正代表了現代數據架構的轉變,加上流處理系統和實時分析引擎,使其成為構建流式湖倉一體架構的堅實基礎。此外,它對數據持久化的支持、以及作為單一事實來源的能力和豐富的生態系統進一步鞏固了其作為可行的數據湖選項的地位。
我是希望數據下層組件們最好能夠統一下,不同特定領域數據存儲數據引擎事實上本身是有很多共通點的。當前不同數據組件間數據的共享已然成為很大的成本項,也造成了體驗感差的問題。最后讓我們看看Kafka和其他事件流平臺在不久的將的發展,是否可以實現簡單統一的數據源平臺框架。