国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flink window 源碼分析1:窗口整體執(zhí)行流程

這篇具有很好參考價值的文章主要介紹了Flink window 源碼分析1:窗口整體執(zhí)行流程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

注:本文源碼為flink 1.18.0版本。
其他相關(guān)文章:
Flink window 源碼分析1:窗口整體執(zhí)行流程
Flink window 源碼分析2:Window 的主要組件
Flink window 源碼分析3:WindowOperator
Flink window 源碼分析4:WindowState

1 window 的重要組件

Window 本質(zhì)上就是借助狀態(tài)后端緩存著一定時間段內(nèi)的數(shù)據(jù),然后在達到某些條件時觸發(fā)對這些緩存數(shù)據(jù)的聚合計算,輸出外部系統(tǒng)。
windowedstream 源碼,flink,java,大數(shù)據(jù),big data
其主要組件有:Window Assigners、Triggers、Evictors。這三個組件的詳細講解請看筆記:Flink window 源碼分析2:Window 的主要組件。

  1. Window Assigners
    Window assigner 定義了 stream 中的元素如何被分發(fā)到各個窗口。
    Time Window 會創(chuàng)建一個 EventTimeTrigger 用來制定窗口觸發(fā)時間。Count Window 和 GlobalWindow需要指定窗口觸發(fā)器。
    可以通過繼承 WindowAssigner 抽象類實現(xiàn)自定義。
  2. Triggers
    決定窗口是否觸發(fā)。
    Trigger 接口中有些主要的方法:onElement、onEventTime、onProcessingTime。
    windowedstream 源碼,flink,java,大數(shù)據(jù),big data
  3. Evictors(可選擇是否指定)
    在 trigger 觸發(fā)后、調(diào)用窗口函數(shù)之前或之后從窗口中刪除元素。
    指定 evictors 可以避免預聚合(pre-aggregation),因為窗口內(nèi)所有元素必須在應用計算之前傳遞給 evictors。
    Flink 不保證窗口內(nèi)元素的順序。這意味著雖然 evictors 可以從窗口的開頭移除元素,但這些元素不一定是先到的還是后到的。
    windowedstream 源碼,flink,java,大數(shù)據(jù),big data

2 window 的觸發(fā)過程

KeyedStream 調(diào)用 window 函數(shù)會生成 WindowStream。WindowedStream 可以調(diào)用 reduce、aggregate、apply、process 等函數(shù)。 以下是 window 函數(shù)使用示例。

source.keyBy((KeySelector<Tuple2<Long, String>, String>) value -> value.f2)  
.window(TumblingEventTimeWindows.of(Time.seconds(60)))  
.apply(...);

window 函數(shù)源碼如下。返回了一個 WindowedStream。

@PublicEvolving  
public <W extends Window> WindowedStream<T, KEY, W> window(  
        WindowAssigner<? super T, W> assigner) {  
    return new WindowedStream<>(this, assigner);  
}

觀察 reduce、aggregate、apply、process 等處理函數(shù),會看到會進一步調(diào)用屬性 builder 的對應的 reduce、aggregate、apply、process 方法。以 reduce 源碼為例,可以看到倒數(shù)第2行 builder.reduce。

@Internal  
public <R> SingleOutputStreamOperator<R> reduce(  
        ReduceFunction<T> reduceFunction,  
        ProcessWindowFunction<T, R, K, W> function,  
        TypeInformation<R> resultType) {  
    // clean the closures  
    function = input.getExecutionEnvironment().clean(function);  
    reduceFunction = input.getExecutionEnvironment().clean(reduceFunction);  
  
    final String opName = builder.generateOperatorName();  
    final String opDescription = builder.generateOperatorDescription(reduceFunction, function);  
    OneInputStreamOperator<T, R> operator = builder.reduce(reduceFunction, function);  
  
    return input.transform(opName, resultType, operator).setDescription(opDescription);  
}

builder 是 WindowOperatorBuilder,在 WindowedStream 的構(gòu)造函數(shù)中有其初始化。builder 定義為:

private final WindowOperatorBuilder<T, K, W> builder;

進一步觀察 builder.reduce(),看到其最終返回是 WindowOperator。在函數(shù)返回時會判斷evictor是否為空,走不同的構(gòu)造 WindowOperator 的邏輯,如果 evictor 不為空就構(gòu)造 EvictingWindowOperator 對象,否則就構(gòu)造 WindowOperator 對象,其實 EvictingWindowOperator 是 WindowOperator 的一個子類,只是多了一個刪除數(shù)據(jù)的邏輯。WindowOperator 在創(chuàng)建時會傳入一個 StateDescriptor 用于創(chuàng)建狀態(tài),存儲中間結(jié)果或元素。
WindowOperator 的具體分析見:WindowOperator 的分析筆記。文章來源地址http://www.zghlxwxcb.cn/news/detail-793899.html

public <R> WindowOperator<K, T, ?, R, W> reduce(  
        ReduceFunction<T> reduceFunction, WindowFunction<T, R, K, W> function) {  
    Preconditions.checkNotNull(reduceFunction, "ReduceFunction cannot be null");  
    Preconditions.checkNotNull(function, "WindowFunction cannot be null");  
  
    if (reduceFunction instanceof RichFunction) {  
        throw new UnsupportedOperationException(  
                "ReduceFunction of apply can not be a RichFunction.");  
    }  
  
    if (evictor != null) {  
        return buildEvictingWindowOperator(  
                new InternalIterableWindowFunction<>(  
                        new ReduceApplyWindowFunction<>(reduceFunction, function)));  
    } else {  
        ReducingStateDescriptor<T> stateDesc =  
                new ReducingStateDescriptor<>(  
                        WINDOW_STATE_NAME, reduceFunction, inputType.createSerializer(config));  
  
        return buildWindowOperator(  
                stateDesc, new InternalSingleValueWindowFunction<>(function));  
    }  
}

到了這里,關(guān)于Flink window 源碼分析1:窗口整體執(zhí)行流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • SpringMVC的執(zhí)行流程與源碼分析

    SpringMVC的執(zhí)行流程與源碼分析

    通過深入分析Spring MVC的源碼,我們可以更好地理解其工作原理和內(nèi)部機制。這有助于我們更好地使用該框架進行Web應用程序的開發(fā),并解決實際開發(fā)中遇到的問題。同時,對于學習和研究Spring MVC框架的人來說,閱讀源碼并進行分析也是一種重要的學習和提升手段。 Spring MV

    2024年01月21日
    瀏覽(53)
  • 【SpringMVC】| SpringMVC執(zhí)行流程(含源碼分析)

    【SpringMVC】| SpringMVC執(zhí)行流程(含源碼分析)

    目錄 SpringMVC執(zhí)行流程 1.?SpringMVC常用組件 2.?DispatcherServlet初始化過程(源碼分析) 3.?DispatcherServlet調(diào)用組件處理請求 4. SpringMVC的完整執(zhí)行流程 圖書推薦:Spring Cloud Alibaba核心技術(shù)與實戰(zhàn)案例 1.? SpringMVC常用組件 (1) DispatcherServlet: 前端控制器 ,不需要工程師開發(fā),由框架

    2024年02月13日
    瀏覽(24)
  • mybatis源碼學習之mybatis執(zhí)行流程分析

    mybatis源碼學習之mybatis執(zhí)行流程分析

    mybatis全局配置文件中涉及的標簽如下圖所示 下面我們來進行源碼分析。 配置文件的解析創(chuàng)建SqlSessionFactory 配置文件的解析主要涉及到的類如下:XMLConfigBuilder、XPathParser、XPath、XNode,其中XPath、XNode是對 1、build方法內(nèi)部首先會根據(jù)輸入流等信息創(chuàng)建XMLConfigBuilder類的實例對象,

    2024年02月07日
    瀏覽(24)
  • 【Mybatis源碼解析】mapper實例化及執(zhí)行流程源碼分析

    基礎環(huán)境:JDK17、SpringBoot3.0、mysql5.7 儲備知識:《【Spring6源碼?AOP】AOP源碼解析》、《JDBC詳細全解》 基于SpringBoot的Mybatis源碼解析: 1.如何對mapper實例化bean 在加載BeanDefinition時,會將SqlSessionFactory、SqlSessionTemplate、MapperScannerConfigurer加載到注冊表中,以供后續(xù)進行實例化。

    2024年02月01日
    瀏覽(25)
  • 【Android12】Monkey壓力測試源碼執(zhí)行流程分析

    【Android12】Monkey壓力測試源碼執(zhí)行流程分析

    Monkey是Android提供的用于應用程序自動化測試、壓力測試的測試工具。 其源碼路徑(Android12)位于 部署形式為Java Binary 通過Monkey,可以模擬用戶的Touch(單指、多指、手勢)、按鍵(key)事件等,檢測應用程序發(fā)生的ANR、Crash事件,并收集相關(guān)Debug信息等。 例如測試應用com.packa

    2024年03月22日
    瀏覽(18)
  • 【源碼分析】一個flink job的sql到底是如何執(zhí)行的(一):flink sql底層是如何調(diào)用connector實現(xiàn)物理執(zhí)行計劃的

    【源碼分析】一個flink job的sql到底是如何執(zhí)行的(一):flink sql底層是如何調(diào)用connector實現(xiàn)物理執(zhí)行計劃的

    我們以一條sql為例分析下flink sql與connector是如何配合執(zhí)行的,本文我們先分析 sql-sqlnode-validate-operation:是如何找到對應的connector實例的 relnode-execGraph:是如何組裝node為Graph,在哪找到connector實例的 之后的文章將會繼續(xù)分析: translateToPlanInternal是如何串聯(lián)connector其他方法的

    2024年01月16日
    瀏覽(28)
  • Flink window 源碼分析4:WindowState

    本文源碼為flink 1.18.0版本。 其他相關(guān)文章: Flink window 源碼分析1:窗口整體執(zhí)行流程 Flink window 源碼分析2:Window 的主要組件 Flink window 源碼分析3:WindowOperator Flink window 源碼分析4:WindowState 主要考慮 reduce、aggregate 函數(shù)中的托管狀態(tài)是在什么時候觸發(fā)和使用的?使用時與Win

    2024年01月25日
    瀏覽(27)
  • 【源碼分析】XXL-JOB的執(zhí)行器的注冊流程

    目的:分析xxl-job執(zhí)行器的注冊過程 流程: 獲取執(zhí)行器中所有被注解( @xxlJjob )修飾的 handler 執(zhí)行器注冊過程 執(zhí)行器中任務執(zhí)行過程 版本: xxl-job 2.3.1 建議:下載 xxl-job 源碼,按流程圖 debug 調(diào)試, 看堆棧信息并按文章內(nèi)容理解執(zhí)行流程 。 完整流程圖: 部分流程圖: 首先啟

    2023年04月22日
    瀏覽(23)
  • React16源碼: React中的schedule調(diào)度整體流程

    React16源碼: React中的schedule調(diào)度整體流程

    schedule調(diào)度的整體流程 React Fiber Scheduler 是 react16 最核心的一部分,這塊在 react-reconciler 這個包中 這個包的核心是 fiber reconciler,也即是 fiber 結(jié)構(gòu) fiber 的結(jié)構(gòu)幫助我們把react整個樹的應用,更新的流程,能夠拆成每一個 fiber 對象為單元的一個更新的流程 這種單元的形式把更新

    2024年01月19日
    瀏覽(21)
  • Vue2源碼梳理:update的整體實現(xiàn)流程

    update 回到之間 $mount時,mountComponent 函數(shù)的過程,vm._render 是如何創(chuàng)建了一個 VNode 接下來就是要把這個 VNode 渲染成一個真實的 DOM 并渲染出來,這個過程是通過 vm._update 完成的 _update 它是一個vue 的私有方法,它把我們的 vnode 渲染成真實的 dom _update的方法,也是原型上的一個方

    2024年02月20日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包