1.Flink面试大全总结(全文6万字、码剖110个知识点、析书160张)
2.Flink mysql-cdc connector 源码解析
3.Flink CDC:基于 Apache Flink 的码剖流式数据集成框架
4.Flink源码编译
5.Flink源码算子
6.Flink深入浅出:JDBC Connector源码分析
Flink面试大全总结(全文6万字、110个知识点、析书160张)
Flink面试大全总结,码剖由大数据算法工程师土哥精心打造,析书测量墙源码旨在帮助大家深入理解Flink流式计算组件。码剖这是析书一份全面且详尽的资源,共计6万字,码剖涵盖了个核心知识点和张专业图解,析书旨在以问答和图解形式引导你从基础到深入学习Flink,码剖适合互联网行业中对薪资结构和岗位职责有深入了解的析书大数据爱好者。
在互联网行业中,码剖薪资往往与岗位紧密相关,析书而作为大数据算法工程师,码剖土哥特别提炼了Flink面试中的高频问题,这些问题不仅相互关联,而且通过逐个解答和视觉辅助,使学习过程逐步加深。这份总结不仅包括了各种原理的解析,还涉及源码分析,让理论与实践相结合。
本文结构丰富,总共划分了个知识点,涵盖了流式与批处理计算框架的方方面面。为了方便阅读,尽管公众号文章可能不够直观,但已将全文转化为PDF版本,附带详细目录,便于查阅。如果你是高效todo源码3分钟秒懂大数据的粉丝,只需回复github,即可免费获取这份珍贵的学习资料。
Flink mysql-cdc connector 源码解析
Flink 1. 引入了 CDC功能,用于实时同步数据库变更。Flink CDC Connectors 提供了一组源连接器,支持从MySQL和PostgreSQL直接获取增量数据,如Debezium引擎通过日志抽取实现。以下是Flink CDC源码解析的关键部分:
首先,MySQLTableSourceFactory是实现的核心,它通过DynamicTableSourceFactory接口构建MySQLTableSource对象,获取数据库和表的信息。MySQLTableSource的getScanRuntimeProvider方法负责创建用于读取数据的运行实例,包括DeserializationSchema转换源记录为Flink的RowData类型,并处理update操作时的前后数据。
DebeziumSourceFunction是底层实现,继承了RichSourceFunction和checkpoint接口,确保了Exactly Once语义。open方法初始化单线程线程池以进行单线程读取,run方法中配置DebeziumEngine并监控任务状态。值得注意的是,目前只关注insert, update, delete操作,表结构变更暂不被捕捉。
为了深入了解Flink SQL如何处理列转行、与HiveCatalog的结合、JSON数据解析、DDL属性动态修改以及WindowAssigner源码,可以查阅文章。你的支持是我写作的动力,如果文章对你有帮助,请给予点赞和关注。彩虹4.3源码
本文由文章同步助手协助完成。
Flink CDC:基于 Apache Flink 的流式数据集成框架
摘要:本文整理自阿里云 Flink SQL 团队研发工程师于喜千(yux)在 SECon 全球软件工程技术大会中数据集成专场沙龙的分享。内容主要为以下四部分: 1. Flink CDC 开源社区介绍; 2. Flink CDC 的演进历史; 3. Flink CDC 3.x 核心特性解读; 4. 基于Flink CDC 的实时数据集成实践。
1. **Flink CDC 开源社区介绍
**- **1.1 Flink CDC 的演进历史
**- Flink CDC 从 GitHub 开源社区开始,于 年 7 月在 Ververica 公司的 GitHub 仓库下以 Apache 2.0 协议开放源代码。初期主要支持从 MySQL 和 PG SQL 数据库捕获变化数据。2.0 版本增强了运行效率、稳定性和故障恢复机制,并扩展了源数据库支持范围至 Oracle、MongoDB 实时数据抽取。
- 年 月发布的 CDC 3.0 版本引入了 YAML pipeline 作业,使其成为独立的端到端数据集成框架,通过简化语法提供更便捷的数据集成作业描述。
- **1.2 Flink CDC 社区现状
**- CDC 作为 Flink 的一个子项目,于 年初正式加入 Apache 软件基金会,遵循 ASF 标准进行迭代开发。截至最新版本 3.1.1,累计超过 名贡献者提交了 余次代码提交,GitHub 收获超过 颗 star。
- 社区生态多元,GitHub Top 代码贡献者来自 家公司,覆盖 MongoDB、Oracle、Db2、OceanBase 等连接器及 Pipeline Transform 等核心功能。社区通过多种渠道保持与用户沟通,如钉钉群、邮件列表和 Slack 频道。
2. **Flink CDC 的演进历史
**- **2.1 CDC 技术简介
**- CDC 技术专注于实时监控数据变更,并将变化记录实时写入数据流,hmtl源码模板用于数据同步、分发和加载到数据仓库或数据湖。技术包括 Query-based CDC 和 Log-based CDC,后者通过监听数据库日志来实现低延迟变化捕获,减轻数据库压力,确保数据处理一致性。
- **2.2 早期 CDC 技术局限
**- 早期实现存在实用性问题,如依赖数据库查询、并发处理和状态管理的复杂性,以及对数据库性能的高要求。
- **2.3 Flink CDC 接入增量快照框架
**- Flink CDC 2.0 引入增量快照算法,支持任意多并发快照读取,无需数据库加锁,实现故障恢复。通过 Netflix DBlog 论文中的无锁快照算法,实现了高效并发处理。
- **2.4 Flink CDC 增强
**- 引入 SplitEnumerator 和 Reader 架构,实现数据源的逻辑划分和并发读取,增强了处理效率和吞吐量。支持 Schema Evolution,允许在不重启作业的情况下处理表结构变更,提高了作业的稳定性和维护性。
3. **Flink CDC 3.0 核心特性解读
**- **3.1 Flink CDC 2.x 版本回顾
**- CDC 2.x 版本提供 SQL 和 Java API,但缺乏直观的 YAML API 和高级进阶能力支持。
- **3.2 Flink CDC 3.0 设计目标
**- 3.0 版本引入 YAML API,提供端到端数据集成流程描述。支持 Schema Evolution、Transform 和路由功能,增强数据处理灵活性。
- **3.3 Flink CDC 3.0 核心架构
**- 采用无状态设计,备案页面源码简化部署和运维。分离连接层,保留对 Flink 生态系统的兼容性,支持多样化的部署架构和集群环境。
- **3.4 Flink CDC 3.0 API 设计
**- YAML API 提供直观的数据集成任务配置,支持转换、过滤、路由等高级功能,简化了开发和配置流程。
- **3.5 Flink CDC 3.0 Schema Evolution 功能
**- 提供了在不重启作业的情况下处理表结构变更的机制,确保数据处理的一致性和稳定性。
4. **基于 Flink CDC 的实时数据集成实践
**- **4.1 实例:MySQL 到 Kafka 实时传输
**- Flink CDC 3.0 内建 Kafka 输出连接器,简化了 MySQL 数据至 Kafka 的实时传输过程,无需额外基础设施配置。
- **4.2 实时数据集成实践
**- Flink CDC 3.0 支持模式进化、列操作和丰富的内置函数,提供了高度可定制的预处理能力,提升数据处理的灵活性与效率。
总结:Flink CDC 是一个高效、易用的实时数据集成框架,通过不断演进优化,满足了数据同步、分发和加载到数据仓库或数据湖的需求。社区活跃,支持多渠道沟通,鼓励代码贡献和用户参与,是实时数据处理领域的有力工具。
Flink源码编译
1. 下载Flink稳定版1..2,可以从官方下载链接获取,将源码同步至远程机器,使用Jetbrains Gateway打开。
2. 以Jetbrains Gateway打开源码,源码目录存放于远程机器,它会自动解析为Maven项目。
3. 注意事项:在flink-runtime-web/pom.xml文件中,需将部分内容替换,具体如下:
确保先安装npm,通过命令`yum install npm`。否则编译过程中可能会出现错误。
为了编译时内存充足,需要调整Maven设置,增加JDK可用内存。在命令行中,可以在/etc/profile中配置,或在Maven配置中指定更大的内存。
编译命令如下,对于Jetbrains Gateway,需在Run Configurations中新增配置,调整执行参数以执行mvn install或mvn clean。
编译完成后,每个模块目标文件夹会生成相应的文件。
4. 接下来进行运行。首先启动JobManager,查看flink-runtime下的StandaloneSessionClusterEntrypoint类,配置文件目录需指定,如`--configDir configpath`,并配置日志参数。
主类缺失时,需在IDEA的项目结构模块中给flink-runtime添加依赖,从flink-dist/target目录下添加jar包。
修改配置文件,将允许访问的IP设置为0.0.0.0,以便外部访问。然后映射web端口,启动JobManager后可通过外部IP访问。
运行TaskManager的参数与JobManager类似,启动后自动注册到JobManager,外部访问验证成功。
源码编译与启动完成后,其他机器无需重复编译,只需在相应环境中执行预编译的可执行文件,即可实现分布式环境的Flink使用。
Flink源码算子
Flink应用程序的核心组件包括源(source)、转换(transformation)和目的地(sink),它们共同构成有向图,数据流从源开始,流向sink结束。源算子如env.addSource的底层实现涉及监控函数和连续读取文件操作,如env.readTextFile()调用了一系列方法,最终通过add.source添加到流处理环境。
转换算子种类繁多,如map和sum。map算子通过函数转换,经过层层调用,最终调用transformations.add方法,将算子添加到作业的血缘依赖列表中。print算子作为sink,通过addSink操作生成StreamSink operator,其SinkFunction负责数据处理,如PrintSinkFunction的打印操作。
构建过程中,每次转换都会产生新的数据流,这些StreamTransformation会以隐式链表或图的形式组织起来,input属性记录上下游关系。执行阶段,会生成StreamGraph和JobGraph,然后提交到集群进行调度。
Flink深入浅出:JDBC Connector源码分析
大数据开发中,数据分析与报表制作是日常工作中最常遇到的任务。通常,我们通过读取Hive数据来进行计算,并将结果保存到数据库中,然后通过前端读取数据库来进行报表展示。然而,使用FlinkSQL可以简化这一过程,通过一个SQL语句即可完成整个ETL流程。
在Flink中,读取Hive数据并将数据写入数据库是常见的需求。本文将重点讲解数据如何写入数据库的过程,包括刷写数据库的机制和原理。
以下是本文将讲解的几个部分,以解答在使用过程中可能产生的疑问:
1. 表的定义
2. 定义的表如何找到具体的实现类(如何自定义第三方sink)
3. 写入数据的机制原理
(本篇基于1..0源码整理而成)
1. 表的定义
Flink官网提供了SQL中定义表的示例,以下以oracle为例:
定义好这样的表后,就可以使用insert into student执行插入操作了。接下来,我们将探讨其中的技术细节。
2. 如何找到实现类
实际上,这一过程涉及到之前分享过的SPI(服务提供者接口),即DriverManager去寻找Driver的过程。在Flink SQL执行时,会通过translate方法将SQL语句转换为对应的Operation,例如insert into xxx中的xxx会转换为CatalogSinkModifyOperation。这个操作会获取表的信息,从而得到Table对象。如果这个Table对象是CatalogTable,则会进入TableFactoryService.find()方法找到对应的实现类。
寻找实现类的过程就是SPI的过程。即通过查找路径下所有TableFactory.class的实现类,加载到内存中。这个SPI的定义位于resources下面的META-INFO下,定义接口以及实现类。
加载到内存后,首先判断是否是TableFactory的实现类,然后检查必要的参数是否满足(如果不满足会抛出异常,很多人在第一次使用Flink SQL注册表时,都会遇到NoMatchingTableFactoryException异常,其实都是因为配置的属性不全或者Jar报不满足找不到对应的TableFactory实现类造成的)。
找到对应的实现类后,调用对应的createTableSink方法就能创建具体的实现类了。
3. 工厂模式+创建者模式,创建TableSink
JDBCTableSourceSinkFactory是JDBC表的具体实现工厂,它实现了stream的sinkfactory。在1..0版本中,它不能在batch模式下使用,但在1.版本中据说会支持。这个类使用了经典的工厂模式,其中createStreamTableSink负责创建真正的Table,基于创建者模式构建JDBCUpsertTableSink。
创建出TableSink之后,就可以使用Flink API,基于DataStream创建一个Sink,并配置对应的并行度。
4. 消费数据写入数据库
在消费数据的过程中,底层基于PreparedStatement进行批量提交。需要注意的是提交的时机和机制。
控制刷写触发的最大数量 'connector.write.flush.max-rows' = ''
控制定时刷写的时间 'connector.write.flush.interval' = '2s'
这两个条件先到先触发,这两个参数都是可以通过with()属性配置的。
JDBCUpsertFunction很简单,主要的工作是包装对应的Format,执行它的open和invoke方法。其中open负责开启连接,invoke方法负责消费每条数据提交。
接下来,我们来看看关键的format.open()方法:
接下来就是消费数据,执行提交了
AppendWriter很简单,只是对PreparedStatement的封装而已
5. 总结
通过研究代码,我们应该了解了以下关键问题:
1. JDBC Sink执行的机制,比如依赖哪些包?(flink-jdbc.jar,这个包提供了JDBCTableSinkFactory的实现)
2. 如何找到对应的实现?基于SPI服务发现,扫描接口实现类,通过属性过滤,最终确定对应的实现类。
3. 底层如何提交记录?目前只支持append模式,底层基于PreparedStatement的addbatch+executeBatch批量提交
4. 数据写入数据库的时机和机制?一方面定时任务定时刷新,另一方面数量超过限制也会触发刷新。
更多Flink内容参考: