原文鏈接
??Apache Flink是一個用于對無邊界和有邊界數據流進行有狀態計算的框架和分布式處理引擎。Flink設計為運行在所有常見的集群環境中,并且以內存速度和任意規模執行計算。
??在這里,我們解釋Flink架構的相關重要內容。
??任何類型的數據都是作為事件流產生的。信用卡交易事務,傳感器測量,機器日志以及網站或移動應用程序上的用戶交互行為,所有這些數據都生成流。
??數據可以作為無邊界或有邊界流處理。
??Apache Flink是一個分布式系統,需要計算資源才能執行應用程序。Flink與所有常見的集群資源管理器(如Hadoop YARN,Apache Mesos和Kubernetes)集成,但也可以作為獨立集群運行。
??Flink旨在很好地適用于之前列出的每個資源管理器。這是通過特定于資源管理器的部署模式實現的,這些模式允許Flink以其慣用的方式與每個資源管理器進行交互。
??部署Flink應用程序時,Flink會根據應用程序配置的并行度自動識別所需資源,并從資源管理器請求它們。如果發生故障,Flink會通過請求新的資源來替換發生故障的容器。提交或控制應用程序的所有通信都通過REST調用進行。這簡化了Flink在許多環境中的集成。
??Flink旨在以任意規模運行有狀態流式應用程序。應用程序可以并行化為數千個在集群中分布和同時執行的任務。因此,應用程序可以利用幾乎無限量的CPU,內存,磁盤和網絡IO。而且,Flink可以輕松維護非常大的應用程序的狀態。其異步和增量檢查點算法確保對延遲處理的影響最小,同時保證精確一次的狀態一致性。
?用戶報告了在其生產環境中運行的Flink應用程序的擴展數字令人印象十分深刻,例如:
??有狀態的Flink應用程序針對本地狀態訪問進行了優化。任務狀態始終駐留在內存中,或者,如果狀態大小超過可用內存,則保存在訪問高效的磁盤上的數據結構中。因此,任務通過訪問本地(通常是內存中)狀態來執行所有計算,從而產生非常低的處理延遲。Flink通過定期和異步檢查點將本地狀態到持久存儲來保證在出現故障時的精確一次的狀態一致性。
原文鏈接
??Apache Flink是一個用于對無邊界和有邊界數據流進行有狀態計算的框架。Flink在不同的抽象級別提供多個API,并為常見用例提供專用庫。
??在這里,我們介紹Flink易于使用以及富有表現力的API和庫。
??
??流式計算框架構建和運行的應用程序的類型,由框架控制流、狀態以及時間的程度來定義。在下文中,我們描述了流處理應用程序的這些構建塊,并解釋了Flink處理他們的方法。
??顯然,流是流式處理的一個基本方面。然而,流可以有不同的特征,這些特征會影響流的處理方式。Flink是一個多功能的處理框架,它可以處理任意類型的流。
??每個非凡的流式應用都是有狀態的。只有對個別事件應用轉換的應用程序才不需要狀態。運行基本業務邏輯的任何應用程序都需要記住事件或中間結果,以便在之后的時間點訪問它們,例如在收到下一個事件時或在特定持續時間之后。
??應用程序的狀態在Flink中是一等公民。您可以通過查看Flink在狀態處理環境(上下文context)中提供的所有功能(函數)來查看。
??
??時間是流式應用的另一個重要組成成分。大多數事件流都具有固定的時間語義,因為每個事件都是在特定的時間點生成的。此外,許多常見的流計算基于時間,例如窗口聚合、會話化、模式監測和基于時間的連接。流處理的一個重要方面是應用程序如何測量時間,即時間時間和處理時間之間的差異。
??Flink提供了一組豐富的與時間相關的功能。
??Flink提供三層API。每個API在簡潔性和表達性之間提供不同的權衡,并針對不同的用例。
??我們簡要介紹每個API,討論它的應用程序,并展示一個代碼示例。
??ProcessFunctions是Flink提供的最具表現力的功能接口。Flink提供ProcessFunctions來處理來自一個或兩個輸入流中的單個事件或分組到一個窗口的事件。ProcessFunctions提供對時間和狀態的細粒度控制。ProcessFunction可以任意修改其狀態并注冊將在未來觸發回調函數的定時器。因此,ProcessFunctions可以實現許多有狀態事件驅動應用程序所需的復雜的每個事件業務邏輯。
??以下示例顯示了KeyedProcessFunction對KeyedStream,匹配START以及END事件進行操作的示例。當一個START事件被接收時,該函數在記住其狀態時間戳和并且注冊四個小時的計時器。如果在計時器觸發之前收到END事件,則該函數計算事件END和START事件之間的持續時間,清除狀態并返回值。否則,計時器只會觸發并清除狀態。
package com.longyun.flink.processfuncs;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.KeyedProcessFunction;
import org.apache.flink.util.Collector;
/**
* @author lynnyuan
* @ClassName com.longyun.flink.processfuncs.StartEndDuration
* @Description TODO
* K key
* IN input
* OUT output
* @Date 2018/12/3 15:02
* @Version 1.0
**/
public class StartEndDuration extends KeyedProcessFunction<String,
Tuple2<String, String>, Tuple2<String, Long>> {
private ValueState<Long> startTime;
@Override
public void open(Configuration configuration) throws Exception {
//obtain state handle
startTime = getRuntimeContext().getState(
new ValueStateDescriptor<Long>("startTIme", Long.class));
}
/**
* called for each processed event
* @param in
* @param context
* @param out
* @throws Exception
*/
@Override
public void processElement(Tuple2<String, String> in, Context context, Collector<Tuple2<String, Long>> out) throws Exception {
switch (in.f1){
case "START":
//set the start time if we receive a start event.
startTime.update(context.timestamp());
//register a timer in four hours from the start event.
context.timerService()
.registerEventTimeTimer(context.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, context.timestamp() - sTime));
//clear the state
startTime.clear();
}
break;
default:
break;
}
}
/** Called when a timer fires */
@Override
public void onTimer(long timestamp, OnTimerContext ctx, Collector<Tuple2<String, Long>> out) throws Exception {
//Time out interval exceeded. Cleaning up the state.
startTime.clear();
}
}
??這個例子說明了KeyedProcessFunction的表達能力,但也強調了它是一個相當冗長的接口。
??DataStream API提供了許多通用流處理操作原語。如窗口,record-at-a-time轉換,查詢外部數據存儲豐富事件原語。DataStream API可用于Java和Scala且它是基于函數的,如map()、reduce()以及aggregate()??梢酝ㄟ^擴展接口或lambda函數來定義函數參數。
??以下示例展示如何對點擊流進行會話化以及記錄每個session的點擊次數。
// 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));
??Flink有兩種關系化API特性, Table API和SQL。這兩個API都是用于批處理和流處理的統一API,即,在無邊界的實時流或有邊界的記錄流上以相同的語義執行查詢,并產生相同的結果。Table API和SQL利用Apache Calicite來解析,校驗以及查詢優化。它們可以與DataStream和DataSet API無縫集成,并支持用戶定義的標量,聚合以及表值函數。
??Flink的關系化API旨在簡化數據分析,數據流水線和ETL應用程序的定義。
??以下示例展示如何對點擊流進行會話化以及記錄每個session的點擊次數。與DataStream API中的示例是相同的用例。
SELECT userId, COUNT(*)
FROM clicks
GROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId
??Flink具有幾個用于常見數據處理用例的庫。這些庫通常嵌入在API中,而不是完全獨立的。因此,它們可以從API的所有特性中受益,并與其他庫集成。
??Apache Flink是一個用于對無邊界和有邊界數據流進行有狀態計算的框架。由于許多流應用程序設計為以最短的停機時間連續運行,因此流處理器必須提供出色的故障恢復,以及在應用程序運行時監控和維護應用程序的工具。
??Apache Flink非常關注流處理的操作方面。在這里,我們將解釋Flink的故障恢復機制,并介紹其管理和監督正在運行的應用程序的特性。
??機器和處理故障在分布式系統中無處不在。像Flink這樣的分布式流處理器必須從故障中恢復,以便能夠全天候運行流應用程序。顯然,這不僅意味著在故障發生后重新啟動應用程序,而且還要確保其內部狀態保持一致,以便應用程序可以繼續處理,就像從未發生過故障一樣。
??Flink提供了多種特性,以確保應用程序保持運行并保持一致:
??需要維護為關鍵業務服務提供支持的流應用程序。需要修復錯誤,并且需要實現改進或新功能特性。但是,更新有狀態流應用程序并非易事。通常,我們不能簡單地停止應用程序并重新啟動固定版本或改進版本,因為無法承受丟失應用程序的狀態。
??Flink的Savepoints是一個獨特而強大的功能特性,可以解決更新有狀態應用程序和許多其他相關挑戰的問題。保存點是應用程序狀態的一致快照,因此它與檢查點非常相似。但是,與檢查點相比,需要手動觸發保存點,并且在應用程序停止時不會自動刪除保存點。保存點可用于啟動狀態兼容的應用程序并初始化其狀態。保存點可啟用以下功能:
??與任何其他服務一樣,持續運行的流應用程序需要受到監督并集成到組織的運營(operations)基礎架構(即監控和日志記錄服務)中。監控有助于預測問題并提前做出反應。日志記錄讓我們可以依據根原因分析來調查故障。最后,控制運行應用程序的易于訪問的界面也是一個重要特性。
??Flink與許多常見的日志記錄和監視服務已經很好地集成,并提供REST API來控制應用程序和查詢信息。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。