皮皮网

【java 语音识别源码】【追火指标源码】【佳能小型相机源码】flink底层源码_flink 源码

2024-11-27 10:42:39 来源:gimp 源码分析

1.Flink mysql-cdc connector 源码解析
2.flink 1.10 1.12区别
3.详解flink中Look up维表的层源使用
4.Flink深入浅出:JDBC Connector源码分析

flink底层源码_flink 源码

Flink mysql-cdc connector 源码解析

       Flink 1. 引入了 CDC功能,用于实时同步数据库变更。源码Flink CDC Connectors 提供了一组源连接器,层源支持从MySQL和PostgreSQL直接获取增量数据,源码如Debezium引擎通过日志抽取实现。层源以下是源码java 语音识别源码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源码,可以查阅文章。你的支持是我写作的动力,如果文章对你有帮助,请给予点赞和关注。

       本文由文章同步助手协助完成。

flink 1. 1.区别

       flink 1. 1.区别在于Flink 1. 支持了 Flink SQL Kafka upsert connector 。

       å› ä¸ºåœ¨ Flink 1. 中,当前这类任务开发对于用户来说,还是不够友好,需要很多代码,同时也会造成 Flink SQL 冗长。

       Flink 1. SQL Connector 支持 Kafka Upsert Connector,这也是我们公司内部业务方对实时平台提出的需求。

收益:便利用户有这种需要从 kafka 取最新记录操作的实时任务开发,比如这种 binlog -> kafka,然后用户聚合操作,这种场景还是非常多的,这能提升实时作业开发效率,同时 1. 做了优化,性能会比单纯的 last_value 性能要好。

Flink Yarn 作业 On k8s 的生产级别能力是:

        Flink Jar 作业已经全部 K8s 化,Flink SQL 作业由于是推广初期,还是在 Yarn 上面进行运行,为了将实时计算 Flink 全部K8s化。

       æ‰€ä»¥æˆ‘们 Flink SQL 作业也需要迁移到 K8s,目前 Flink 1. 已经满足生产级别的 Flink k8s 功能,所以 Flink SQL K8s 化,打算直接使用社区的 On k8s 能力。

风险:虽然和社区的人沟通,Flink 1. on k8s 没有什么问题,但是具体功能还是需要先 POC 验证一下,同时可能社区 Flink on k8s 的能力。

       å¯èƒ½ä¼šé™åˆ¶æˆ‘们这边一些 k8s 功能使用,比如 hostpath volome 以及 Ingress 的使用,这里可能需要改底层源码来进行快速支持(社区有相关 JIRA 要做)。

详解flink中Look up维表的使用

       背景

       在流式计算领域,维表是一种常用概念,主要用于SQL的JOIN操作,以实现对流数据的补充。比如,我们的数据源stream是订单日志,日志中仅记录了订单商品的ID,缺乏其他信息。但在数据分析时,我们需要商品名称、佳能小型相机源码价格等详细信息,这时可以通过查询维表对数据进行补充。

       维表通常存储在外部存储中,如MySQL、HBase、Redis等。本文以MySQL为例,介绍Flink中维表的使用。

       LookupableTableSource

       Flink提供LookupableTableSource接口,用于实现维表功能。通过特定的key列查询外部存储,获取相关信息,以补充stream数据。

       LookupableTableSource有三个方法

       在Flink中,实现LookupableTableSource接口的主要有四个类:JdbcTableSource、HBaseTableSource、CsvTableSource和HiveTableSource。本文以JDBC为例,讲解如何进行维表查询。漫云2.1源码

       实例讲解

       以下是一个示例,首先定义stream source,使用Flink 1.提供的datagen生成数据。

       我们模拟生成用户数据,范围在1-之间。

       datagen具体的使用方法请参考:

       聊聊Flink 1.中的随机数据生成器-DataGen connector

       然后创建一个MySQL维表信息:

       该MySQL表中样例数据如下:

       最后执行SQL查询,流表关联维表:

       结果示例如下:

       对于维表中存在的数据,已关联出来,对于维表中不存在的数据,显示为null。

       完整代码请参考:github.com/zhangjun0x...

       源码解析JdbcTableSource

       以JDBC为例,看看Flink底层是如何实现的。

       JdbcTableSource#isAsyncEnabled方法返回false,即不支持异步查询,因此进入JdbcTableSource#getLookupFunction方法。

       最终构造一个JdbcLookupFunction对象。

       JdbcLookupFunction

       接下来看看JdbcLookupFunction类,它是TableFunction的子类,具体使用可参考以下文章:

       Flink实战教程-自定义函数之TableFunction

       TableFunction的购买源码的弊端核心是eval方法,在该方法中,主要工作是使用多个keys拼接成SQL查询数据,首先查询缓存,缓存有数据则直接返回,缓存无数据则查询数据库,并将查询结果返回并放入缓存。下次查询时,直接查询缓存。

       为什么要加缓存?默认情况下不开启缓存,每次查询都会向维表发送请求,如果数据量较大,会给存储维表的系统造成压力。因此,Flink提供了LRU缓存,查询维表时,先查询缓存,缓存无数据则查询外部系统。如果某个数据查询频率较高,一直被命中,则无法获取新数据。因此,缓存需要设置超时时间,超过这个时间则强制删除该数据,查询外部系统获取新数据。

       如何开启缓存?请参考JdbcLookupFunction#open方法:

       即cacheMaxSize和cacheExpireMs需要同时设置,构造缓存对象cache来缓存数据。这两个参数对应的DDL属性为lookup.cache.max-rows和lookup.cache.ttl。

       对于具体的缓存大小和超时时间的设置,用户需要根据自身情况自行定义,在数据准确性和系统吞吐量之间进行权衡。

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内容参考: