了解Flink是什么,F(xiàn)link應(yīng)用程序運行的多樣化,對比業(yè)界常用的流處理框架,F(xiàn)link的發(fā)展趨勢圆丹,F(xiàn)link生態(tài)圈,F(xiàn)link應(yīng)用場景及Flink如何進行高效的Flink學(xué)習(xí)躯喇。
0 相關(guān)源碼
1 前言
1.1 功能
1.2 用戶
-
國際
-
國內(nèi)
1.3 特點
◆ 結(jié)合Java辫封、Scala兩種語言
◆ 從基礎(chǔ)到實戰(zhàn)
◆ 系統(tǒng)學(xué)習(xí)Flink的核心知識
◆ 快速完成從入門到上手企業(yè)開發(fā)的能力提升
1.4 安排
◆ 初識Flink
◆ 編程模型及核心概念
◆ DataSet API編程
◆ DataStream API編程
◆ Flink Table&SQL
◆ Window和Time操作
◆ Flink Connectors
◆ Flink部署及作業(yè)提交
◆ Flink監(jiān)控及調(diào)優(yōu)
- 使用Flink自定義數(shù)據(jù)源讀取配置數(shù)據(jù)
- 使用Flink完成實時數(shù)據(jù)清洗
- 使用Flink完成實時結(jié)果統(tǒng)計
- 統(tǒng)計結(jié)果可視化展示(Kibana)
1.5 收獲
◆ 系統(tǒng)入門Flink開發(fā)
◆ 掌握應(yīng)用Java SE/Scala的Flink實現(xiàn)
◆理解Flink項目的開發(fā)流程
◆ 快速上手企業(yè)開發(fā)
1.6 環(huán)境
◆ Mac OS: 10.14.12
◆ Kafka: 1.1.1
◆ Hadoop : CDH ( 5.15.1)
◆ ES/Kibana : 6+
◆ FXIQ: IDEA
◆ Flink : 1.7
1.7 確保你已掌握
◆ 了解Linux常用基本命令的使用
◆ 熟悉Java SE或Scala的基本使用
◆ 熟悉Hadoop基礎(chǔ)應(yīng)用
1.8 學(xué)習(xí)方法推薦
◆認(rèn)真閱讀本教程!多思考、多動手!
◆合理利用網(wǎng)絡(luò)資源
◆善于提問:QQ群討論
2 教程大綱
◆ Flink概述
◆ Flink應(yīng)用場景
◆ Flink Layer
◆ Flink發(fā) 展趨勢
◆ Flink應(yīng)用程序運行方式多樣化
◆ 如何學(xué)習(xí)Flink
◆ Flink VS Storm VS Spark Streaming
Flink概述
Apache Flink是一個框架和分布式處理引擎,用于對無界和有界數(shù)據(jù)流進行狀態(tài)計算倦微。 Flink設(shè)計為在所有常見的集群環(huán)境中運行檀咙,以內(nèi)存速度和任何規(guī)模執(zhí)行計算。
在這里璃诀,我們解釋Flink架構(gòu)的重要方面。
架構(gòu)
處理無界和有界數(shù)據(jù)
任何類型的數(shù)據(jù)都是作為事件流產(chǎn)生的蔑匣。信用卡交易劣欢,傳感器測量,機器日志或網(wǎng)站或移動應(yīng)用程序上的用戶交互裁良,所有這些數(shù)據(jù)都作為流生成凿将。
數(shù)據(jù)可以作為無界或有界流處理。
無界流有一個開始但沒有定義的結(jié)束价脾。它們不會在生成時終止并提供數(shù)據(jù)牧抵。必須連續(xù)處理無界流,即必須在攝取之后立即處理事件侨把。無法等待所有輸入數(shù)據(jù)到達犀变,因為輸入是無界的,并且在任何時間點都不會完成秋柄。處理無界數(shù)據(jù)通常要求以特定順序攝取事件获枝,例如事件發(fā)生的順序,以便能夠推斷結(jié)果完整性骇笔。
有界流具有定義的開始和結(jié)束省店。可以在執(zhí)行任何計算之前通過攝取所有數(shù)據(jù)來處理有界流笨触。處理有界流不需要有序攝取懦傍,因為可以始終對有界數(shù)據(jù)集進行排序。有界流的處理也稱為批處理
- Apache Flink擅長處理無界和有界數(shù)據(jù)集芦劣。精確控制時間和狀態(tài)使Flink的運行時能夠在無界流上運行任何類型的應(yīng)用程序粗俱。有界流由算法和數(shù)據(jù)結(jié)構(gòu)內(nèi)部處理,這些算法和數(shù)據(jù)結(jié)構(gòu)專為固定大小的數(shù)據(jù)集而設(shè)計虚吟,從而產(chǎn)生出色的性能源梭。
通過探索在Flink之上構(gòu)建的用例來說服自己。
利用內(nèi)存中性能
有狀態(tài)Flink應(yīng)用程序針對本地狀態(tài)訪問進行了優(yōu)化稍味。任務(wù)狀態(tài)始終保留在內(nèi)存中废麻,如果狀態(tài)大小超過可用內(nèi)存,則保存在訪問高效的磁盤上數(shù)據(jù)結(jié)構(gòu)中模庐。因此烛愧,任務(wù)通過訪問本地(通常是內(nèi)存中)狀態(tài)來執(zhí)行所有計算,從而產(chǎn)生非常低的處理延遲。 Flink通過定期和異步地將本地狀態(tài)檢查點到持久存儲來保證在出現(xiàn)故障時的一次狀態(tài)一致性怜姿。
應(yīng)用
Apache Flink是一個用于對無界和有界數(shù)據(jù)流進行有狀態(tài)計算的框架慎冤。 Flink在不同的抽象級別提供多個API,并為常見用例提供專用庫沧卢。
在這里蚁堤,我們介紹Flink易于使用和富有表現(xiàn)力的API和庫。
流媒體應(yīng)用程序的構(gòu)建塊
可以由流處理框架構(gòu)建和執(zhí)行的應(yīng)用程序類型由框架控制流但狭,狀態(tài)和時間的程度來定義披诗。在下文中,我們描述了流處理應(yīng)用程序的這些構(gòu)建塊立磁,并解釋了Flink處理它們的方法呈队。
流
顯然,流是流處理的一個基本方面唱歧。但是宪摧,流可以具有不同的特征,這些特征會影響流的處理方式颅崩。 Flink是一個多功能的處理框架几于,可以處理任何類型的流。
- 有界和無界流:流可以是無界的或有界的沿后,即固定大小的數(shù)據(jù)集孩革。 Flink具有處理無界流的復(fù)雜功能,但也有專門的運營商來有效地處理有界流得运。
- 實時和記錄的流:所有數(shù)據(jù)都作為流生成膝蜈。有兩種方法可以處理數(shù)據(jù)。在生成時實時處理它或?qū)⒘鞒志帽4娴酱鎯ο到y(tǒng)熔掺,例如文件系統(tǒng)或?qū)ο蟠鎯Ρゲ⒃谝院筇幚硭?Flink應(yīng)用程序可以處理記錄或?qū)崟r流。
狀態(tài)
每個非平凡的流應(yīng)用程序都是有狀態(tài)的置逻,即推沸,只有對各個事件應(yīng)用轉(zhuǎn)換的應(yīng)用程序不需要狀態(tài)。運行基本業(yè)務(wù)邏輯的任何應(yīng)用程序都需要記住事件或中間結(jié)果券坞,以便在以后的時間點訪問它們鬓催,例如在收到下一個事件時或在特定持續(xù)時間之后。
應(yīng)用狀態(tài)是Flink的一等公民恨锚。您可以通過查看Flink在狀態(tài)處理環(huán)境中提供的所有功能來查看宇驾。
- 多狀態(tài)基元:Flink為不同的數(shù)據(jù)結(jié)構(gòu)提供狀態(tài)基元,例如原子值猴伶,列表或映射课舍。開發(fā)人員可以根據(jù)函數(shù)的訪問模式選擇最有效的狀態(tài)原語塌西。
- 可插拔狀態(tài)后端:應(yīng)用程序狀態(tài)由可插拔狀態(tài)后端管理和檢查點。 Flink具有不同的狀態(tài)后端筝尾,可以在內(nèi)存或RocksDB中存儲狀態(tài)捡需,RocksDB是一種高效的嵌入式磁盤數(shù)據(jù)存儲。也可以插入自定義狀態(tài)后端筹淫。
- 完全一次的狀態(tài)一致性:Flink的檢查點和恢復(fù)算法可確保在發(fā)生故障時應(yīng)用程序狀態(tài)的一致性站辉。因此,故障是透明處理的损姜,不會影響應(yīng)用程序的正確性饰剥。
- 非常大的狀態(tài):由于其異步和增量檢查點算法,F(xiàn)link能夠維持幾兆兆字節(jié)的應(yīng)用程序狀態(tài)薛匪。
可擴展的應(yīng)用程序:Flink通過將狀態(tài)重新分配給更多或更少的工作人員來支持有狀態(tài)應(yīng)用程序的擴展。
時間
時間是流應(yīng)用程序的另一個重要組成部分大多數(shù)事件流都具有固有的時間語義脓鹃,因為每個事件都是在特定時間點生成的逸尖。此外,許多常見的流計算基于時間瘸右,例如窗口聚合娇跟,會話化,模式檢測和基于時間的連接太颤。流處理的一個重要方面是應(yīng)用程序如何測量時間苞俘,即事件時間和處理時間的差異。
Flink提供了一組豐富的與時間相關(guān)的功能龄章。
- 事件時間模式:使用事件時間語義處理流的應(yīng)用程序根據(jù)事件的時間戳計算結(jié)果吃谣。因此,無論是否處理記錄的或?qū)崟r的事件做裙,事件時間處理都允許準(zhǔn)確和一致的結(jié)果岗憋。
- 水印支持:Flink使用水印來推斷事件時間應(yīng)用中的時間。水印也是一種靈活的機制锚贱,可以權(quán)衡結(jié)果的延遲和完整性仔戈。
- 延遲數(shù)據(jù)處理:當(dāng)使用水印在事件 - 時間模式下處理流時,可能會在所有相關(guān)事件到達之前完成計算拧廊。這類事件被稱為遲發(fā)事件监徘。 Flink具有多個選項來處理延遲事件,例如通過側(cè)輸出重新路由它們以及更新以前完成的結(jié)果吧碾。
- 處理時間模式:除了事件時間模式之外凰盔,F(xiàn)link還支持處理時間語義,該處理時間語義執(zhí)行由處理機器的掛鐘時間觸發(fā)的計算倦春。處理時間模式適用于具有嚴(yán)格的低延遲要求的某些應(yīng)用廊蜒,這些要求可以容忍近似結(jié)果趴拧。
4 Layered APIs
Flink提供三層API。 每個API在簡潔性和表達性之間提供不同的權(quán)衡山叮,并針對不同的用例著榴。
我們簡要介紹每個API,討論其應(yīng)用程序屁倔,并顯示代碼示例脑又。
ProcessFunctions
ProcessFunctions是Flink提供的最具表現(xiàn)力的功能接口。 Flink提供ProcessFunction來處理來自窗口中分組的一個或兩個輸入流或事件的單個事件锐借。 ProcessFunctions提供對時間和狀態(tài)的細(xì)粒度控制问麸。 ProcessFunction可以任意修改其狀態(tài)并注冊將在未來觸發(fā)回調(diào)函數(shù)的定時器。因此钞翔,ProcessFunctions可以根據(jù)許多有狀態(tài)事件驅(qū)動的應(yīng)用程序的需要實現(xiàn)復(fù)雜的每事件業(yè)務(wù)邏輯严卖。
以下示例顯示了一個KeyedProcessFunction,它對KeyedStream進行操作并匹配START和END事件布轿。收到START事件時哮笆,該函數(shù)會記住其狀態(tài)的時間戳,并在四小時內(nèi)注冊一個計時器汰扭。如果在計時器觸發(fā)之前收到END事件稠肘,則該函數(shù)計算END和START事件之間的持續(xù)時間,清除狀態(tài)并返回該值萝毛。否則项阴,計時器只會觸發(fā)并清除狀態(tài)。
/**
* Matches keyed START and END events and computes the difference between
* both elements' timestamps. The first String field is the key attribute,
* the second String attribute marks START and END events.
*/
public static class StartEndDuration
extends KeyedProcessFunction<String, Tuple2<String, String>, Tuple2<String, Long>> {
private ValueState<Long> startTime;
@Override
public void open(Configuration conf) {
// obtain state handle
startTime = getRuntimeContext()
.getState(new ValueStateDescriptor<Long>("startTime", Long.class));
}
/** Called for each processed event. */
@Override
public void processElement(
Tuple2<String, String> in,
Context ctx,
Collector<Tuple2<String, Long>> out) throws Exception {
switch (in.f1) {
case "START":
// set the start time if we receive a start event.
startTime.update(ctx.timestamp());
// register a timer in four hours from the start event.
ctx.timerService()
.registerEventTimeTimer(ctx.timestamp() + 4 * 60 * 60 * 1000);
break;
case "END":
// emit the duration between start and end event
Long sTime = startTime.value();
if (sTime != null) {
out.collect(Tuple2.of(in.f0, ctx.timestamp() - sTime));
// clear the state
startTime.clear();
}
default:
// do nothing
}
}
/** Called when a timer fires. */
@Override
public void onTimer(
long timestamp,
OnTimerContext ctx,
Collector<Tuple2<String, Long>> out) {
// Timeout interval exceeded. Cleaning up the state.
startTime.clear();
}
}
該示例說明了KeyedProcessFunction的表達能力笆包,但也強調(diào)了它是一個相當(dāng)冗長的接口环揽。
DataStream API
DataStream API為許多常見的流處理操作提供原語,例如窗口化庵佣,一次記錄轉(zhuǎn)換以及通過查詢外部數(shù)據(jù)存儲來豐富事件薯演。 DataStream API可用于Java和Scala,它基于函數(shù)秧了,例如map()跨扮,reduce()和aggregate()。 可以通過擴展接口或Java或Scala lambda函數(shù)來定義函數(shù)验毡。
以下示例顯示如何對點擊流進行會話并計算每個會話的點擊次數(shù)衡创。
// a stream of website clicks
DataStream<Click> clicks = ...
DataStream<Tuple2<String, Long>> result = clicks
// project clicks to userId and add a 1 for counting
.map(
// define function by implementing the MapFunction interface.
new MapFunction<Click, Tuple2<String, Long>>() {
@Override
public Tuple2<String, Long> map(Click click) {
return Tuple2.of(click.userId, 1L);
}
})
// key by userId (field 0)
.keyBy(0)
// define session window with 30 minute gap
.window(EventTimeSessionWindows.withGap(Time.minutes(30L)))
// count clicks per session. Define function as lambda function.
.reduce((a, b) -> Tuple2.of(a.f0, a.f1 + b.f1));
SQL & Table API
Flink具有兩個關(guān)系A(chǔ)PI,Table API和SQL晶通。 這兩個API都是用于批處理和流處理的統(tǒng)一API璃氢,即,在無界的實時流或有界的記錄流上以相同的語義執(zhí)行查詢狮辽,并產(chǎn)生相同的結(jié)果一也。 Table API和SQL利用Apache Calcite進行解析巢寡,驗證和查詢優(yōu)化。 它們可以與DataStream和DataSet API無縫集成椰苟,并支持用戶定義的標(biāo)量抑月,聚合和表值函數(shù)。
Flink的關(guān)系A(chǔ)PI旨在簡化數(shù)據(jù)分析舆蝴,數(shù)據(jù)流水線和ETL應(yīng)用程序的定義谦絮。
以下示例顯示用于會話點擊流的SQL查詢,并計算每個會話的點擊次數(shù)洁仗。 這與DataStream API示例中的用例相同层皱。
SELECT userId, COUNT(*)
FROM clicks
GROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId
庫
Flink具有幾個用于常見數(shù)據(jù)處理用例的庫。這些庫通常嵌入在API中赠潦,而不是完全獨立的叫胖。因此,他們可以從API的所有功能中受益她奥,并與其他庫集成瓮增。
復(fù)雜事件處理(CEP):模式檢測是事件流處理的一個非常常見的用例。 Flink的CEP庫提供了一個API來指定事件模式(想想正則表達式或狀態(tài)機)方淤。 CEP庫與Flink的DataStream API集成钉赁,以便在DataStream上評估模式蹄殃。 CEP庫的應(yīng)用包括網(wǎng)絡(luò)入侵檢測携茂,業(yè)務(wù)流程監(jiān)控和欺詐檢測。
DataSet API:DataSet API是Flink用于批處理應(yīng)用程序的核心API诅岩。 DataSet API的原語包括map讳苦,reduce,(外部)join吩谦,co-group和iterate鸳谜。所有操作都由算法和數(shù)據(jù)結(jié)構(gòu)支持,這些算法和數(shù)據(jù)結(jié)構(gòu)對內(nèi)存中的序列化數(shù)據(jù)進行操作式廷,并在數(shù)據(jù)大小超過內(nèi)存預(yù)算時溢出到磁盤咐扭。 Flink的DataSet API的數(shù)據(jù)處理算法受到傳統(tǒng)數(shù)據(jù)庫運算符的啟發(fā),例如混合散列連接或外部合并排序滑废。
Gelly:Gelly是一個可擴展的圖形處理和分析庫蝗肪。 Gelly在DataSet API之上實現(xiàn)并與之集成。因此蠕趁,它受益于其可擴展且強大的運營商薛闪。 Gelly具有內(nèi)置算法,例如標(biāo)簽傳播俺陋,三角形枚舉和頁面排名豁延,但也提供了一種Graph API昙篙,可以簡化自定義圖算法的實現(xiàn)。
5 運行多樣化
5.1 隨處部署應(yīng)用程序
Apache Flink是一個分布式系統(tǒng)诱咏,需要計算資源才能執(zhí)行應(yīng)用程序苔可。
Flink與所有常見的集群資源管理器(如Hadoop YARN,Apache Mesos和Kubernetes)集成胰苏,但也可以設(shè)置為作為獨立集群運行硕蛹。
Flink旨在很好地運作以前列出的每個資源管理器。
這是通過特定于資源管理器的部署模式實現(xiàn)的硕并,這些模式允許Flink以其慣用方式與每個資源管理器進行交互法焰。
部署Flink應(yīng)用程序時倔毙,F(xiàn)link會根據(jù)應(yīng)用程序配置的并行性自動識別所需資源,并從資源管理器請求它們陕赃。
如果發(fā)生故障,F(xiàn)link會通過請求新資源來替換發(fā)生故障的容器么库。提交或控制應(yīng)用程序的所有通信都通過REST調(diào)用。
這簡化了Flink在許多環(huán)境中的集成葡缰。
5.2 以任何規(guī)模運行應(yīng)用程序
Flink旨在以任何規(guī)模運行有狀態(tài)流應(yīng)用程序。
應(yīng)用程序并行化為數(shù)千個在集群中分布和同時執(zhí)行的任務(wù)泛释。因此温算,應(yīng)用程序可以利用幾乎無限量的CPU,主內(nèi)存注竿,磁盤和網(wǎng)絡(luò)IO。而且巩割,F(xiàn)link很容易保持非常大的應(yīng)用程序狀態(tài)。其異步和增量檢查點算法確保對處理延遲的影響最小喂分,同時保證一次性狀態(tài)一致性锦庸。
用戶報告了在其生產(chǎn)環(huán)境中運行的Flink應(yīng)用程序令人印象深刻的可擴展性數(shù)字,例如
- 應(yīng)用程序每天處理數(shù)萬億個事件蒲祈,
- 應(yīng)用程序維護多個TB的狀態(tài)
- 運行在數(shù)千個核心上的應(yīng)用程序
6 業(yè)界流處理框架對比
7 Flink 使用案例
Apache Flink 功能強大甘萧,支持開發(fā)和運行多種不同種類的應(yīng)用程序萝嘁。它的主要特性包括:批流一體化、精密的狀態(tài)管理扬卷、事件時間支持以及精確一次的狀態(tài)一致性保障等牙言。
Flink 不僅可以運行在包括 YARN、 Mesos怪得、Kubernetes 在內(nèi)的多種資源管理框架上咱枉,還支持在裸機集群上獨立部署。
在啟用高可用選項的情況下徒恋,它不存在單點失效問題蚕断。事實證明,F(xiàn)link 已經(jīng)可以擴展到數(shù)千核心入挣,其狀態(tài)可以達到 TB 級別亿乳,且仍能保持高吞吐、低延遲的特性径筏。世界各地有很多要求嚴(yán)苛的流處理應(yīng)用都運行在 Flink 之上葛假。
接下來我們將介紹 Flink 常見的幾類應(yīng)用并給出相關(guān)實例鏈接。
- [事件驅(qū)動型應(yīng)用]
- [數(shù)據(jù)分析應(yīng)用]
- [數(shù)據(jù)管道應(yīng)用]
7.1 事件驅(qū)動型應(yīng)用
7.1.1 什么是事件驅(qū)動型應(yīng)用滋恬?
事件驅(qū)動型應(yīng)用是一類具有狀態(tài)的應(yīng)用聊训,它從一個或多個事件流提取數(shù)據(jù),并根據(jù)到來的事件觸發(fā)計算恢氯、狀態(tài)更新或其他外部動作带斑。
事件驅(qū)動型應(yīng)用是在計算存儲分離的傳統(tǒng)應(yīng)用基礎(chǔ)上進化而來。在傳統(tǒng)架構(gòu)中酿雪,應(yīng)用需要讀寫遠程事務(wù)型數(shù)據(jù)庫侄刽。
相反,事件驅(qū)動型應(yīng)用是基于狀態(tài)化流處理來完成醋安。在該設(shè)計中墓毒,數(shù)據(jù)和計算不會分離所计,應(yīng)用只需訪問本地(內(nèi)存或磁盤)即可獲取數(shù)據(jù)。系統(tǒng)容錯性的實現(xiàn)依賴于定期向遠程持久化存儲寫入 checkpoint叭首。
-
傳統(tǒng)應(yīng)用和事件驅(qū)動型應(yīng)用架構(gòu)的區(qū)別
7.1.2 事件驅(qū)動型應(yīng)用的優(yōu)勢焙格?
事件驅(qū)動型應(yīng)用無須查詢遠程數(shù)據(jù)庫眷唉,本地數(shù)據(jù)訪問使得它具有更高的吞吐和更低的延遲冬阳。而由于定期向遠程持久化存儲的 checkpoint 工作可以異步、增量式完成笆焰,因此對于正常事件處理的影響甚微嚷掠。事件驅(qū)動型應(yīng)用的優(yōu)勢不僅限于本地數(shù)據(jù)訪問不皆。傳統(tǒng)分層架構(gòu)下霹娄,通常多個應(yīng)用會共享同一個數(shù)據(jù)庫犬耻,因而任何對數(shù)據(jù)庫自身的更改(例如:由應(yīng)用更新或服務(wù)擴容導(dǎo)致數(shù)據(jù)布局發(fā)生改變)都需要謹(jǐn)慎協(xié)調(diào)执泰。反觀事件驅(qū)動型應(yīng)用术吝,由于只需考慮自身數(shù)據(jù)排苍,因此在更改數(shù)據(jù)表示或服務(wù)擴容時所需的協(xié)調(diào)工作將大大減少淘衙。
7.1.3 Flink 如何支持事件驅(qū)動型應(yīng)用?
事件驅(qū)動型應(yīng)用會受制于底層流處理系統(tǒng)對時間和狀態(tài)的把控能力西壮,F(xiàn)link 諸多優(yōu)秀特質(zhì)都是圍繞這些方面來設(shè)計的款青。
它提供了一系列豐富的狀態(tài)操作原語霍狰,允許以精確一次的一致性語義合并海量規(guī)模(TB 級別)的狀態(tài)數(shù)據(jù)蔗坯。
此外宾濒,F(xiàn)link 還支持事件時間和自由度極高的定制化窗口邏輯,而且它內(nèi)置的 ProcessFunction
支持細(xì)粒度時間控制橘忱,方便實現(xiàn)一些高級業(yè)務(wù)邏輯钝诚。
同時凝颇,F(xiàn)link 還擁有一個復(fù)雜事件處理(CEP)類庫拧略,可以用來檢測數(shù)據(jù)流中的模式垫蛆。
Flink 中針對事件驅(qū)動應(yīng)用的明星特性當(dāng)屬 savepoint月褥。Savepoint 是一個一致性的狀態(tài)映像瓢喉,它可以用來初始化任意狀態(tài)兼容的應(yīng)用栓票。在完成一次 savepoint 后走贪,即可放心對應(yīng)用升級或擴容,還可以啟動多個版本的應(yīng)用來完成 A/B 測試继找。
典型的事件驅(qū)動型應(yīng)用實例
數(shù)據(jù)分析應(yīng)用
什么是數(shù)據(jù)分析應(yīng)用婴渡?
數(shù)據(jù)分析任務(wù)需要從原始數(shù)據(jù)中提取有價值的信息和指標(biāo)边臼。傳統(tǒng)的分析方式通常是利用批查詢柠并,或?qū)⑹录涗浵聛聿⒒诖擞邢迶?shù)據(jù)集構(gòu)建應(yīng)用來完成臼予。為了得到最新數(shù)據(jù)的分析結(jié)果瘟栖,必須先將它們加入分析數(shù)據(jù)集并重新執(zhí)行查詢或運行應(yīng)用半哟,隨后將結(jié)果寫入存儲系統(tǒng)或生成報告签餐。
借助一些先進的流處理引擎氯檐,還可以實時地進行數(shù)據(jù)分析冠摄。和傳統(tǒng)模式下讀取有限數(shù)據(jù)集不同河泳,流式查詢或應(yīng)用會接入實時事件流,并隨著事件消費持續(xù)產(chǎn)生和更新結(jié)果薄霜。這些結(jié)果數(shù)據(jù)可能會寫入外部數(shù)據(jù)庫系統(tǒng)或以內(nèi)部狀態(tài)的形式維護惰瓜。儀表展示應(yīng)用可以相應(yīng)地從外部數(shù)據(jù)庫讀取數(shù)據(jù)或直接查詢應(yīng)用的內(nèi)部狀態(tài)崎坊。
如下圖所示奈揍,Apache Flink 同時支持流式及批量分析應(yīng)用打月。
流式分析應(yīng)用的優(yōu)勢奏篙?
和批量分析相比拥刻,由于流式分析省掉了周期性的數(shù)據(jù)導(dǎo)入和查詢過程兵迅,因此從事件中獲取指標(biāo)的延遲更低酌毡。不僅如此话原,批量查詢必須處理那些由定期導(dǎo)入和輸入有界性導(dǎo)致的人工數(shù)據(jù)邊界繁仁,而流式查詢則無須考慮該問題黄虱。
另一方面捻浦,流式分析會簡化應(yīng)用抽象。批量查詢的流水線通常由多個獨立部件組成昧识,需要周期性地調(diào)度提取數(shù)據(jù)和執(zhí)行查詢滞诺。如此復(fù)雜的流水線操作起來并不容易环疼,一旦某個組件出錯將會影響流水線的后續(xù)步驟炫隶。而流式分析應(yīng)用整體運行在 Flink 之類的高端流處理系統(tǒng)之上伪阶,涵蓋了從數(shù)據(jù)接入到連續(xù)結(jié)果計算的所有步驟,因此可以依賴底層引擎提供的故障恢復(fù)機制斟湃。
Flink 如何支持?jǐn)?shù)據(jù)分析類應(yīng)用凝赛?
Flink 為持續(xù)流式分析和批量分析都提供了良好的支持墓猎。具體而言毙沾,它內(nèi)置了一個符合 ANSI 標(biāo)準(zhǔn)的 SQL 接口左胞,將批举户、流查詢的語義統(tǒng)一起來敛摘。無論是在記錄事件的靜態(tài)數(shù)據(jù)集上還是實時事件流上兄淫,相同 SQL 查詢都會得到一致的結(jié)果。同時 Flink 還支持豐富的用戶自定義函數(shù)慨丐,允許在 SQL 中執(zhí)行定制化代碼房揭。如果還需進一步定制邏輯,可以利用 Flink DataStream API 和 DataSet API 進行更低層次的控制恬砂。此外泻骤,F(xiàn)link 的 Gelly 庫為基于批量數(shù)據(jù)集的大規(guī)模高性能圖分析提供了算法和構(gòu)建模塊支持狱掂。
典型的數(shù)據(jù)分析應(yīng)用實例
- 電信網(wǎng)絡(luò)質(zhì)量監(jiān)控
- 移動應(yīng)用中的產(chǎn)品更新及實驗評估分析
- 消費者技術(shù)中的實時數(shù)據(jù)即席分析
- 大規(guī)模圖分析
數(shù)據(jù)管道應(yīng)用
什么是數(shù)據(jù)管道趋惨?
提取-轉(zhuǎn)換-加載(ETL)是一種在存儲系統(tǒng)之間進行數(shù)據(jù)轉(zhuǎn)換和遷移的常用方法器虾。ETL 作業(yè)通常會周期性地觸發(fā)曾撤,將數(shù)據(jù)從事務(wù)型數(shù)據(jù)庫拷貝到分析型數(shù)據(jù)庫或數(shù)據(jù)倉庫晕粪。
數(shù)據(jù)管道和 ETL 作業(yè)的用途相似,都可以轉(zhuǎn)換装悲、豐富數(shù)據(jù)尚氛,并將其從某個存儲系統(tǒng)移動到另一個阅嘶。但數(shù)據(jù)管道是以持續(xù)流模式運行讯柔,而非周期性觸發(fā)魂迄。因此它支持從一個不斷生成數(shù)據(jù)的源頭讀取記錄,并將它們以低延遲移動到終點熊昌。例如:數(shù)據(jù)管道可以用來監(jiān)控文件系統(tǒng)目錄中的新文件,并將其數(shù)據(jù)寫入事件日志灭美;另一個應(yīng)用可能會將事件流物化到數(shù)據(jù)庫或增量構(gòu)建和優(yōu)化查詢索引冲粤。
下圖描述了周期性 ETL 作業(yè)和持續(xù)數(shù)據(jù)管道的差異页眯。
數(shù)據(jù)管道的優(yōu)勢?
和周期性 ETL 作業(yè)相比襟铭,持續(xù)數(shù)據(jù)管道可以明顯降低將數(shù)據(jù)移動到目的端的延遲寒砖。此外哩都,由于它能夠持續(xù)消費和發(fā)送數(shù)據(jù),因此用途更廣咐汞,支持用例更多化撕。
Flink 如何支持?jǐn)?shù)據(jù)管道應(yīng)用植阴?
很多常見的數(shù)據(jù)轉(zhuǎn)換和增強操作可以利用 Flink 的 SQL 接口(或 Table API)及用戶自定義函數(shù)解決掠手。如果數(shù)據(jù)管道有更高級的需求惨撇,可以選擇更通用的 DataStream API 來實現(xiàn)府寒。Flink 為多種數(shù)據(jù)存儲系統(tǒng)(如:Kafka、Kinesis剖淀、Elasticsearch纵隔、JDBC數(shù)據(jù)庫系統(tǒng)等)內(nèi)置了連接器捌刮。同時它還提供了文件系統(tǒng)的連續(xù)型數(shù)據(jù)源及數(shù)據(jù)匯绅作,可用來監(jiān)控目錄變化和以時間分區(qū)的方式寫入文件。
典型的數(shù)據(jù)管道應(yīng)用實例
- 電子商務(wù)中的實時查詢索引構(gòu)建
- 電子商務(wù)中的持續(xù) ETL
8 Flink發(fā)展趨勢
X 聯(lián)系我
-
公眾號
-
Q群