背景
讓客戶滿意是我們工作的目標(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中:
查詢的時候,先根據(jù)篩選條件,查詢的維度主要有三個:
根據(jù)不同維度可以查詢到taskId的列表,然后根據(jù)task查詢hbase獲取相應(yīng)的結(jié)果,獲取下發(fā)、展示和點擊相應(yīng)的指標(biāo)數(shù)據(jù)。在我們考慮將其改造為實時統(tǒng)計時,會存在著一系列的難點:
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作為計算引擎:
針對上面的業(yè)務(wù)痛點,F(xiàn)link能夠滿足以下需要:
Flink以管道推送數(shù)據(jù)的方式,可以讓Flink實現(xiàn)高吞吐量。
Flink是真正意義上的流式處理,延時更低,能夠滿足我們消息報表統(tǒng)計的實時性要求。
Flink可以依靠強(qiáng)大的窗口功能,實現(xiàn)數(shù)據(jù)的增量聚合;同時,可以在窗口內(nèi)進(jìn)行數(shù)據(jù)的join操作。
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))。檢查點的存儲頻率是可配置的。
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)升級成如下:
可以看出,我們做了以下幾點優(yōu)化:
對于Flink進(jìn)行實時計算,我們的關(guān)注點主要有以下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中。
流程如下所示:
同時,在查詢的時候,我們通過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)