基於Kafka+Flink平臺化設計,實時數倉還能這樣建

2020-12-23 TechWeb

本文由網易雲音樂實時計算平臺研發工程師嶽猛分享,主要從以下四個部分將為大家介紹 Flink + Kafka 在網易雲音樂的應用實戰:

背景 Flink + Kafka 平臺化設計 Kafka 在實時數倉中的應用 問題 & 改進 一、背景介紹

1、流平臺通用框架

目前流平臺通用的架構一般來說包括消息隊列、計算引擎和存儲三部分,通用架構如下圖所示。客戶端或者 web 的 log 日誌會被採集到消息隊列;計算引擎實時計算消息隊列的數據;實時計算結果以 Append 或者 Update 的形式存放到實時存儲系統中去。

目前,我們常用的消息隊列是 Kafka,計算引擎一開始我們採用的是 Spark Streaming,隨著 Flink 在流計算引擎的優勢越來越明顯,我們最終確定了 Flink 作為我們統一的實時計算引擎。

2、為什麼選 Kafka?

Kafka 是一個比較早的消息隊列,但是它是一個非常穩定的消息隊列,有著眾多的用戶群體,網易也是其中之一。我們考慮 Kafka 作為我們消息中間件的主要原因如下:

高吞吐,低延遲:每秒幾十萬 QPS 且毫秒級延遲; 高並發:支持數千客戶端同時讀寫; 容錯性,可高性:支持數據備份,允許節點丟失; 可擴展性:支持熱擴展,不會影響當前線上業務。

3、為什麼選擇 Flink?

Apache Flink 是近年來越來越流行的一款開源大數據流式計算引擎,它同時支持了批處理和流處理,考慮 Flink 作為我們流式計算引擎的主要因素是:

高吞吐,低延遲,高性能; 高度靈活的流式窗口; 狀態計算的 Exactly-once 語義; 輕量級的容錯機制; 支持 EventTime 及亂序事件; 流批統一引擎。

4、Kafka + Flink 流計算體系

基於 Kafka 和 Flink 的在消息中間件以及流式計算方面的耀眼表現,於是產生了圍繞 Kafka 及 Flink 為基礎的流計算平臺體系,如下圖所示:基於 APP、web 等方式將實時產生的日誌採集到 Kafka,然後交由 Flink 來進行常見的 ETL,全局聚合以及Window 聚合等實時計算。

5、網易雲音樂使用 Kafka 的現狀

目前我們有 10+個 Kafka 集群,各個集群的主要任務不同,有些作為業務集群,有些作為鏡像集群,有些作為計算集群等。當前 Kafka 集群的總節點數達到 200+,單 Kafka 峰值 QPS 400W+。目前,網易雲音樂基於 Kafka+Flink 的實時任務達到了 500+。

二、Flink+Kafka 平臺化設計

基於以上情況,我們想要對 Kafka+Flink 做一個平臺化的開發,減少用戶的開發成本和運維成本。實際上在 2018 年的時候我們就開始基於 Flink 做一個實時計算平臺,Kafka 在其中發揮著重要作用,今年,為了讓用戶更加方便、更加容易的去使用 Flink 和 Kafka,我們進行了重構。

基於 Flink 1.0 版本我們做了一個 Magina 版本的重構,在 API 層次我們提供了 Magina SQL 和 Magina SDK 貫穿 DataStream 和 SQL 操作;然後通過自定義 Magina SQL Parser 會把這些 SQL 轉換成 Logical Plan,在將 LogicalPlan 轉化為物理執行代碼,在這過程中會去通過 catalog 連接元數據管理中心去獲取一些元數據的信息。我們在 Kafka 的使用過程中,會將 Kafka 元數據信息登記到元數據中心,對實時數據的訪問都是以流表的形式。在 Magina 中我們對 Kafka 的使用主要做了三部分的工作:

集群 catalog 化; Topic 流表化; Message Schema 化。

用戶可以在元數據管理中心登記不同的表信息或者 catalog 信息等,也可以在 DB 中創建和維護 Kafka 的表,用戶在使用的過程只需要根據個人需求使用相應的表即可。下圖是對 Kafka 流表的主要引用邏輯。

三、Kafka 在實時數倉中的應用

1、在解決問題中發展

Kafka 在實時數倉使用的過程中,我們遇到了不同的問題,中間也嘗試了不同的解決辦法。

在平臺初期, 最開始用於實時計算的只有兩個集群,且有一個採集集群,單 Topic 數據量非常大;不同的實時任務都會消費同一個大數據量的 Topic,Kafka 集群 IO 壓力異常大;

因此,在使用的過程發現 Kafka 的壓力異常大,經常出現延遲、I/O 飆升。

我們想到把大的 Topic 進行實時分發來解決上面的問題,基於 Flink 1.5 設計了如下圖所示的數據分發的程序,也就是實時數倉的雛形。基於這種將大的 Topic 分發成小的 Topic 的方法,大大減輕了集群的壓力,提升了性能,另外,最初使用的是靜態的分發規則,後期需要添加規則的時候要進行任務的重啟,對業務影響比較大,之後我們考慮了使用動態規則來完成數據分發的任務。

解決了平臺初期遇到的問題之後,在平臺進階過程中 Kafka 又面臨新的問題:

雖然進行了集群的擴展,但是任務量也在增加,Kafka 集群壓力仍然不斷上升; 集群壓力上升有時候出現 I/O 相關問題,消費任務之間容易相互影響; 用戶消費不同的 Topic 過程沒有中間數據的落地,容易造成重複消費; 任務遷移 Kafka 困難。

針對以上問題,我們進行了如下圖所示的 Kafka 集群隔離和數據分層處理。其過程簡單來說,將集群分成 DS 集群、日誌採集集群、分發集群,數據通過分發服務分發到 Flink 進行處理,然後通過數據清洗進入到 DW 集群,同時在 DW 寫的過程中會同步到鏡像集群,在這個過程中也會利用 Flink 進行實時計算的統計和拼接,並將生成的 ADS 數據寫入在線 ADS 集群和統計 ADS 集群。通過上面的過程,確保了對實時計算要求比較高的任務不會受到統計報表的影響。

通過上面的過程,確保了對實時計算要求比較高的任務不會受到統計報表的影響。但是我們分發了不同的集群以後就不可避免的面臨新的問題:

如何感知 Kafka 集群狀態? 如何快速分析 Job 消費異常?

針對上面兩個問題,我們做了一個 Kafka 監控系統,其監控分為如下兩個維度,這樣在出現異常的時候就可以進行具體判斷出現問題的詳細情況:

集群概況的監控:可以看到不同集群對應的 Topic 數量以及運行任務數量,以及每個 Topic 消費任務數據量、數據流入量、流入總量和平均每條數據大小; 指標監控:可以看到 Flink 任務以及對應的 Topic、GroupID、所屬集群、啟動時間、輸入帶寬、InTPS、OutTPS、消費延遲以及 Lag 情況。

2、Flink + Kafka 在 Lambda 架構下的運用

流批統一是目前非常火的概念,很多公司也在考慮這方面的應用,目前常用的架構要麼是 Lambda 架構,要麼是 Kappa 架構。對於流批統一來講需要考慮的包括存儲統一和計算引擎統一,由於我們當前基建沒有統一的存儲,那麼我們只能選擇了 Lamda 架構。

下圖是基於 Flink 和 Kafka 的 Lambda 架構在雲音樂的具體實踐,上層是實時計算,下層是離線計算,橫向是按計算引擎來分,縱向是按實時數倉來區分。

四、問題&改進

在具體的應用過程中,我們也遇到了很多問題,最主要的兩個問題是:

多 Sink 下 Kafka Source 重複消費問題; 同交換機流量激增消費計算延遲問題。

1、多 Sink 下 Kafka Source 重複消費問題

Magina 平臺上支持多 Sink,也就是說在操作的過程中可以將中間的任意結果插入到不同的存儲中。這個過程中就會出現一個問題,比如同一個中間結果,我們把不同的部分插入到不同的存儲中,那麼就會有多條 DAG,雖然都是臨時結果,但是也會造成 Kafka Source 的重複消費,對性能和資源造成極大的浪費。

於是我們想,是否可以避免臨時中間結果的多次消費。在 1.9 版本之前,我們進行了 StreamGraph 的重建,將三個 DataSource 的 DAG 進行了合併;在 1.9 版本,Magina 自己也提供了一個查詢和 Source 合併的優化;但是我們發現如果是在同一個 data update 中有對同一個表的多個 Source 的引用,它自己會合併,但是如果不是在同一個 data update 中,是不會立即合併的,於是在 1.9 版本之後中我們對 modifyOperations 做了一個 buffer 來解決這個問題。

2、同交換機流量激增消費計算延遲問題

這個問題是最近才出現的問題,也可能不僅僅是同交換機,同機房的情況也可能。在同一個交換機下我們部署了很多機器,一部分機器部署了 Kafka 集群,還有一部分部署了 Hadoop 集群。在 Hadoop 上面我們可能會進行 Spark、Hive 的離線計算以及 Flink 的實時計算,Flink 也會消費 Kafka 進行實時計算。在運行的過程中我們發現某一個任務會出現整體延遲的情況,排查過後沒有發現其他的異常,除了交換機在某一個時間點的瀏覽激增,進一步排查發現是離線計算的瀏覽激增,又因為同一個交換機的帶寬限制,影響到了 Flink 的實時計算。

為解決這個問題,我們就考慮要避免離線集群和實時集群的相互影響,去做交換機部署或者機器部署的優化,比如離線集群單獨使用一個交換機,Kafka 和 Flink 集群也單獨使用一個交換機,從硬體層面保證兩者之間不會相互影響。

Q&A

Q1:Kafka 在實時數倉中的數據可靠嗎?

A1:這個問題的答案更多取決於對數據準確性的定義,不同的標準可能得到不同的答案。自己首先要定義好數據在什麼情況下是可靠的,另外要在處理過程中有一個很好的容錯機制。

Q2:我們在學習的時候如何去學習這些企業中遇到的問題?如何去積累這些問題?

A2:個人認為學習的過程是問題推動,遇到了問題去思考解決它,在解決的過程中去積累經驗和自己的不足之處。

Q3:你們在處理 Kafka 的過程中,異常的數據怎麼處理,有檢測機制嗎?

A3:在運行的過程中我們有一個分發的服務,在分發的過程中我們會根據一定的規則來檢測哪些數據是異常的,哪些是正常的,然後將異常的數據單獨分發到一個異常的 Topic 中去做查詢等,後期用戶在使用的過程中可以根據相關指標和關鍵詞到異常的 Topic 中去查看這些數據。

 

相關焦點

  • Flink + Iceberg 全場景實時數倉的建設實踐
    本文由騰訊數據平臺部高級工程師蘇舒分享,主要介紹騰訊大數據部門基於 Apache Flink 和 Apache Iceberg 構建實時數倉的應用實踐,介紹主要包括如下幾個方面:背景及痛點數據湖 Apache Iceberg 的介紹Flink+Iceberg 構建實時數倉未來規劃Tips:點擊文末「
  • 數倉實時化改造:Hudi on Flink 在順豐的實踐應用
    作者 | 蔡適擇(順豐大數據平臺負責人) 整理 | 趙陽(Flink 社區志願者) 本文主要介紹順豐在數據倉庫的數據實時化、資料庫 CDC、Hudi on Flink 上的實踐應用及產品化經驗。
  • BIGO技術:實時計算平臺建設
    這些實時數據的能力都要依靠實時計算平臺來提供。從業界來看,實時化的趨勢正在加速,本文將介紹BIGO基於flink的實時計算平臺的建設經驗和成果。二、平臺介紹BIGO實時計算的發展大概分為兩個階段,在2018年之前,實時場景還比較少,實時的作業數量也不多,當時主要採用Spark Streaming來支持。
  • flink-1.12.0 upsert-kafka connector demo
    /dev/table/connectors/kafka.htmlhttps://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/dev/table/connectors/upsert-kafka.html Flink 1.12.0 已經發布了有一段時間了, 這段時間都比較忙,很少嘗試新版本的功能,之前升級
  • Flink保證端到端exactly-once語義(也適用於kafka)
    TwoPhaseCommitSinkFunction 就是把最後寫入存儲的邏輯分為兩部提交,這樣就有可能構建一個從數據源到數據輸出的一個端到端的exactly-once語義的flink應用。當然,TwoPhaseCommitSinkFunction的數據輸出包括apache kafka 0.11以上的版本。
  • 實戰|Kafka + Flink + Redis 的電商大屏實時計算案
    實時大屏(real-time dashboard)正在被越來越多的企業採用,用來及時呈現關鍵的數據指標。並且在實際操作中,肯定也不會僅僅計算一兩個維度。由於Flink的「真·流式計算」這一特點,它比Spark Streaming要更適合大屏應用。本文從筆者的實際工作經驗抽象出簡單的模型,並簡要敘述計算流程(當然大部分都是源碼)。
  • Flink 全網最全資源(視頻、博客、PPT、入門、實戰、源碼解析、問答等持續更新)
    15、flink的Python api怎樣?bug多嗎?16、Flink VS Spark Streaming VS Storm VS Kafka Stream17、你們做實時大屏的技術架構是什麼樣子的?flume→kafka→flink→redis,然後後端去redis裡面撈數據,醬紫可行嗎?
  • 阿里巴巴雲原生實時數倉核心技術揭秘
    Hologres誕生到參與2020年史上最強雙十一的三年多時間裡,完成不少從0到1的突破: 從一個業務到數百業務實例,覆蓋了阿里巴巴集團內90%以上業務場景,包括雙十一實時直播間、智能推薦、阿里媽媽數據平臺、國際站數據平臺、菜鳥數據平臺、友盟+全域數據分析、CCO智能客服、新零售數據平臺、考拉
  • Flink SQL 實戰:HBase 的結合應用
    HBase 作為 Google 發表 Big Table 論文的開源實現版本,是一種分布式列式存儲的資料庫,構建在 HDFS 之上的 NoSQL 資料庫,非常適合大規模實時查詢,因此 HBase 在實時計算領域使用非常廣泛。可以實時寫 HBase,也可以利用 buckload 一把把離線 Job 生成 HFile Load 到HBase 表中。
  • Flink 端到端 Exactly-once 機制剖析
    但是,flink有很多外接系統,比如將數據寫到kafka,一旦作業失敗重啟,offset重置,會消費舊數據,從而將重複的結果寫到kafka。如下圖:      這個時候,僅靠系統本身是無法保證exactly-once的。系統之間的數據一致性一般要靠2PC協議來保證,flink的TwoPhaseCommitSinkFunction也是基於此實現的。
  • Apache Beam實戰指南 | 手把手教你玩轉KafkaIO與Flink
    圖 2-2Storm 流程圖 業務進一步發展,運營人員需要看到實時數據的展示或統計。例如電商網站促銷的時候,用於統計用戶實時交易數據。數據收集也使用 MQ,用流式 Storm 解決這一業務需求問題。
  • Flink寫入hive測試
    </groupId>      <artifactId>kafka-clients</artifactId>      <version>0.11.0.0</version>    </dependency>    <dependency>      <groupId
  • Flink Forward Asia 2020 總結
    同時他也對 Flink 如何在未來做到計算普惠化和數據智能化提出更多期待,讓 Flink 的小松果在各行各業的數據和智能融合中生根發芽!二是由阿里雲天池平臺和 Intel 聯合舉辦的第二屆 Apache Flink 極客挑戰賽頒獎典禮。
  • 深度好文|如何設計實時數據平臺 -- 上篇(ODF強烈推薦)
    導讀:本文將會分上下兩篇對一個重要且常見的大數據基礎設施平臺展開討論,即「實時數據平臺」。在上篇設計篇中,我們首先從兩個維度介紹實時數據平臺:從現代數倉架構角度看待實時數據平臺,從典型數據處理角度看待實時數據處理;接著我們會探討實時數據平臺整體設計架構、對具體問題的考量以及解決思路。
  • Structured Streaming與Flink比較
    Flink作為一個很好用的實時處理框架,也支持批處理,不僅提供了API的形式,也可以寫sql文本。這篇文章主要是幫著大家對於Structured Streaming和flink的主要不同點。文章建議收藏後閱讀。1.
  • 58商業數倉建設實踐
    分享嘉賓:鍾云云 58同城 數據架構師編輯整理:李凱凱出品平臺:DataFunTalk、AI啟蒙者導讀:早在多年以前在Hadoop系列分布式計算與存儲、消息中間件還沒有成熟的時候,數據倉庫主要基於Oracle的數倉建設。
  • 阿里雲實時大數據解決方案,助力企業實時分析與決策
    基於上雲解決方案,建立了多種場景化解決方案,包括智能實時數倉解決方案、實時監控大屏解決方案、數據湖解決方案,其中比較典型的智能實時數倉解決方案,適用於電商、遊戲、社交等網際網路行業大規模數據實時查詢場景:第一步:數據採集–通過DataWorks數據集成(批量+實時)、DataHub(實時)進行統一數據採集接入。
  • Alink:基於Flink的機器學習平臺
    分享嘉賓:楊旭 阿里巴巴 資深算法專家編輯整理:朱榮導讀:Alink是基於Flink流批一體的機器學習平臺,提供一系列算法,可以幫助處理各種機器學習任務,比如統計分析、機器學習、實時預測、個性化推薦和異常檢測。