Flink 中文社區 2021-09-19 01:31:27 阅读数:655
一、實時計算平臺架構
第一個方向是實時數據存儲,主要負責為線上業務接入提供高速度的實時存儲能力;
第二是實時數據計算,主要為海量數據的處理提供分布式計算框架;
第三是實時數據分發,主要負責將計算後的數據分發到後續的實時存儲,供上層應用。
第一部分是基礎能力建設,目前主要包括 Kafka 集群、storm 集群、 Flink 集群、SparkStreaming 集群。
另一部分是平臺化建設,主要是包括兩點:
第一個是數據分發,我們的數據分發是基於 Kafka Connect 打造的一個平臺,目標是實現异構數據源的集成與分發。在實際使用數據場景過程中,經常需要將不同的數據源匯聚到一起進行計算分析。
傳統方式可能需要針對不同的存儲采用不同的數據同步方案。我們的數據分發是通過提供一套完整的架構,實現不同數據源的集成和分發。
第二個是我們基於 Flink 打造的一站式實時計算平臺,後文會有詳細的介紹。
在實時數據接入這部分,我們采用的是 Kafka,binlog 提供 canal 和 debezium 兩種方式進行接入。
在業務日志這部分,我們主要采用 flume 進行線上業務的 log 的采集。
在實時計算引擎這部分,根據開源社區發展以及用戶的需求,從最早的 Storm 到後來引入 SparkStreaming,以及現在主流的 Flink。
在實時存儲這部分,為了滿足多元化的實時需求,我們支持 Kafka、Druid、Hbase、ES、ClickHouse。
同時在計算架構之上,我們建設了一些管理平臺,比如集群管理,它主要負責集群的擴容,穩定性的管理。
另一個是 Nightfury,主要負責集群治理,包括數據接入、權限治理、資源管理等等。
第一個場景是實時 ETL,主要是針對原始日志進行信息轉化,結構化處理,運用於後續計算,需要高吞吐低延遲的計算能力。
第二塊是實時數倉,它作為離線數倉的一個補充,主要是提昇一些實時指標的時效性。第三種場景是實時監控,它需要比較靈活的時間窗口支持。
最後一種場景是實時數據流分析,比如說,數據亂序的處理、中間狀態的管理、Exactly once 語義保障。
首先在部署模式上,主要是采用 Flink On YARN,實現集群的高可用。
在底層的 HDFS 上,采用 HDFS federation 機制,既可以避免離線集群的抖動對實時這邊造成影響,同時也减少了維護的 HDFS 數量。
在集群隔離上,主要是采用 Node Labe 機制,就可以實現把重要業務運行在一些指定節點上。同時在這個基礎之上,引入了 Cgroup,對 CPU 進行隔離,避免任務間的 CPU 搶占。
在管理層面,不同的業務提交到不同的隊列進行管理,避免業務間的資源搶占。
在計算場景上,根據不同的計算場景,比如說計算型、IO 型,會提交到不同的節點,從而提昇整個集群的資源利用率。
二、實時 SQL 建設
第一,打通了主流存儲和內部的實時存儲。比如說,在源錶上支持了內部的 wmb,它是一個分布式消息隊列。在維錶上支持這種 redis,內部的 wtable。在結果錶上支持了 ClickHouse,redis,以及我們內部的 wtable;
第二,定制 format 支持。因為在實際業務中,很多數據格式並不是標准的,沒法通過 DDL 來定義一個錶。我們提供了一種通用的方式,可以采用一個字段來代錶一條日志,讓用戶可以通過 udf 去自定義,並解析一條日志。
最後,在 source 和 sink DDL 定義基礎上,增加了並發度的設置。這樣用戶就可以更靈活地控制任務的並發。
第一個是對 Blink 特性的引進,Blink 提供了大量的特性,比如通過 mini batch 的處理方式,提高任務的吞吐。通過 local global 兩階段聚合,緩解數據熱點問題。還有通過 emit,增强窗口的功能。把這些功能集成到我們的計算平臺,用戶通過一些按鈕可以直接打開。
另一個是對异步 lO 的應用。在實時數倉化建設過程中,維錶之間的關聯是比較大的應用場景,經常因為維錶的性能導致整個任務的吞吐不高。因此我們增加了一個异步 IO 的機制,主要有兩種實現:
一種針對目標存儲支持异步 client,直接基於异步 client 來實現。比如 MySQL 和 redis。
另一種不支持异步 client 的,我們就借助現成的機制來模擬,同時在這個基礎之上增加了一套緩存的機制,避免所有的數據直接查詢到目標存儲,减少目標存儲的壓力。同時在緩存基礎上,也增加 LRU 機制,更加靈活的控制整個緩存。
同樣,數據寫入這一塊遇到大並發量寫入的時候,盡量提高並發來解决寫入性的問題,這樣就會導致整個任務的 CPU 利用率比較低,所以就采用單並發度多線程的寫入機制,它的實現是在 sink 算子裏面增加一個 buffer,數據流入到 sink 之後會首先寫入到 buffer,然後會啟動多線程機制去消費這個 buffer,最終寫到存儲裏面。
首先,元數據管理功能不完善;
然後,Flink SQL 這一塊,對於每個任務我們都可能需要重新定義一個數據錶。並且由於數據沒有分層的概念,導致任務比較獨立,烟囪式開發,數據和資源使用率比較低下;
另外,也缺乏數據血緣信息。
首先,在元數據管理這一塊,Flink 默認采用內存對元數據進行管理,我們就采用了 HiveCatalog 機制對庫錶進行持久化;
同時我們在數據庫的權限管理上,借助 Hive ACL 來進行權限管理;
有了元數據持久化之後,就可以提供全局的元數據檢索;
同時任務模式就可以由傳統的 DDL+DML 簡化為 DML;
最後,我們也做了血緣關系,主要是在 Flink SQL 提交過程中,自動發現 SQL 任務血緣依賴關系。
三、Storm 遷移 Flink 實踐
在數據保障上,Flink 支持 Exactly once 語義,在吞吐量、資源管理、狀態管理,用戶越來越多的基於 Flink 進行開發;
而 Storm 對用戶來說,編程模型簡單,開發成本高,流式計算特性缺乏,吞吐低無法滿足性能。在平臺側,獨立集群多、運維困難、任務缺少平臺化管理、用戶體驗差。
第一,ack 機制;
第二,依賴 zookeeper;
第三,at least once 語義保障。
第一,Flink-Storm 去掉 ack 支持;
第二,KafkaSpout 實現 CheckpointListener;
第三,KafkaSpout 實現 CheckpointedFunction;
第四,Flink-Storm 打開 checkpoint。
初始化 open 方式啟動异步線程;
模擬構造 tick 的 StreamRecord;
調用 processeElement 函數發送 tuple;
頻率由外部參數全局控制;
close 中關閉線程。
初始化 YarnClusterConfiguration Flink 配置 執行 jar 包 / 資源配置 加載 classpath;
啟動 yarn client;
複用 Flink on yarn 機制 deploy 轉換後的 jobGraph。
四、一站式實時計算平臺
在任務接入方式上,支持 Flink Jar,Flink SQL,Flink-Storm,PyFlink 這 4 種方式,來滿足多元化的用戶需求;
在產品功能上,主要支持了任務管理、任務的創建、啟動删除等;
另外,為了更好的讓用戶管理自己的任務和對任務進行問題定比特,我們也提供了一個監控告警和任務診斷的系統;
針對數倉,提供了一些數倉平臺化的功能,包括權限管理、血緣關系等等;
針對 Flink SQL 也提供了調試探查的功能。
在任務保存方面,支持 Checkpoint,Savepoint,Cancel With Savepoint。
在容錯方面,支持 allowNonRestoredState,跳過無法恢複的狀態。
在分析方面,支持 Queryable State 實時查詢,基於離線的 State Processor 的分析方式,我們會幫用戶把這個狀態下載進行分析。
第一,語法層面的功能包括:
智能提示;
語法校驗;
轉換 graph 邏輯校驗。
第二,邏輯層面的功能包括:
模擬輸入,DataGen 自定義數據源;
結果輸出,Print 重定向到標准輸出。
第一個是 Flink 自帶的 Flink-metrics,提供大量的信息,比如流量信息、狀態信息、反壓、檢查點、CPU、網絡等等;
第二個是 yarn 層面,提供運行時長、任務狀態;
第三,從 kafka 層面提供消息堆積;
最後,通過用戶自定義的一些 metrics,我們可以了解業務邏輯是否符合預期。
第一個層面是 Job 層面,這一塊主要是把一些比較核心的指標匯聚到我們的實時計算平臺。比如說,qps 信息、輸入輸出的信息、延遲的信息等等;
對於更底層的 task 級別的 metrics,通過 Grafana 可以了解具體的一些task信息,比如流量信息、反壓信息等。
五、後續規劃
第一個是社區比較流行的批流合一。因為我們當前這個實時架構大部分還是基於 Lambda 架構,這種架構會帶來很大的維護工作量,所以我們也希望借助批流合一的能力來簡化架構;
第二個是資源調優,因為作為流式計算來說,缺少一些動態資源管理的機制,因此我們也希望有手段來進行這樣一些調優;
第三個是智能監控,我們當前的監控和告警是事後的,希望有某種方式在任務出現問題之前進行預警;
最後是擁抱社區的新能力,包括對新場景的探索。
戳我,回顧作者分享視頻!
版权声明:本文为[Flink 中文社區]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919013126587L.html