通過Flink實現(xiàn)個推海量消息數(shù)據(jù)的實時統(tǒng)計

背景

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、衡東網(wǎng)站維護(hù)、網(wǎng)站推廣。

消息報表主要用于統(tǒng)計消息任務(wù)的下發(fā)情況。比如,單條推送消息下發(fā)APP用戶總量有多少,成功推送到手機(jī)的數(shù)量有多少,又有多少APP用戶點擊了彈窗通知并打開APP等。通過消息報表,我們可以很直觀地看到消息推送的流轉(zhuǎn)情況、消息下發(fā)到達(dá)成功率、用戶對消息的點擊情況等。

個推在提供消息推送服務(wù)時,為了更好地了解每天的推送情況,會從不同的維度進(jìn)行數(shù)據(jù)統(tǒng)計,生成消息報表。個推每天下發(fā)的消息推送數(shù)巨大,可以達(dá)到數(shù)百億級別,原本我們采用的離線統(tǒng)計系統(tǒng)已不能滿足業(yè)務(wù)需求。隨著業(yè)務(wù)能力的不斷提升,我們選擇了Flink作為數(shù)據(jù)處理引擎,以滿足對海量消息推送數(shù)據(jù)的實時統(tǒng)計。

本文將主要闡述選擇Flink的原因、Flink的重要特性以及優(yōu)化后的實時計算方法。

離線計算平臺架構(gòu)

在消息報表系統(tǒng)的初期,我們采用的是離線計算的方式,主要采用spark作為計算引擎,原始數(shù)據(jù)存放在HDFS中,聚合數(shù)據(jù)存放在Solr、Hbase和MySQL中:

通過Flink實現(xiàn)個推海量消息數(shù)據(jù)的實時統(tǒng)計

查詢的時候,先根據(jù)篩選條件,查詢的維度主要有三個:

  1. appId
  2. 下發(fā)時間
  3. taskGroupName

根據(jù)不同維度可以查詢到taskId的列表,然后根據(jù)task查詢hbase獲取相應(yīng)的結(jié)果,獲取下發(fā)、展示和點擊相應(yīng)的指標(biāo)數(shù)據(jù)。在我們考慮將其改造為實時統(tǒng)計時,會存在著一系列的難點:

  1. 原始數(shù)據(jù)體量巨大,每天數(shù)據(jù)量達(dá)到幾百億規(guī)模,需要支持高吞吐量;
  2. 需要支持實時的查詢;
  3. 需要對多份數(shù)據(jù)進(jìn)行關(guān)聯(lián);
  4. 需要保證數(shù)據(jù)的完整性和數(shù)據(jù)的準(zhǔn)確性。

Why Flink

Flink是什么

Flink 是一個針對流數(shù)據(jù)和批數(shù)據(jù)的分布式處理引擎。它主要是由 Java 代碼實現(xiàn)。目前主要還是依靠開源社區(qū)的貢獻(xiàn)而發(fā)展。

對 Flink 而言,其所要處理的主要場景就是流數(shù)據(jù)。Flink 的前身是柏林理工大學(xué)一個研究性項目, 在 2014 被 Apache 孵化器所接受,然后迅速地成為了 ASF(Apache Software Foundation)的頂級項目之一。

方案對比

為了實現(xiàn)個推消息報表的實時統(tǒng)計,我們之前考慮使用spark streaming作為我們的實時計算引擎,但是我們在考慮了spark streaming、storm和flink的一些差異點后,還是決定使用Flink作為計算引擎:
通過Flink實現(xiàn)個推海量消息數(shù)據(jù)的實時統(tǒng)計

針對上面的業(yè)務(wù)痛點,F(xiàn)link能夠滿足以下需要:

  1. Flink以管道推送數(shù)據(jù)的方式,可以讓Flink實現(xiàn)高吞吐量。

  2. Flink是真正意義上的流式處理,延時更低,能夠滿足我們消息報表統(tǒng)計的實時性要求。

  3. Flink可以依靠強(qiáng)大的窗口功能,實現(xiàn)數(shù)據(jù)的增量聚合;同時,可以在窗口內(nèi)進(jìn)行數(shù)據(jù)的join操作。

  4. 我們的消息報表涉及到金額結(jié)算,因此對于不允許存在誤差,F(xiàn)link依賴自身的exact once機(jī)制,保證了我們數(shù)據(jù)不會重復(fù)消費和漏消費。

Flink的重要特性

下面我們來具體說說Flink中一些重要的特性,以及實現(xiàn)它的原理:

1)低延時、高吞吐

Flink速度之所以這么快,主要是在于它的流處理模型。

Flink 采用 Dataflow 模型,和 Lambda 模式不同。Dataflow 是純粹的節(jié)點組成的一個圖,圖中的節(jié)點可以執(zhí)行批計算,也可以是流計算,也可以是機(jī)器學(xué)習(xí)算法。流數(shù)據(jù)在節(jié)點之間流動,被節(jié)點上的處理函數(shù)實時 apply 處理,節(jié)點之間是用 netty 連接起來,兩個 netty 之間 keepalive,網(wǎng)絡(luò) buffer 是自然反壓的關(guān)鍵。

經(jīng)過邏輯優(yōu)化和物理優(yōu)化,Dataflow 的邏輯關(guān)系和運行時的物理拓?fù)湎嗖畈淮?。這是純粹的流式設(shè)計,時延和吞吐理論上是最優(yōu)的。

簡單來說,當(dāng)一條數(shù)據(jù)被處理完成后,序列化到緩存中,然后立刻通過網(wǎng)絡(luò)傳輸?shù)较乱粋€節(jié)點,由下一個節(jié)點繼續(xù)處理。

2)Checkpoint

Flink是通過分布式快照來實現(xiàn)checkpoint,能夠支持Exactly-Once語義。

分布式快照是基于Chandy和Lamport在1985年設(shè)計的一種算法,用于生成分布式系統(tǒng)當(dāng)前狀態(tài)的一致性快照,不會丟失信息且不會記錄重復(fù)項。

Flink使用的是Chandy Lamport算法的一個變種,定期生成正在運行的流拓?fù)涞臓顟B(tài)快照,并將這些快照存儲到持久存儲中(例如:存儲到HDFS或內(nèi)存中文件系統(tǒng))。檢查點的存儲頻率是可配置的。
通過Flink實現(xiàn)個推海量消息數(shù)據(jù)的實時統(tǒng)計

3)backpressure

back pressure出現(xiàn)的原因是為了應(yīng)對短期數(shù)據(jù)尖峰。

舊版本Spark Streaming的back pressure通過限制最大消費速度實現(xiàn),對于基于Receiver 形式,我們可以通過配置spark.streaming. receiver.maxRate參數(shù)來限制每個 receiver 每秒最大可以接收的記錄的數(shù)據(jù)。

對于 Direct Approach 的數(shù)據(jù)接收,我們可以通過配置spark.streaming. kafka.maxRatePerPartition 參數(shù)來限制每次作業(yè)中每個 Kafka 分區(qū)最多讀取的記錄條數(shù)。

但這樣是非常不方便的,在實際上線前,還需要對集群進(jìn)行壓測,來決定參數(shù)的大小。

Flink運行時的構(gòu)造部件是operators以及streams。每一個operator消費一個中間/過渡狀態(tài)的流,對它們進(jìn)行轉(zhuǎn)換,然后生產(chǎn)一個新的流。

描述這種機(jī)制最好的類比是:Flink使用有效的分布式阻塞隊列來作為有界的緩沖區(qū)。如同Java里通用的阻塞隊列跟處理線程進(jìn)行連接一樣,一旦隊列達(dá)到容量上限,一個相對較慢的接受者將拖慢發(fā)送者。

消息報表的實時計算

優(yōu)化之后,架構(gòu)升級成如下:

通過Flink實現(xiàn)個推海量消息數(shù)據(jù)的實時統(tǒng)計

可以看出,我們做了以下幾點優(yōu)化:

  1. Flink替換了之前的spark,進(jìn)行消息報表的實時計算;
  2. ES替換了之前的Solr。

對于Flink進(jìn)行實時計算,我們的關(guān)注點主要有以下4個方面:

  1. ExactlyOnce保證了數(shù)據(jù)只會被消費一次
  2. 狀態(tài)管理的能力
  3. 強(qiáng)大的時間窗口
  4. 流批一體

為了實現(xiàn)我們實時統(tǒng)計報表的需求,主要依靠Flink的增量聚合功能。

首先,我們設(shè)置了Event Time作為時間窗口的類型,保證了只會計算當(dāng)天的數(shù)據(jù);同時,我們每隔一分鐘增量統(tǒng)計當(dāng)日的消息報表,因此分配1分鐘的時間窗口。

然后我們使用.aggregate (AggregateFunction af, WindowFunction wf) 做增量的聚合操作,它能使用AggregateFunction提前聚合掉數(shù)據(jù),減少 state 的存儲壓力。之后,我們將增量聚合后的數(shù)據(jù)寫入到ES和Hbase中。

流程如下所示:

通過Flink實現(xiàn)個推海量消息數(shù)據(jù)的實時統(tǒng)計

同時,在查詢的時候,我們通過taskID、日期等維度進(jìn)行查詢,先從ES中獲取taskID的集合,之后通過taskID查詢hbase,得出統(tǒng)計結(jié)果。

總結(jié)

通過使用Flink,我們實現(xiàn)了對消息推送數(shù)據(jù)的實時統(tǒng)計,能夠?qū)崟r查看消息下發(fā)、展示、點擊等數(shù)據(jù)指標(biāo),同時,借助FLink強(qiáng)大的狀態(tài)管理功能,服務(wù)的穩(wěn)定性也得到了一定的保障。未來,個推也將持續(xù)優(yōu)化消息推送服務(wù),并將Flink引入到其他的業(yè)務(wù)線中,以滿足一些實時性要求高的業(yè)務(wù)場景需求。

新聞標(biāo)題:通過Flink實現(xiàn)個推海量消息數(shù)據(jù)的實時統(tǒng)計
標(biāo)題路徑:http://muchs.cn/article22/pgopjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站小程序開發(fā)、軟件開發(fā)網(wǎng)站策劃、關(guān)鍵詞優(yōu)化、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)