![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Flink
文章平均质量分 83
长行
这个作者很懒,什么都没留下…
展开
-
Flink|问题处理记录:数据倾斜导致 checkpoint 失败问题处理【v2】
任务上游为 40 个 Kafka TOPIC,下游为 OTS。在 2024.03.23 04:13 的 checkpoint 突然无法在 100 分钟内完成,两次 checkpoint 均失败,第 3 次 checkpoint 已可以预支仍会失败。两次失败的 checkpoint(3739 和 3740)的详细信息如下:可以看到,在两次 checkpoint 中,subtask 20 均没有完成 checkpoint 的确认。原创 2024-03-24 11:46:48 · 920 阅读 · 1 评论 -
Flink 源码剖析|数据流中算子的接口
在介绍数据流中算子时,我们根据继承关系介绍,从父类向子类介绍。下面,首先我们来看一下数据流中算子的相关接口。原创 2024-02-22 08:47:07 · 1066 阅读 · 0 评论 -
Flink 源码剖析|数据流中的元素
在 Flink 的数据流中,所有元素均继承自抽象类。该抽象类有 6 个子类,即 Flink 的数据流中有且仅有这 6 种类型的元素。TWatermark。原创 2024-02-16 11:33:49 · 487 阅读 · 0 评论 -
Flink 源码剖析|Java 类型推断:从 Lambda 表达式中提取类型
因为这个方法是相对脆弱的,可能会因为未知的 JVM 问题导致抛出异常;所以捕获所有出现无法处理的异常,并转而抛出。该方法用于提取使用 lambda 表达式构造的可执行对象的返回值信息,如果参数。异常并补充异常信息,以提示从 lambda 方法中提取类型失败。类似,但是包含返回类型信息。由 lambda 表达式实现,则返回。下面我们逐段来分析这个静态方法。类中,定义了静态子类。类中,提供了静态方法。原创 2024-02-15 18:43:57 · 402 阅读 · 0 评论 -
Flink 源码剖析|5. 键控状态的 API 层
在 Flink 中有如下 5 种键控状态(Keyed State),这些状态仅能在键控数据流(Keyed Stream)的算子(operator)上使用。键控流使用键(key)对数据流中的记录进行分区,同时也会对状态进行分区。要创建键控流,只需要在 DataStream 上使用keyBy()方法指定键即可。update(T)T value()get(UK)entires()keys()values()isEmpty()add(T)add(T)add(T)所有的类型状态还有一个clear()原创 2024-02-15 14:57:05 · 1014 阅读 · 0 评论 -
Flink 源码剖析|StateDescriptor 及其子类
在从中获取状态时,首先需要创建一个对应类型的,才能获取对应的状态句柄。上图为 5 种内置状态类型对应的的 UML 图,可以看到它们均继承了抽象类。原创 2024-02-15 14:50:05 · 703 阅读 · 0 评论 -
Flink 源码剖析|键控状态的 API 层
在 Flink 中有如下 5 种键控状态(Keyed State),这些状态仅能在键控数据流(Keyed Stream)的算子(operator)上使用。键控流使用键(key)对数据流中的记录进行分区,同时也会对状态进行分区。在状态句柄中,记录了状态名称、状态所持有值的类型以及用户所指定的函数。接口是所有状态接口的基类,其中只定义了一个。在使用状态时,直接使用状态句柄中的方法即可。接口是用于保存一个值的状态,其中定义了。方法,用于移除当前 key 下的状态。方法,用于清除当前键的状态数据。原创 2024-02-15 11:01:13 · 933 阅读 · 0 评论 -
Flink 源码剖析|4. 累加器与相关工具方法
在 Flink 官方文档中,提到单个作业的所有累加器共享一个命名空间,Flink 会合并所有具有相同名称的累加器。(合并多个累加器的结果)功能的一种数据结构,在作业结束后,可以获取所有部分(各个 operator 的各个 subtask)合并后的最终结果并发送到客户端。类型表示累加器结果的类型,这个类型必须是可序列化的。,但是要求累加的值的类型与累加器的结果的类型必须相同,适用于一些相对简单的操作,例如计数器。类型表示每一次向累加器中的累加的值的类型,这个类型不要求是可序列化的;原创 2024-02-15 08:35:38 · 1001 阅读 · 0 评论 -
Flink 源码剖析|AccumulatorHelper
在类中,有一些用于操作累加器的静态工具方法。原创 2024-02-14 21:23:39 · 284 阅读 · 0 评论 -
Flink 源码剖析|累加器
(合并多个累加器的结果)功能的一种数据结构,在作业结束后,可以获取所有部分(各个 operator 的各个 subtask)合并后的最终结果并发送到客户端。类型表示累加器结果的类型,这个类型必须是可序列化的。,因此可以在不同算子(operator)的不同 UDF 中使用同一个累加器,Flink 会合并将所有具有相同名称的累加器。,但是要求累加的值的类型与累加器的结果的类型必须相同,适用于一些相对简单的操作,例如计数器。类型表示每一次向累加器中的累加的值的类型,这个类型不要求是可序列化的;原创 2024-02-14 18:24:14 · 1080 阅读 · 0 评论 -
Flink 源码剖析|3. UDF 接口与富函数
Flink 作业的数据流中的主要操作大部分都需要 UDF(user defined functions,用户自定义函数)。原创 2024-02-14 16:33:51 · 1416 阅读 · 0 评论 -
Flink 源码剖析|RuntimeContext 接口
每个并行的实例都会包含一个。下面,我们逐类介绍接口的方法。原创 2024-02-14 14:35:59 · 1116 阅读 · 0 评论 -
Flink 源码剖析|Rich Function 的 API 继承关系
子接口改为继承 rich 版本的抽象类即可,在使用中,与使用非 rich 版本一样,直接传给 DataStream API 即可。接口是用于所有 Rich UDF 的基础接口,其中定义了函数的生命周期方法以及访问函数执行上下文的方法。抽象类,所以通常不需要添加额外的方法,只需要将非 Rich 版本接口中的方法改写为抽象方法即可。子接口的 Rich 版本,都是实现了该接口的抽象类,同时,这些抽象类都继承了。子接口的 Rich 版本实现了非 Rich 版本的接口,并继承了。子接口的 rich 版本。原创 2024-02-14 11:54:08 · 558 阅读 · 0 评论 -
Flink 源码剖析|常用 UDF 函数的使用该方法及继承关系
在 “连接” 后的数据流中,2 个数据流保留各自的类型,但允许两个流的处理逻辑之间共享状态。接口中没有任何方法,以便允许继承的扩展接口能够使用 Java 8 的 lambda 语法实现。为第 2 个数据流中的元素,这 2 个元素是相互成功关联的。输入两个数据流中的各 1 个记录,其类型分别为。类型元素的迭代器,输出 0 个、1 个或多个。类型元素或输入来自第 2 个数据流的 1 个。类型的记录,输出 0 个、1 个或多个。类型的记录,输出 0 个、1 个或多个。类型的记录,输出 0 个、1 个或多个。原创 2024-02-14 09:17:03 · 755 阅读 · 0 评论 -
Flink 源码剖析|2. 事件时间与 Watermark
不同于处理时间(processing time),事件时间(event time)是各个事件(记录)在生产设备上的发生时间。通常来说,事件时间在进入 Flink 系统之前,就已经嵌入到了每条记录中,即事件时间完全取决于数据,而不是 Flink 系统中的某个时钟。在 Flink 的实现上,每条记录的事件时间是一个 long 类型的毫秒级时间戳。原创 2024-02-12 18:21:08 · 1239 阅读 · 0 评论 -
Flink 源码学习|使用 Watermark 策略(WatermarkStrategy)【v2 修订版】
使用事件时间时,需要通过 Flink API 的接口配置 watermark 的生成策略。我们将逐段来看这个 API 的各个部分。原创 2024-02-12 12:35:31 · 1094 阅读 · 0 评论 -
Flink 源码学习|WatermarkOutput
在接口中,onEvent()和的参数中均使用实现了接口的output用于发送 watermark。下面我们来看一下在markIdle()接口是很多等大量重要接口的上游,这里我们先介绍与事件时间相关的部分。原创 2024-02-11 15:15:33 · 853 阅读 · 0 评论 -
Flink 源码学习|WatermarkStrategy 处理空闲数据源
同时,因为下游算子的 watermark 计算方式是获取所有上游数据源的 watermark 的最小值,所以在这种情况下,下游算子的 watermark 无法被更新。是否有更新,如果有更新的话则将重置已空闲时间,否则检查已空闲时间是否已超过判定空闲状态的时间标准。方法,检查是否需要置为空闲状态,并根据该方法的返回值更新空闲状态并向下游发送空闲状态标识。方法并规定将输入流判定为空闲输入流的空闲时间即可。方法被周期性地调用时,会调用计时器实例的。方法会被调用,该方法调用基础生成器的。方法,并调用计时器实例的。原创 2024-02-11 11:04:05 · 516 阅读 · 0 评论 -
Flink 源码学习|WatermarkStrategy
使用事件时间时,需要通过 Flink API 的接口配置 watermark 的生成策略。我们将逐段来看这个 API 的各个部分。原创 2024-02-04 13:00:48 · 463 阅读 · 0 评论 -
Flink 源码学习|TimestampAssigner 和 WatermarkGenerator 的序列化处理
通过提供者模式(supplier pattern),可以避免需要在 API 方法中考虑序列化的问题。均有可能需要在不同节点之间进行传输。但是,这两个接口均没有直接继承。以实现可序列化,而是通过可序列化的提供者类(在 Flink 的分布式执行的过程中,原创 2024-01-29 13:13:09 · 332 阅读 · 0 评论 -
Flink 源码学习|watermark 时间戳指定器
在每次接收到消息时,获取系统时间以更新实例属性中存储的系统时间最大值,并将当前存储的系统时间最大值作为时间戳返回。之所以这样实现,是为了保证即使系统时间被修改(例如配置了多节点时间同步)时,输出的时间戳仍然是单调递增的。这个时间戳分配器适用于已指定有效时间戳的场景,例如从 Kafka 中提取的数据。中提取的时间,将被包括窗口函数在内的所有使用了事件时间的算子使用。存储当前获取到的系统时间的最大值;中,是从事件数据中提取事件时间的工具,中有 3 个类或接口继承了。方法,并直接使用参数。原创 2024-01-28 18:21:25 · 450 阅读 · 0 评论 -
Flink 源码学习|Watermark 与 WatermarkGenerator
当数据源中消息的事件时间单调递增时,当前事件时间(同时也是最大事件时间)就可以充当 watermark,因为后续到达的消息的事件时间一定不会比当前事件时间小。当输入数据流中消息的事件时间不完全有序,但是对于绝大部分元素,滞后时间通常不会超过一个固定的时间长度时,我们可以通过在当前最大事件时间的基础上减去一个固定延迟时间,来生成 watermark。再到达比 Watermark 的事件时间更小的消息,即在 Watermark 后到达的事件时间更小的消息视作延迟消息。接口,既可以基于消息,也可以基于周期。原创 2024-01-28 15:59:26 · 951 阅读 · 0 评论 -
Flink|《Flink 官方文档》学习笔记目录
Try Flink:本地模式安装;基于 DataStream API 实现欺诈检测;基于 Table API 实现实时报表;Flink 操作场景实践练习:概览;DataStream API 简介;数据管道 & ETL;流式分析;事件驱动应用;容错管理概念透析:概览;有状态流处理;及时流处理;Flink 架构;词汇表应用开发项目配置:概览;使用 Maven;使用 Gradle;连接器和格式;测试的依赖项;高级配置DataStream API概览执行模式(流 / 批)事件时间:生成原创 2024-01-28 07:46:22 · 1313 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operations - Monitoring》学习笔记
摘要计算了所有已完成的 checkpoint 的端到端持续时间、增量 / 全量 checkpoint 数据大小和 checkpoint alignment 期间缓冲的字节数的简单 min / average / maximum 统计信息。需要注意的是,这些统计信息不回在 JobManager 后保存;如果 JobManager 故障重启,这些统计信息将重新计数。原创 2024-01-26 20:56:34 · 827 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operations - Debugging》学习笔记
每个独立的 JobManager、TaskManager、HistoryServer、ZooKeeper 守护进程都将stdout和stderr重定向到名称后缀为.out的文件,并将其内部的日志记录写入到.log后缀的文件。此外,也可以使用脚本变量定义日志文件,并将选项括在双引号内以供后续使用。日志文件将使用与默认的.out和.log后缀一起滚动。原创 2024-01-26 08:29:28 · 777 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operations - 批处理 shuffle》学习笔记
学习笔记如下:Flink DataStream API 和 Table / SQL 都支持通过批处理执行模式处理有界输入。原创 2024-01-25 08:34:42 · 997 阅读 · 0 评论 -
Flink|提交 PyFlink 作业的踩坑记录
在最初的 PyFlink 作业中,没有使用任何方式在命令行参数、代码中或 pyflink 仓库路径中添加 Kafka 所需的 jar 包。的 whl 文件可以被使用。那么,整理在 TaskManager 日志中出现的所有无法被获取到的包,并使用 wget 直接从 pypi 上下载对应版本适合不同环境的包到缓存地址中。我们可以结合缓存地址中的安装包,观察是哪些包找不断,从而推断 Flink Python UDF 的运行环境。在代码中添加的 Jar 包路径不正确,使用本地存储系统中的文件路径,而没有添加。原创 2024-01-24 23:30:32 · 1462 阅读 · 0 评论 -
Flink|《Flink 官方文档 - 应用开发 - Python API - 依赖管理》学习笔记
学习笔记如下:当 PyFlink 在本地运行时,用户可以将第三方 Python 库安装在本地 Python 环境中,并将机器学习模型下载到本地。但是,这个方法在远端运行 PyFlink 作业时无法生效。Python DataStream API 和 Python Table API 都提供了支持各种依赖的 API。原创 2024-01-24 13:24:32 · 993 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operations - REST API》学习笔记
学习笔记如下:Flink 具有监控 API,可用于查询正在运行的作业以及最近完成的作业的状态和统计信息。该监控 API 被用于 Flink 自己的仪表盘,同时也可用于自定义监控工具。该监控 API 是 REST-ful 风格的,可以接受 HTTP 请求并返回 JSON 格式的数据。该监控 API 由作为JobManager一部分运行的 web 服务器提供后端支持。在默认情况下,该服务器使用 8081 端口,端口号可以通过修改文件的rest.port进行配置。原创 2024-01-24 07:56:07 · 817 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operations - 指标》学习笔记
学习笔记如下:Flink 提供了一个指标系统(metric system),以支持将 Flink 运行指标收集并展示到外部系统。原创 2024-01-23 13:26:17 · 1009 阅读 · 0 评论 -
Flink|《Flink 官方文档 - 部署 - 命令行界面 - 提交 PyFlink 作业》学习笔记
提交的 Python 作业,Flink 会执行 python 命令。因此,在启动 Python 作业前,需要先确定当前环境中的 python 命令指向 3.7+ 版本的 Python。命令将 PyFlink 作业提交到 native Kubernetes cluster,这需要一个已经安装了 PyFlink 的 Docker 镜像。参数,可以添加 Python 的文件依赖,这个文件可以是 Python 文件、Python 包或其他文件。参数,可以将 PyFlink 作业提交到指定的 JobManager。原创 2024-01-22 23:18:03 · 1348 阅读 · 0 评论 -
Flink|《Flink 官方文档 - 应用开发 - Python API - 概览 & 环境安装 & 调试 & 环境变量 & 常见问题》学习笔记
通过便捷脚本,可以指定 PyFlink 的版本,来生成对应的 PyFlink 版本所需的 Python 虚拟环境,否则将安装最新版本的 PyFlink 所对应的 Python 虚拟环境。在作业运行的过程中,日志信息会打印在 TaskManager 的日志文件中。客户端日志:在 PyFlink 作业中,在 Python UDF 之外的地方打印的上下文和调试信息均属于客户端日志。服务端日志:在 PyFlink 作业中,在 Python UDF 中打印的上下文和调试信息均属于服务端日志。原创 2024-01-22 23:15:59 · 1068 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operations - 故障与容错 - Task 故障恢复》学习笔记
学习笔记如下:当 task 发生故障时,Flink 需要重启出错的 task 以及其他受到应吸纳过的 task,以使得作业恢复到正常执行状态。原创 2024-01-22 08:12:25 · 900 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operators - 状态与容错 - 大状态与 Checkpoint 调优》学习笔记
学习文档:《Flink 官方文档 - Operators - 状态与容错 - 大状态与 Checkpoint 调优》学习笔记如下:Flink 应用想要在大规模场景下可靠地运行,必须要满足如下两个条件:理想状态下,这两个值都应该很低。较高的数值意味着由于存在反压,导致 checkpoint barriers 在作业中的移动速度较慢,这会导致端到端延迟增加。需要注意的是,在出现瞬态反压、数据倾斜或网络问题时,这些数据偶尔会很高。使用不对齐的 checkpoints 可用于加快 checkpoint barrie原创 2024-01-21 21:47:19 · 929 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operators - 状态与容错 - State Backends》学习笔记
使用预定义选项,用户可以在每个 RocksDB 列族上应用一些预定义的配置,例如配置内存使用、线程、Compaction 设置等。目前每个算子的每个状态都在 RocksDB 中有专门的一个列族存储。通过配置项将选项名称设置进。。该选项的默认值是DEFAULT,对应。原创 2024-01-21 20:41:21 · 873 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operators - 状态与容错 - Savepoints & savepoint 与 checkpoint》学习笔记
因为,Savepoint 对精确一次的接收器有影响,为了保证精确一次语义,如果在最后一个 savepoint 之后没有 checkpoint,那么将使用 savepoint 进行恢复。配置 savepoint 的默认目录。严格来说,只需要给有状态算子分配 ID 就足够了,因为 Savepoint 仅包含这些有状态算子的状态,无状态算子不是 Savepoint 的一部分。其中,以原生格式创建 savepoint 是在 Flink 1.15 中引入的,在此之前 savepoint 都是以标准格式创建的。原创 2024-01-21 14:47:15 · 865 阅读 · 0 评论 -
Flink|《Flink 官方文档 - Operations - 状态与容错 - checkpoint & checkpoint 与背压》学习笔记
需要注意的是,非对齐 checkpointing 会增加状态存储的 I/O,因此当状态存储的 I/O 是整个 checkpoint 过程中真正的瓶颈时,不应该使用非赌气 checkpoint。此特性对对齐和非对齐 checkpoint 都生效,并且在这两种情况下都能缩短 checkpointing 的时间,不过 debloating 的效果对于对齐 checkpoint 最明显。时,如果对齐 checkpoint 还没完成,那么 checkpoint 将会转换为非对齐 checkpoint。原创 2024-01-21 11:46:49 · 955 阅读 · 0 评论 -
Flink|《Flink 官方文档 - 部署 - 日志》学习笔记
学习笔记如下:所有 Flink 进程都会创建一个文本格式的日志文件,其中包含该进程中发生的各种事件的信息。这些日志提供了深入了解 Flink 内部工作的途径,同时可以用来输出检测出的问题(以 WARN / ERROR 信息的形式),还可以辅助调试问题。日志文件可以通过 JobManager / TaskManager 对应的 WebUI 页面访问。所使用的 Resource Provider 可能会提供额外的访问方式来访问日志。Flink 中的日志记录是使用 SLF4J 日志接口实现的。原创 2024-01-21 10:35:09 · 984 阅读 · 0 评论 -
Flink|《Flink 官方文档 - 部署 - History Server》学习笔记
这样,可以从 HistoryServer 的 WebUI 直接链接到相关 JobManager / TaskManager 的日志。HistoryServer 允许查询 JobManager 存档的已完成作业的状态和统计信息。Flink 提供了 history server,可以在相应的 Flink 集群关闭之后查询已完成作业的统计信息。已完成作业的存档会在 JobManager 上进行,将已存档的作业信息上传到文件系统目录中。示例:配置 HistoryServer 与日志收集服务的集成。原创 2024-01-21 08:39:17 · 472 阅读 · 0 评论 -
Flink|《Flink 官方文档 - 部署 - 扩展资源》学习笔记
添加自定义扩展资源的 Driver,该 Driver 需要实现接口示例:实现名为 “FPGA” 的扩展资源实现插件的 Driver@Override@Override@Override添加用来实例化 Driver 的工厂类,该工厂类需要实现接口示例:实现名为 “FPGA” 的扩展资源的用来实例化 Driver 的工厂类@Override添加服务入口,在中创建名为的文件,并向其中写入工厂类名,例如。之后,将FPGADriver和所有外部依赖打入 jar 包。在 Flink 发行版的。原创 2024-01-21 08:07:18 · 979 阅读 · 0 评论