打酱油的葫芦娃
一万年太久,只争朝夕!
展开
-
Flink进阶系列--类加载机制
本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.要讲解 Flink 的类加载机制,首先你得对 JDK 的类加载机制有所了解。推荐阅读我之前写的1篇博客: 基于源码深入了解Java的类加载机制(JDK8和JDK11双版本)接着看一下 FLink 的类加载器继承结构:FlinkUserCodeClassLoader 继承自 URLClassLoader 类,其 loadClass() 方法实现如下:@Overridepublic final Cl.原创 2022-04-10 16:38:47 · 7635 阅读 · 1 评论 -
Flink源码解析系列--StreamExecutionEnvironment类
本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.Flink 程序看起来像一个转换 DataStream 的常规程序。每个程序由相同的基本部分组成:获取一个执行环境(execution environment);加载/创建初始数据;指定数据相关的转换;指定计算结果的存储位置;触发程序执行。StreamExecutionEnvironment 是所有 Flink 程序的基础。创建你可以使用 StreamExecutionEnvironme.原创 2022-03-31 18:25:00 · 10828 阅读 · 1 评论 -
Flink源码解析系列--Timer定时器
Timer(定时器)是 Flink Streaming API 提供的用于感知并利用 Processing Time/Event Time 变化的机制。Ververica blog上给出的描述如下:Timers are what make Flink streaming applications reactive and adaptable to processing and event time changes.对于普通用户来说,最常见的显式利用 Timer 的地方就是 KeyedProcessF原创 2022-03-26 16:44:02 · 8401 阅读 · 0 评论 -
Flink源码解析系列--ProcessingTimeService定时器
本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.@PublicEvolvingpublic interface ProcessingTimeService { // 返回当前的 processing time long getCurrentProcessingTime(); /** * Registers a task to be executed when (processing) time is {@code .原创 2022-03-24 22:05:39 · 7261 阅读 · 0 评论 -
Flink源码解析系列-- WatermarkGenerator接口及其常用实现
本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.Flink 提供了 WatermarkGenerator 接口用来"制造"水印:/** * {@code WatermarkGenerator} 可以基于事件或者周期性的生成 watermark。 * * <p><b>注意:</b> WatermarkGenerator 将以前互相独立的 {@code AssignerWithPunctuatedWatermar.原创 2022-03-23 22:46:50 · 7214 阅读 · 0 评论 -
Flink入门系列--和Springboot框架结合(1.14.3版本)
本文 Flink 版本为 1.14.3。本文主要讲解如何将 Flink 和 Springboot 两大框架融合在一起,可以对接 SpringCloud 生态系统,比如分布式配置中心、服务注册和发现、负载均衡等;可以通过 Restful 接口的形式提交 Flink 任务。本地工程构建软件环境:Flink 1.14.3Springboot 2.0.3.RELEASEJDK 11<?xml version="1.0" encoding="UTF-8"?><proj.原创 2022-03-20 12:51:40 · 11051 阅读 · 4 评论 -
Flink进阶系列--FLIP-27新的Source架构
Source 旧架构在 Flink 1.12之前,开发一个新的 source connector 是通过实现 SourceFunction 接口来完成的。@Publicpublic interface SourceFunction<T> extends Function, Serializable { // 当 source 开始发送数据时,run 方法被调用,其参数 SourceContext 用于发送数据。run 方法是一个无限循环,通过一个标识 isRunning 来跳出循原创 2022-03-18 16:16:47 · 10146 阅读 · 0 评论 -
Flink源码解析系列--FutureCompletingBlockingQueue阻塞队列
本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.Flink 在实现 SourceReaderBase 类时,并没有直接使用 JDK 自带的BlockingQueue 阻塞队列来缓冲 fetcher 线程获取的元素,而是自定义1个阻塞队列,即 FutureCompletingBlockingQueue 类。FutureCompletingBlockingQueue 的入队实现基本和 ArrayBlockingQueue实现类似,当队列已满时,会通过 Co.原创 2022-03-17 19:25:02 · 6317 阅读 · 0 评论 -
Flink入门系列--架构、应用程序执行、分层API(1.14.3版本)
Flink 集群剖析Flink 运行时由两种类型的进程组成:一个 JobManager 和一个或者多个 TaskManager。Client 不是运行时和程序执行的一部分,而是用于准备数据流并将其发送给 JobManager。之后,客户端可以断开连接(分离模式),或保持连接来接收进程报告(附加模式)。客户端可以作为触发执行 Java/Scala 程序的一部分运行,也可以在命令行进程./bin/flink run …中运行。可以通过多种方式启动 JobManager 和 TaskManager:直接在原创 2022-03-16 19:08:04 · 6179 阅读 · 0 评论 -
Flink源码解析系列--StreamPartitioner(流分区器)
本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.StreamPartitioner抽象类@Internalpublic abstract class StreamPartitioner<T> implements ChannelSelector<SerializationDelegate<StreamRecord<T>>>, Serializable { private stat.原创 2022-03-15 22:16:37 · 6064 阅读 · 0 评论 -
Flink源码解析系列--SubtaskStateMapper枚举类
假如 Flink 任务某个算子的并行度为4,该算子的状态做了 checkpoint 后任务停止。该算子的并行度调整为2后重新启动任务,新 task 中的各个 subtask 需要从 checkpoint 中哪些旧的 subtask 中获取数据呢?Flink 提供了 SubtaskStateMapper 枚举类来定义上述行为。其核心方法为:public abstract int[] getOldSubtasks( int newSubtaskIndex, int oldNumberOfSubtask原创 2022-03-14 15:41:41 · 6277 阅读 · 0 评论 -
Flink入门系列--安装部署及任务提交(1.14.3版本)
部署模式Flink 的部署模式分为3种:Application 模式Per-Job 模式Session 模式Application 模式Application 模式即 Flink 为1个应用专门创建1个集群,Flink集群和应用同生命周期,Application 的main()方法将由 JobManager执行。在其他部署模式下,用户 Jar 文件是通过 RPC 来进行分发的,因为需要走网络IO,当用户 Jar 文件较大时,JobManager 加载用户 Jar 文件将是1个耗时的操作。为原创 2022-03-12 11:57:12 · 8138 阅读 · 0 评论 -
Flink源码解析系列--JdbcDialect接口
本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.虽然不同的关系型数据库均遵循一定的统一标准,但各自的Driver实现,增删改查的SQL语法等可能略有不同。就跟中国话也有各地区的方言一样,数据库也有属于自己的"方言",即JdbcDialect。在Flink中,JdbcDialect被定义为1个接口。public interface JdbcDialect extends Serializable { // 方言名称 String di.原创 2022-03-09 13:45:05 · 6185 阅读 · 0 评论 -
Flink源码解析系列--DataStream JDBC-Sink
本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.进行源码分析之前,首先看一下Flink DataStream JDBC-Sink的官方示例:StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env .fromElements(...) .addSink(JdbcSink.sink( "insert into books (.原创 2022-02-23 16:40:27 · 9652 阅读 · 0 评论 -
Flink的State扩容机制
何为State为实现增量计算和容错,Flink提出了State机制,本质上State就是用来存放计算过程中各节点的中间结果或元数据等,并提供Exactly-Once语义。流计算的大部分场景均是增量计算的,数据逐条被处理,每次当前结果均是基于上一次计算结果之上进行处理的,这势必需要将上一次的计算结果进行存储持久化。目前Flink有3种State存储实现:HeapStateBackend,内存,存放数据量小,用于开发测试,生产环境不建议;FsStateBackend,分布式文件系统(HDFS等),不原创 2020-05-27 15:45:14 · 5682 阅读 · 1 评论 -
Flink读取HDFS上的Parquet文件生成DataSet
首先打开Flink的官方网站,查看一下DataSet已支持的数据源。File-basedreadTextFile(path) / TextInputFormat - Reads files line wise and returns them as Strings.readTextFileWithValue(path) / TextValueInputFormat - Reads fi...原创 2020-03-27 18:17:12 · 7465 阅读 · 9 评论 -
Flink的分布式缓存
分布式缓存Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。此缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。当程序执行,Flink自动将文件或者目录复制到所有task...原创 2019-09-16 10:30:53 · 5124 阅读 · 1 评论 -
Flink的Window源码剖析
Window可以看到,GlobalWindow和TimeWindow均继承自抽象类Window,其源码如下:public abstract class Window { public abstract long maxTimestamp();}可以看出,Window抽象类仅有一个maxTimestamp()方法用于获取仍属于该窗口的最大时间戳。TimeWindow首先看TimeW...原创 2019-09-16 10:30:04 · 6070 阅读 · 1 评论 -
Flink的Window初探
Flink 认为 Batch 是 Streaming 的一个特例,所以 Flink 底层引擎是一个流式引擎,在上面实现了流处理和批处理。而窗口(window)就是从 Streaming 到 Batch 的一个桥梁。引言在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理。基于窗口驱动方式可分为...原创 2019-09-16 10:26:46 · 5045 阅读 · 1 评论