一切新知识的学习,都离不开官网得相关阅读,那么StreamingFileSink的官网介绍呢?

https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/dev/connectors/streamfile_sink.html

flink在被阿里收购之后,官网也有了相当多的中文文档,英文不好的同学可以直接看中文版的,不过还是建议时间充足的同学直接阅读英文文档,毕竟现在的chrome中的划词翻译很是方便了,哪里不会点哪里,慢慢的开发中常见词汇也就能看个大概了。

1. 写出文件的状态

看这个图片应该能明白,文件会分在不同的桶中,bucket中存在不同状态的文件:

  1. In-progress :当前文件正在写入中
  2. Pending :当处于 In-progress 状态的文件关闭(closed)了,就变为 Pending 状态
  3. Finished :在成功的 Checkpoint 后,Pending 状态将变为 Finished 状态

2. 简单的字符串写出示例

DataStreamSource<String> lines = FlinkUtil.createSocketStream("localhost", 8888);

        StreamExecutionEnvironment env = FlinkUtil.getEnv();
// 设置checkpoint
env.enableCheckpointing(TimeUnit.SECONDS.toMillis(10)); OutputFileConfig config = OutputFileConfig
.builder()
.withPartPrefix("prefix")
.withPartSuffix(".txt")
.build(); final StreamingFileSink<String> sink = StreamingFileSink
.forRowFormat(new Path(outputPath), new SimpleStringEncoder<String>("UTF-8"))
/**
* 设置桶分配政策
* DateTimeBucketAssigner--默认的桶分配政策,默认基于时间的分配器,每小时产生一个桶,格式如下yyyy-MM-dd--HH
* BasePathBucketAssigner :将所有部分文件(part file)存储在基本路径中的分配器(单个全局桶)
*/
.withBucketAssigner(new DateTimeBucketAssigner<>())
/**
* 有三种滚动政策
* CheckpointRollingPolicy
* DefaultRollingPolicy
* OnCheckpointRollingPolicy
*/
.withRollingPolicy(
/**
* 滚动策略决定了写出文件的状态变化过程
* 1. In-progress :当前文件正在写入中
* 2. Pending :当处于 In-progress 状态的文件关闭(closed)了,就变为 Pending 状态
* 3. Finished :在成功的 Checkpoint 后,Pending 状态将变为 Finished 状态
*
* 观察到的现象
* 1.会根据本地时间和时区,先创建桶目录
* 2.文件名称规则:part-<subtaskIndex>-<partFileIndex>
* 3.在macos中默认不显示隐藏文件,需要显示隐藏文件才能看到处于In-progress和Pending状态的文件,因为文件是按照.开头命名的
*
*/
DefaultRollingPolicy.builder()
.withRolloverInterval(TimeUnit.SECONDS.toMillis(2)) //设置滚动间隔
.withInactivityInterval(TimeUnit.SECONDS.toMillis(1)) //设置不活动时间间隔
.withMaxPartSize(1024 * 1024 * 1024) // 最大零件尺寸
.build())
.withOutputFileConfig(config)
.build(); lines.addSink(sink).setParallelism(1);

3. 写出文件的滚动策略

数据写入文件时,查看源码可以知道

滚动策略是这么判断的:

没有处于inProgressPart状态的文件 或者 DefaultRollingPolicy.shouldRollOnEvent成立,即打开的文件大小超过了滚动器中设置的大小

滚动文件时,首先关闭当前处于progress的part文件,然后创建一个新的 assembleNewPartPath,并且partCounter++(计数器)

StreamingFileSink继承自RichSinkFunction,显然之后执行一次,

该方法中注册了一个定时器,定时器的执行时间为currentProcessingTime + bucketCheckInterval

其中bucketCheckInterval为调用StreamingFileSink.forRowFormat()时,默认创建的,其默认值为60000,也就是一分钟

onProcessingTime方法继承自ProcessingTimeCallback,此方法使用调度触发器的时间戳调用。

该方法中设定了60秒的定时器,定时每60秒执行一次该方法

该方法中会调用buckets.onProcessingTime(currentTime)

里面判断是否需要关闭part文件,注意是关闭而不是滚动

判断条件为:part文件不为空 并且 DefaultRollingPolicy.shouldRollOnProcessingTime条件成立

即part文件存在,并且 (当前时间-part的创建时间 >= 滚动时间 或者 当前时间-part的最后修改时间 >= 不活跃时间)

snapshotState和initializeState方法继承自CheckpointedFunction,用来构建快照或者恢复历史状态

其中snapshotState方法会调用buckets.snapshotState()方法,对桶的状态进行快照处理

将所有处理活跃状态的桶全部进行快照处理,做快照时会检查是否需要滚动,滚动条件为:

part文件不为空 并且 DefaultRollingPolicy.shouldRollOnCheckpoint成立,即文件大小超过设定

满足该条件时,就会关闭partFile

notifyCheckpointComplete方法继承自CheckpointListener,用来通知检查点完成

该方法中会调用onSuccessfulCompletionOfCheckpoint方法

会将已经关闭的(其实是处于Pending状态的文件)part文件重命名

Flink-1.10中的StreamingFileSink相关特性的更多相关文章

  1. LINQ系列:C#中与LINQ相关特性

    1. 匿名类型 通过关键字var定义匿名类型,编译器将根据运算符右侧表达式的值来发出一个强类型. 使用匿名类型时要遵守的一些基本规则: ◊ 匿名类型必须有一个初始化值,而且这个值不能是空值(null) ...

  2. Linux 4.10中两个新特性与我的一段故事

    今早5点半起来没有開始写文章,而是去西湾红树林连跑带走折腾了将近20公里.回来后就8点多了...洗了个澡之后坐稳当.開始写一段关于我的故事.        在2014年到2015年期间,我在负责研发一 ...

  3. [ES6系列-03]ES6中关于参数相关特性详解(参数默认值与参数解构赋值与剩余参数)

    [原创] 码路工人 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 今天总结一下 ES6 中跟参数相关的内容. 欢迎补充斧正.留言交流. 让我们互相学习一起进步. 1. ES6 参数默认值( ...

  4. C#中的自定义控件中的属性、事件及一些相关特性的总结(转)

      摘要: C#中的自定义控件中的属性(Property).事件(Event)及一些相关特性(Attribute)的总结 今天学习了下C#用户控件开发添加自定义属性的事件,主要参考了MSDN,总结并实 ...

  5. TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现

    题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...

  6. linux中Makefile文件相关内容

    第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...

  7. 关于 iOS 10 中 ATS 的问题

    本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...

  8. Linux中exec命令相关

    Linux中exec命令相关 exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. b ...

  9. 关于 iOS 10 中 ATS / HTTPS /2017 问题

    本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...

随机推荐

  1. mongoose.model第三个参数的问题

    这个是个好问题,之前按照教程做的数据库没有问题,现在自己从新做出现了问题.还好之前有无意中接触了这个知识点,不然感觉真的很难解决. 在检查完所有东西都没错的时候(前端传给req的数据正常,与数据库相符 ...

  2. Python按值传递参数和按引用传递参数

    Python按值传递参数和按引用传递参数: 按值传递参数: 使用一个变量的值(数字,字符串),放到实参的位置上 注:传递过去的是变量的副本,无论副本在函数中怎么变,变量的值都不变 传递常量: # 传递 ...

  3. nginx静态资源防盗链

    含义: 用于阻止 Referer 头字段为无效值的请求访问站点.需记住的是,使用适当的 Referer 字段值来伪造请求非常容易,因此本模块的预期目的不是要彻底阻止此类请求,而是阻止常规浏览器发送的大 ...

  4. PHP krsort() 函数

    ------------恢复内容开始------------ 实例 对关联数组按照键名进行降序排序: <?php$age=array("Peter"=>"35 ...

  5. PHP sizeof() 函数

    实例 返回数组中元素的数目: <?php$cars=array("Volvo","BMW","Toyota");echo sizeof ...

  6. Calibre LVS BOX 详细用法

    https://www.cnblogs.com/yeungchie/ LVS BOX的使用对于后端的团队协作起到非常便利的作用. 通过在lvs rules file添加BOX的相关语句可以达到这个目的 ...

  7. 《分享》Koa2源码分析

    曾经在公司内部做的一起关于koa源码的分享,希望对你有帮助: koa2 源码分析整理 koa2(2.4.1版本)源码主要包含四个js,包括application.js, context.js, req ...

  8. 账本APP服务器端开发

    账本APP开发 好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 上一篇文章我们聊 ...

  9. 利用mvc模式,实现用户的注册

    实现功能:利用mvc模式,实现用户的登陆注册功能 1.程序的框架结构 2个包,bean,以及servlet 3个jsp页面,注册页面,注册成功页面,注册失败页面 mysql驱动 2.编程思想 通过js ...

  10. 从零写一个Asp.net core手脚架(模型验证)

    一个asp.net core项目,一定包含了各种的实体,在RESTful api里面,有很多的参数传递,不建立实体则大量的参数需要自定验证正确性,并且Action上面会写的密密麻麻的参数 在asp.n ...