溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Apache Flink官方文檔中文版--Flink是什么?

發布時間:2020-06-17 01:02:10 來源:網絡 閱讀:20901 作者:Lynn_Yuan 欄目:大數據

架構

原文鏈接
??Apache Flink是一個用于對無邊界和有邊界數據流進行有狀態計算的框架和分布式處理引擎。Flink設計為運行在所有常見的集群環境中,并且以內存速度和任意規模執行計算。

??在這里,我們解釋Flink架構的相關重要內容。

處理無邊界和有邊界數據

??任何類型的數據都是作為事件流產生的。信用卡交易事務,傳感器測量,機器日志以及網站或移動應用程序上的用戶交互行為,所有這些數據都生成流。

??數據可以作為無邊界或有邊界流處理。

  1. 無邊界流定義了開始但沒有定義結束。它們不會在生成時終止提供數據。必須持續地處理無邊界流,即必須在拉取到事件后立即處理它。無法等待所有輸入數據到達后處理,因為輸入是無邊界的,并且在任何時間點都不會完成。處理無邊界數據通常要求以特定順序(例如事件發生的順序)拉取事件,以便能夠推斷結果完整性。
  2. 有邊界流定義了開始和結束??梢栽趫绦腥魏斡嬎阒巴ㄟ^拉取到所有數據后處理有界流。處理有界流不需要有序拉取,因為可以隨時對有界數據集進行排序。有邊界流的處理也稱為批處理。
    Apache Flink官方文檔中文版--Flink是什么?
    ??Apache Flink擅長處理無邊界和有邊界數據集。在事件和狀態上的精確控制使得Flink運行時能在無邊界流上運行任意類型的應用程序。有界流由算法和數據結構內部處理,這些算法和數據結構專門針對固定大小的數據集而設計,從而獲得優秀的性能。

    隨處部署應用程序

    ??Apache Flink是一個分布式系統,需要計算資源才能執行應用程序。Flink與所有常見的集群資源管理器(如Hadoop YARN,Apache Mesos和Kubernetes)集成,但也可以作為獨立集群運行。
    ??Flink旨在很好地適用于之前列出的每個資源管理器。這是通過特定于資源管理器的部署模式實現的,這些模式允許Flink以其慣用的方式與每個資源管理器進行交互。
    ??部署Flink應用程序時,Flink會根據應用程序配置的并行度自動識別所需資源,并從資源管理器請求它們。如果發生故障,Flink會通過請求新的資源來替換發生故障的容器。提交或控制應用程序的所有通信都通過REST調用進行。這簡化了Flink在許多環境中的集成。

    任意規模運行應用程序

    ??Flink旨在以任意規模運行有狀態流式應用程序。應用程序可以并行化為數千個在集群中分布和同時執行的任務。因此,應用程序可以利用幾乎無限量的CPU,內存,磁盤和網絡IO。而且,Flink可以輕松維護非常大的應用程序的狀態。其異步和增量檢查點算法確保對延遲處理的影響最小,同時保證精確一次的狀態一致性。
    ?用戶報告了在其生產環境中運行的Flink應用程序的擴展數字令人印象十分深刻,例如:

    • 應用程序每天處理數萬億個事件
    • 應用程序維護數個TB的狀態
    • 應用程序在數千個CPU核上運行

利用內存的性能

??有狀態的Flink應用程序針對本地狀態訪問進行了優化。任務狀態始終駐留在內存中,或者,如果狀態大小超過可用內存,則保存在訪問高效的磁盤上的數據結構中。因此,任務通過訪問本地(通常是內存中)狀態來執行所有計算,從而產生非常低的處理延遲。Flink通過定期和異步檢查點將本地狀態到持久存儲來保證在出現故障時的精確一次的狀態一致性。
Apache Flink官方文檔中文版--Flink是什么?

應用

原文鏈接
??Apache Flink是一個用于對無邊界和有邊界數據流進行有狀態計算的框架。Flink在不同的抽象級別提供多個API,并為常見用例提供專用庫。
??在這里,我們介紹Flink易于使用以及富有表現力的API和庫。
??

為流應用程序構建塊

??流式計算框架構建和運行的應用程序的類型,由框架控制流、狀態以及時間的程度來定義。在下文中,我們描述了流處理應用程序的這些構建塊,并解釋了Flink處理他們的方法。

??顯然,流是流式處理的一個基本方面。然而,流可以有不同的特征,這些特征會影響流的處理方式。Flink是一個多功能的處理框架,它可以處理任意類型的流。

  • 有邊界無邊界的流:流可以是無邊界或是有邊界的,如固定大小的數據集。Flink具有處理無邊界流的復雜功能,但也有專用的運算符來有效地處理有邊界流。
  • 實時記錄的流:所有數據都作為流生成,有兩種方法可以處理數據。在生成時實時處理它或者將流持久保存到存儲系統(例如文件系統或對象存儲),并在之后對其進行處理。Flink應用程序可以處理記錄或實時流。

狀態

??每個非凡的流式應用都是有狀態的。只有對個別事件應用轉換的應用程序才不需要狀態。運行基本業務邏輯的任何應用程序都需要記住事件或中間結果,以便在之后的時間點訪問它們,例如在收到下一個事件時或在特定持續時間之后。
Apache Flink官方文檔中文版--Flink是什么?
??應用程序的狀態在Flink中是一等公民。您可以通過查看Flink在狀態處理環境(上下文context)中提供的所有功能(函數)來查看。
??

  • 多狀態原語:Flink為不同的數據結構提供了狀態原語,如原子值(value),列表(list)或映射(map)。開發人員可以根據函數的訪問模式選擇最有效的狀態原語。
  • 可插拔狀態后端:應用程序狀態由可插拔狀態后端管理以及檢查(checkpointed)。Flink有不同的狀態后端,可以在內存或RocksDB中存儲狀態,RocksDB(KV DB)是一種高效的嵌入式磁盤數據存儲。也可以插入自定義狀態后端。
  • 精確一次的狀態一致性:Flink的檢查點和恢復算法可確保在發生故障時應用程序狀態的一致性。因此,故障是透明處理的,不會影響應用程序的正確性。
  • 非常大的狀態:由于其異步和增量檢查點算法,Flink能夠維持幾個TB的應用程序狀態。
  • 可擴展的應用程序: Flink通過將狀態重新分配給更多或更少的Worker節點來支持有狀態應用程序的擴展。

時間

??時間是流式應用的另一個重要組成成分。大多數事件流都具有固定的時間語義,因為每個事件都是在特定的時間點生成的。此外,許多常見的流計算基于時間,例如窗口聚合、會話化、模式監測和基于時間的連接。流處理的一個重要方面是應用程序如何測量時間,即時間時間和處理時間之間的差異。
??Flink提供了一組豐富的與時間相關的功能。

  • 事件時間模式:使用事件時間語義處理流的應用程序根據時間的時間戳計算結果。因此,無論是否處理記錄或實時的時間,事件時間處理都是準確和一致的結果。
  • 水印支持:Flink使用水印來推斷事件時間應用中的時間。水印也是一種靈活的機制,可以權衡取舍延遲數據和結果的完整性。
  • 延遲數據處理:當在事件時間模式下使用水印處理流時,可能會發生在所有相關事件到達之前已完成計算的情況。這類事件被稱為延遲事件。Flink具有多種處理延遲事件的選項,例如通過邊輸出重新路由它們以及更新之前已經完成的結果。
  • 處理時間模式:除了事件時間模式以外,Flink還支持處理時間語義,處理時間語義的執行由處理機器的掛鐘(系統)時間來觸發計算。處理時間模式適用于某些具有嚴格的低延遲要求的應用,這些要求同時可以容忍近似結果。

分層接口API

??Flink提供三層API。每個API在簡潔性和表達性之間提供不同的權衡,并針對不同的用例。
Apache Flink官方文檔中文版--Flink是什么?
??我們簡要介紹每個API,討論它的應用程序,并展示一個代碼示例。

ProcessFunctions

??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

??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));

SQL & Table API

??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

庫(Libraries)

??Flink具有幾個用于常見數據處理用例的庫。這些庫通常嵌入在API中,而不是完全獨立的。因此,它們可以從API的所有特性中受益,并與其他庫集成。

  • 復雜事件處理(CEP): 模式檢測是事件流處理中的一個非常常見的用例。Flink的CEP庫提供了一個API來指定事件模式(如正則表達式或狀態機)。CEP庫與Flink的DataStream API集成,以便在DataStream上評估模式。CEP庫的應用包括網絡***檢測,業務流程監控和欺詐檢測。
  • DataSet API:DataSet API是Flink用于批處理應用程序的核心API。DataSet API的原語包括 map,reduce,(outer)join,co-group和iterate。所有操作都由算法和數據結構支持,這些算法和數據結構對內存中的序列化數據進行進行操作,如果數據大小超過內存預算則溢出到磁盤。Flink的DataSet API的數據處理算法收到傳統數據庫運算符的啟發,例如混合散列連接或外部合并排序( hybrid hash-join or external merge-sort)。
  • Gelly:Gelly是一個可擴展的圖形處理和分析庫。Gelly是在DataSet API之上實現的,并與DataSet API集成在一起。因此,它受益于其可擴展且強大的操作符。Gelly具有內置算法,如label propagation(標簽傳播), triangle enumeration, and page rank, 但也提供了一個自定義圖算法實現的簡化Graph API。

操作

??Apache Flink是一個用于對無邊界和有邊界數據流進行有狀態計算的框架。由于許多流應用程序設計為以最短的停機時間連續運行,因此流處理器必須提供出色的故障恢復,以及在應用程序運行時監控和維護應用程序的工具。
??Apache Flink非常關注流處理的操作方面。在這里,我們將解釋Flink的故障恢復機制,并介紹其管理和監督正在運行的應用程序的特性。

全天候運行應用程序

??機器和處理故障在分布式系統中無處不在。像Flink這樣的分布式流處理器必須從故障中恢復,以便能夠全天候運行流應用程序。顯然,這不僅意味著在故障發生后重新啟動應用程序,而且還要確保其內部狀態保持一致,以便應用程序可以繼續處理,就像從未發生過故障一樣。
??Flink提供了多種特性,以確保應用程序保持運行并保持一致:

  • 一致的檢查點:Flink的恢復機制基于應用程序狀態的一致性檢查點。如果發生故障,將重新啟動應用程序并從最新檢查點加載其狀態。結合可重置的流源,此特性可以保證精確一次的狀態一致性。
  • 高效的檢查點:如果應用程序保持TB級的狀態,則檢查應用程序的狀態可能非常昂貴。Flink可以執行異步和增量檢查點,以便將檢查點對應用程序的延遲SLAs的影響保持在非常小的水平。
  • End-to-End精確一次:Flink為特定存儲系統提供事務接收(sink)器,保證數據只寫出一次,即使出現故障。
  • 與集群管理器集成:Flink與集群管理器緊密集成,例如Hadoop YARN,Mesos或Kubernetes。當進程失敗時,將自動啟動一個新進程來接管它的工作。
  • 高可用性設置:Flink具有高可用性模式特性,可消除所有單點故障。HA模式基于Apache ZooKeeper--是一種經過驗證的可靠分布式協調服務。

更新,遷移,暫停和恢復您的應用程序

??需要維護為關鍵業務服務提供支持的流應用程序。需要修復錯誤,并且需要實現改進或新功能特性。但是,更新有狀態流應用程序并非易事。通常,我們不能簡單地停止應用程序并重新啟動固定版本或改進版本,因為無法承受丟失應用程序的狀態。
??Flink的Savepoints是一個獨特而強大的功能特性,可以解決更新有狀態應用程序和許多其他相關挑戰的問題。保存點是應用程序狀態的一致快照,因此它與檢查點非常相似。但是,與檢查點相比,需要手動觸發保存點,并且在應用程序停止時不會自動刪除保存點。保存點可用于啟動狀態兼容的應用程序并初始化其狀態。保存點可啟用以下功能:

  • 應用程序演變:保存點可用于發展應用程序??梢詮膹南惹鞍姹镜膽贸绦蛑蝎@取的保存點重新啟動應用程序的固定或改進版本。也可以從較早的時間點(假設存在這樣的保存點)啟動應用程序,以修復由有缺陷的版本產生的錯誤結果。
  • 集群遷移:使用保存點,可以將應用程序遷移(或克?。┑讲煌募?。
  • Flink版本更新:可以使用保存點遷移應用程序在Flink的新版本上運行。
  • 應用程序擴展:保存點可用于增加或減少應用程序的并行性。
  • A / B測試和假設情景:通過在同一保存點啟動應用程序的所有版本,可以比較兩個(或更多)不同版本的應用程序的性能或質量。
  • 暫停和恢復:可以通過獲取保存點來暫停應用程序并停止它。在以后的任何時間點,都可以從保存點恢復應用程序。
  • 歸檔:保存點可以存檔,以便能夠將應用程序的狀態重置為較早的時間點。

    監控和控制您的應用程序

    ??與任何其他服務一樣,持續運行的流應用程序需要受到監督并集成到組織的運營(operations)基礎架構(即監控和日志記錄服務)中。監控有助于預測問題并提前做出反應。日志記錄讓我們可以依據根原因分析來調查故障。最后,控制運行應用程序的易于訪問的界面也是一個重要特性。
    ??Flink與許多常見的日志記錄和監視服務已經很好地集成,并提供REST API來控制應用程序和查詢信息。

  • Web UI:Flink擁有Web UI功能特性,可以檢查,監視和調試正在運行的應用程序。它還可用于提交執行或取消執行。
  • Logging: Flink實現了流行的slf4j日志記錄接口,并與日志框架log4j或logback集成。
  • Metrics:Flink具有復雜的度量標準系統,用于收集和報告系統和用戶定義的度量標準。度量標準可以導出到幾個reporters,包括JMX,Ganglia,Graphite,Prometheus,StatsD,Datadog和Slf4j。
  • REST API:Flink暴露公開提交新應用程序,獲取正在運行的應用程序的保存點或取消應用程序的REST API。REST API還公開元數據、收集到的正在運行的或已完成應用程序的指標。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女