Flink 实战系列
文章平均质量分 77
这个专栏主要是生产环境上遇到问题的解决方案,以及Flink性能调优和源码分析相关的文章,Flink作为流式计算引擎的后起之秀,最近几年发展十分迅速,已经可以说是业界的标准,更是每一个实时计算开发工程师必备的技能,欢迎大家订阅,温馨提示订阅后可以阅读Flink系列所有文章,还在持续更新中
JasonLee实时计算
博主一直从事大数据开发的工作,工作经验非常丰富,目前主要专注于 Flink 实时计算领域,博客里面主要分享 spark 和 flink 的实战系列和源码分析的文章,欢迎交流和沟通,也欢迎关注我,希望和你一起学习,共同进步!
展开
-
【Flink实战系列】Flink 双流 Join 出现数据倾斜如何解决?
从上面两种数据倾斜场景可以看出,解决所有数据倾斜问题的核心都是打散,但是不同的场景略有不同,如果是计算场景,需要两段聚合,如果是 Join 场景,不仅需要打散,还需要对维表数据做膨胀处理,保证数据能正确的关联上。原创 2024-04-04 13:14:32 · 626 阅读 · 0 评论 -
【Flink实战系列】Hash collision on user-specified ID “Kafka Source”
当我们在同一个 Flink 任务里面,多次调用了某个算子,并且我们给这个算子设置了 uid,那么必须保证两次调用的算子的 uid 是不一样的,否则会抛出 uid 哈希冲突的异常。原创 2023-09-13 13:47:37 · 805 阅读 · 1 评论 -
【Flink实战系列】Flink 消费多个 Topic 数据利用侧流输出完成动态的分流操作
这样就实现了动态分流的功能,这样做的好处是比较灵活,减少了大量重复的代码,可以专注于自己的业务需求开发即可。原创 2023-05-15 13:31:31 · 1058 阅读 · 0 评论 -
【Flink 实战系列】Could not find any factory for identifier ‘wechat-alarm‘ that implements ‘org.apache.fli
但是我确实把相关的代码都打到最终的 jar 包里了,还是遇到了这个问题,这是咋回事呢?大家都知道 Flink 是通过 SPI 机制来识别这些 connector 的,那么就需要添加 META-INF/services 相关的配置文件,我也添加了 META-INF/services/org.apache.flink.table.factories.Factory 这个文件,并且我在本地已经测试过 wechat-alarm connector 是可以正常使用的,但是打完包放到集群上就不行了呢?原创 2023-05-10 13:39:56 · 599 阅读 · 0 评论 -
【Flink 实战系列】Incremental snapshot for tables requires primary key, but table test.ab doesn’t have pri
getChunkKeyColumn 方法其实就是获取表的主键信息,如果没有获取到的话,会直接抛出 ValidationException 也就是标题中的报错信息,所以我们必须给 mysql 中的表设置主键。splitTable 方法主要用来把整个表划分成多个 chunks,具体的实现是在 splitChunks 方法中,我们接着来看下 splitChunks 的源码。这个报错非常简单,报错的意思是说表的增量快照需要主键,但是我们读取的表 ab 没有主键,所以就报错了。我们简单看下相关的源码。原创 2022-12-01 21:07:43 · 2258 阅读 · 0 评论 -
【Flink 实战系列】Flink CDC 实时同步 Mysql 全量加增量数据到 Hudi
Flink CDC 是基于 Flink 开发的变化数据获取组件(Change data capture),简单的说就是来捕获变更的数据,Apache Hudi 是一个数据湖平台,又支持对数据做增删改查操作,所以 Flink CDC 可以很好的和 Hudi 结合起来,打造实时数仓,实时湖仓一体的架构,下面就来演示一下同步的过程。原创 2022-11-30 13:40:29 · 3523 阅读 · 0 评论 -
【Flink 实战系列】如何给 Flink 任务设置合理的并行度?
最近看到很多朋友都在问这个问题,当我在开发 Flink 实时计算任务的时候,如何给每个算子设置合理的并行度呢?如果设置多了可能会出现资源浪费的情况,如果设置少了任务可能会出现反压,所以给 Flink 任务设置一个合理的并行度就显得尤为重要,那今天就针对这个问题做一个详细的分析。一个 Flink 任务通常是由三个部分组成的,Source,Transformation,Sink,下面就分别说一下每一部分如何设置。原创 2022-10-18 14:57:50 · 2199 阅读 · 0 评论 -
【Flink 实战系列】Flink 使用 ParameterTool 动态加载外部配置文件
直接在代码里面写死。把配置信息维护在一个类里面,所有用到的地方直接引用即可。把配置信息放在项目 resource 下面的一个配置文件中,然后从这个配置文件中加载配置。把配置文件放在外部,启动任务的时候传入一个路径参数,在代码里面解析配置文件。原创 2022-10-15 13:28:10 · 2434 阅读 · 0 评论 -
【Flink 实战系列】Flink SQL 实时同步 Kafka 数据到 Hudi(parquet + snappy)并且自动同步数据到 Hive
本文主要介绍了 Flink 实时同步数据到 Hudi,然后再把数据加载到 Hive 的流程,加载数据可以通过手动的方式也可以配置让 Hudi 自动创建 Hive 表完成加载数据,以及这两种方式的区别,和使用过程中遇到问题的解决方案。原创 2022-10-06 18:47:40 · 1596 阅读 · 0 评论 -
【Flink 实战系列】Flink SQL 使用 filesystem connector 同步 Kafka 数据到 HDFS(parquet 格式 + snappy 压缩)
我们用 datastream API 实现了从 Kafka 读取数据写到 HDFS 并且用 snappy 压缩,今天这篇文章我们来实现一个 Flink SQL 版本的,为了方便我直接采用 sql-client 提交任务的方式来演示。可以看到分区正常生成了,数据也都正常,_SUCCESS 文件也生成了,这里我就不在把数据加载到 hive 表里测试了,上一篇文章中有测试,大家可以自己测一下。在这里面会把所有需要用到的 parquet 相关的依赖都打进来,所以我们不需要添加其他 parquet 相关的包了。原创 2022-10-05 14:57:13 · 1612 阅读 · 0 评论 -
【Flink 实战系列】Flink 同步 Kafka 数据到 HDFS parquet 格式存储 snappy 压缩
这里使用的是 bulk encoding 格式,这个方法有两个参数,第一个表示的是数据存储的路径,第二个表示的是数据的存储逻辑。这个消费 Kafka 用的是 KafkaSource 也是实现了新的接口 Source,在反序列的时候还是用的我们自定义的通用反序列化类 PoJoDeserializationSchema 直接把 JSON 格式的数据转成 JasonLeePOJO 对象。提交任务这里就省略了,我们直接在 hive 创建个表,然后把 HDFS 上的数据加载进来,看看能否正常读取出来。原创 2022-10-04 17:19:11 · 1688 阅读 · 4 评论 -
【Flink 实战系列】No Watermark (Watermarks are only available if EventTime is used)
本文主要是从一个简单的 DEMO 出发,通过分析底层的源码,让大家了解了为什么 Watermark 没有正常更新,这个在生产环境还是比较常见的,只要是窗口不触发计算的问题,基本上都是因为 Watermark 没有正常推进,如果遇到这种问题,直接就去找为什么 Watermark 没有推进,如果是上面的情况,可以选择上面三种方案中的任意一种解决,当然还是推荐第一种,第二种和第三种都会打破 operator Chain 会带来性能损耗。原创 2022-10-02 23:04:46 · 2564 阅读 · 1 评论 -
【Flink 实战系列】Flink 消费多个 Topic 数据利用侧流输出完成分流功能
本文主要介绍了 Flink 消费多个 Topic 数据,实现分流的逻辑,通过自定义反序列类 PoJoDeserializationSchema 去获取 Topic 的元数据信息,然后通过侧流输出的方式实现一个流分成多个流的操作。原创 2022-10-01 14:32:42 · 1736 阅读 · 0 评论 -
【Flink 实战系列】Flink on yarn 为什么 Allocated CPU VCores 显示不正确?
任务的并行度也是 3,所以只需要一个 TM 即可,那么问题就来了,这个任务一共需要多少个 CPU VCores,很明显答案应该是 4 个,3(TM)+ 1 (JM) = 4 个,这里不要忘了,JM 也是需要一个 CPU 的,那我们再来看下 Yarn UI 上面显示的 CPU VCores 是多少个呢?这个问题被问到了好多次,今天就来详细的解释一下原因。但是在生产环境中可能会遇到一个问题,任务的 CPU 使用率比较低,可能会出现浪费 CPU 资源的情况,比如这个任务的 CPU 使用率。原创 2022-09-03 15:30:14 · 1039 阅读 · 2 评论 -
【Flink 实战系列】Flink pipeline.operator-chaining 参数使用以及源码解析
当我们使用 Flink SQL 提交一个任务,没有给算子单独设置并行度的情况下,默认所有的算子会 chain 在一起,像下面的这样:此时,整个 DAG 图只会显示一个算子,虽然这样有利于数据的传输,可以提高任务的性能,但是缺点也很明显,我们无法看到数据的输入和输出,以及反压相关的 metrics。那在 datastream api 开发的任务中我们可以使用 disableChaining 方法来打断 operatorChain,但是在 SQL 开发的任务中怎么办呢?如果我们想要查看每一个算子的输入和输出的数原创 2022-08-28 14:35:11 · 2461 阅读 · 0 评论 -
【Flink实战系列】Could not initialize class org.apache.hadoop.security.UserGroupInformation
从报错信息来看很明显是缺少 UserGroupInformation 相关的包,查找发现这个类是在 hadoop-common 这个包里,但是项目里面确实添加了这个包的依赖,也把依赖打到最终的包里,在最终的 jar 包里也能找到这个类,也尝试打包的时候不加入这个依赖,直接把 hadoop-common-2.9.0.jar 这个包添加到 flink/lib 下,但是都会遇到这个报错,最后发现是忘记设置 hadoop 的环境变量了。解决的方法也很简单,只需要在提交任务之前设置一下环境变量即可。...原创 2022-08-04 17:27:23 · 3047 阅读 · 0 评论 -
【Flink实战系列】Flink SQL 字符串类型的字段如何实现列转行?
既然不能使用UDTF,那我们就来想想Flink的内置函数能不能满足需求,我们知道unnest函数需要的参数是Row类型的,对应到JSON里面也就是object类型,所以问题就变成了怎么把字符串转成object类型,那我们可以用FlinkSQL的内置函数STR_TO_MAP来转换,然后外面在套一个unnest函数即可实现这个需求。普通的列转行可以参考这篇文章,https//mp.weixin.qq.com/s/3oQRUO0A8G96qbM97UuisA。...原创 2022-07-31 21:53:34 · 1475 阅读 · 0 评论 -
【Flink实战系列】Sort on a non-time-attribute field is not supported
报错信息的字面意思是,不支持对非时间属性字段进行排序,你肯定会有疑问?这不是最基本,最常见的排序吗?是的,在批式计算场景下orderby是非常简单也是很场景的需求,Flink是支持的,但是在流式查询中的ORDERBY却很难计算,因为我们不希望在必须发出需要到达结果表开头的结果时更新整个结果。因此,我们只支持ORDERBY时间属性,前提是我们能够保证结果的时间戳(大致)递增。解决的办法就是改成时间属性字段,或者是改成批式计算,这样都是可以使用orderby的。.........原创 2022-07-30 21:48:43 · 2010 阅读 · 0 评论 -
【Flink实战系列】Flink 读取 Hive 数据同步到 Kafka
代码非常的简单,这里采用的是批量读取的方式,通过HiveCatalog直接去读hive表的数据,当然除了这种实现外,还有很多种实现方式,比如还可以流式的读hive,还可以通过读文件的方式都是可以的,这里就只写了这一种实现。这几个包是必须添加的,需要注意的是,如果集群上已经有这些包的话,在打包的时候就不要把依赖打进去,如果没有的话,就打到最终的包里。否则可能会出现jar包冲突,或者ClassNotFoundException异常。因为这是一个批式任务,所以在任务执行完后就直接退出了。...原创 2022-07-30 13:24:22 · 848 阅读 · 0 评论 -
【Flink实战系列】Lorg/apache/flink/kafka/shaded/org/apache/kafka/clients/consumer/ConsumerRecord;)Ljava/
本文主要是分享了一个jar包冲突异常,以及怎样一步步排查问题到最后的解决问题,其实这两个异常在平时是非常常见的,给大家提供一个排查的思路,如果遇到类似的问题,知道怎么去解决。httpshttpshttps。......原创 2022-07-24 19:52:50 · 995 阅读 · 0 评论 -
【Flink报错】Option not applicable to singleton quantifier
在使用 Flink CEP greedy 的时候遇到下面的异常。Option not applicable to singleton quantifier 这句话的字面意思是,选项不适用于单例量词,看报错是在代码的 62 行,62 行相关的代码如下:也就是说 where 不适用于 greedy ,greedy 的意思是贪心的,表示尽可能匹配次数多的,所以它必须和次数结合使用,也就是说它的前面必须有 times(n),times(n, m),oneOrMore(),timesOrMore(n) 类似于这样的原创 2022-06-11 14:06:56 · 274 阅读 · 1 评论 -
【Flink实战系列】Flink SQL 实时同步数据到 Hive
通过 HiveCatalog, Apache Flink 可以对 Apache Hive Tables 进行统一的 BATCH 和 STREAM 处理。这意味着Flink 可以作为一个比 Hive 的批处理引擎性能更好的选择,或者可以连续地在 Hive 表中读写数据,从而支持实时数据仓库应用程序。这篇文章就来介绍一下使用 Flink SQL 实时同步数据到 Hive 的流程。原创 2022-06-01 11:06:54 · 1939 阅读 · 0 评论 -
【Flink实战系列】Flink SQL 之 Session Window 的用法
Flink SQL 之 Session Window 的用法Session Windows会话窗口分配器按活动的会话对元素进行分组。与翻滚窗口和滑动窗口相比,会话窗口没有重叠,也没有固定的开始和结束时间。相反,当会话窗口在一段时间内没有接收到元素时,即当不活动的间隙发生时,会话窗口将关闭。会话窗口赋值器可以配置为静态会话间隙,也可以配置为会话间隙提取器函数,该函数定义了不活动的时间长度。当此期间结束时,当前会话关闭,随后的元素被分配给一个新的会话窗口。[外链图片转存失败,源站可能有防盗链机制,建议将图原创 2022-05-07 20:16:52 · 1698 阅读 · 0 评论 -
【Flink实战系列】Flink 本地 Web UI 的配置及使用
当你在本地开发调试 Flink 任务的时候,如果没有搭建集群环境,但是又想要查看 Flink 的 Web UI 该怎么办呢?其实 Flink 是提供有在本地查看 Flink UI 功能的。添加依赖<!-- 本地查看 Flink UI 需要这个包 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>fl.原创 2022-04-18 21:23:06 · 6436 阅读 · 0 评论 -
【Flink实战系列】Flink SQL 写入 kafka 自定义分区策略(sink.partitioner)
Flink SQL 写入 kafka 自定义分区策略当用 Flink SQL 写入 kafka 的时候如何指定分区策略呢?其实 Flink SQL 本身是提供有 sink.partitioner 参数的,详细可以查看官网 https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/connectors/table/kafka/#sink-partitionersink.partitioneroptional‘default’原创 2022-03-27 23:17:30 · 3950 阅读 · 0 评论 -
【Flink实战系列】Flink 提交任务遇到 Server Response Internal server error 怎么排查
很多同学在提交 Flink 任务的时候遇到下面这种报错不知道怎么排查.记得一定要去 JM 的 logs 里面看详细的报错信息,只看这个 Internal server error 是看不出来任何问题的,JM 里有关的报错信息如下:2022-03-27 18:29:51,026 ERROR org.apache.flink.runtime.webmonitor.handlers.JarRunHandler [] - Unhandled exception.java.util.concurrent.原创 2022-03-27 19:53:15 · 3700 阅读 · 0 评论 -
【Flink实战系列】Flink 任务发生 failover 的常见原因及解决办法
在生产环境中,经常会遇到 Flink 任务发生 failover ,发生 failover 的原因有很多,今天就来总结一下常见的几种情况资源不足问题2022-02-09 10:22:18org.apache.flink.runtime.jobmanager.scheduler.NoResourceAvailableException: Could not allocate all requires slots within timeout of 300000 ms. Slots required:.原创 2022-02-26 12:16:46 · 2206 阅读 · 0 评论 -
【Flink实战系列】Flink 1.14.0 消费 kafka 数据自定义反序列化器
Flink 1.14.0 消费 kafka 数据自定义反序列类在最近刚发布的 Flink 1.14.0 版本中 Source 接口进行了重构,API 的变化还是非常大的,那在新的接口下消费 kafka 的时候如何自定义反序列类呢?Kafka Source使用Kafka source 提供了一个构建类来构造 KafkaSource 的实例。下面的代码片段展示了如何构建一个 KafkaSource 来消费 topic input-topic 的最早偏移量的消息,使用消费组 my-group,并且只将 m原创 2021-10-10 12:31:10 · 2204 阅读 · 0 评论 -
【Flink实战系列】Flink SQL 如何实现 count window 功能?
Flink SQL 如何实现 count window 功能?需求在 Flink 里面窗口可以划分为两大类,分别是 TimeWindow 和 CountWindow.TimeWindow 是基于时间的,又可以细分为 Tumble Window, Hop Window, Session Window 这三种都是支持的,CountWindow 是基于个数的,目前在 Flink SQL 里面是不支持的,可能是因为社区觉得 CountWindow 使用场景不是很多吧.那如果我们现在需要批量写第三方存储这个时候可原创 2021-06-26 20:15:16 · 1478 阅读 · 2 评论 -
【Flink实战系列】Flink 消费多个 topic 的数据根据不同 topic 数据做不同的处理逻辑
Flink 消费多个 topic 的数据根据不同 topic 数据做不同的处理逻辑需求有的时候我们需要消费同一个 kafka 集群的多个 topic 数据,然后可能会根据不同 topic 的数据做不同的处理逻辑.可能还需要获取到 topic 的元数据信息比如 offset ,timestamp 等.分析其实对于这个需求来说实现的方式有很多种,比如你可以消费两个 topic 的数据,然后做一个 union 操作,然后可以用 filter 来过滤不同 topic 的数据做不同的处理,但是这种方式并不是最原创 2021-06-12 16:27:40 · 6047 阅读 · 2 评论 -
【Flink实战系列】Flink 如何实现全链路延迟监控
Flink 如何实现全链路延迟监控需求 & 背景在实际的生产环境中,我们希望可以监控一个任务整个链路的延迟情况,用来分析 Flink 应用的性能表现.分析Flink 的全链路延迟监控指的是从任务的 source 经过中间的 operator 到最后的 sink 端到端的延迟,这是一个非常重要的指标,可以用来衡量 Flink 任务的整体性能和响应延迟,下面就来介绍一下如何实现全链路的监控.思考既然要计算端到端的延迟,很容易想到的办法就是在 source 端获取一个时间戳,然后在 sink原创 2021-05-11 13:05:12 · 2153 阅读 · 0 评论 -
【Flink实战系列】Flink 各种报错汇总以及解决方案(持续更新中)
这篇文章主要用来记录平时使用 Flink 过程中遇到的问题以及解决方案,其实前面已经有一篇这样的文章了,但是那篇文章里面的问题已经很多了,不太方便浏览,所以新开了一篇文章,后面的问题都会更新到这篇文章中....原创 2021-02-06 21:02:33 · 4559 阅读 · 1 评论 -
【Flink实战系列】Flink 如何动态写入 kafka 的多个 topic
昨天在群里一个同学问了这样一个问题,Flink怎么根据数据里面的某个字段动态把数据写入多个kafka的topic.其实这个问题非常简单,你肯定会想到说写多个sink就可以了,Flink确...原创 2020-04-16 16:26:54 · 8070 阅读 · 4 评论 -
【Flink实战系列】自定义通用的 flatmap 实现数据预聚合功能(keyby + countWindow)
需求有时候我们需要对数据做预聚合操作,比如下游需要批量写入或者批量请求访问的时候,关于预聚合大概有两种解决方案,一种是使用 keyby + countWindow 的方式,第二种就是今天要介绍的 flatmap 的方式.并且还要实现一个通用的 flatmap .思路实现过程非常的简单,定义一个泛型类实现 FlatMapFunction 接口,然后定义一个成员变量 List 重写 flatMap 方法,每次把数据缓存到 List 里面攒一个 batch 然后发送到下游,并清空 List 的数据.原创 2021-01-23 11:56:20 · 1950 阅读 · 7 评论 -
【Flink实战系列】通用的反序列化类把 JSON 转成 POJO 对象
背景 & 痛点1, Flink 在消费到 kafka 的数据后,我们经常会把数据转成 POJO 对象,方便后面对数据的处理,但是每个人 POJO 类型是不一样的,每次都需要新开发一个反序列化的类,这样会带来大量的重复代码.能不能实现一个通用的反序列类来解决这个问题?2, 如何获取到 kafka 的元数据信息? 比如我有这样的需求,一个 Flink 任务消费了多个 topic 的数据后面要根据不同的 topic 名称做不同的处理逻辑,再比如我需要获取到数据写入 kafka 的时间戳,做全链路的原创 2021-01-21 19:40:12 · 3719 阅读 · 16 评论 -
【Flink实战系列】Flink 消费 kafka 并行度设置多少合理(kafka 的 partition 和 Flink 的 subtask 对应关系) ?
Flink消费kafka数据并行度设置多少比较合理?最近一个朋友问我的问题,Flink消费kafka数据的时候,并行度设置多少比较合理呢? 假如消费多个topic,又该怎么设置呢?要弄明白这个问题首先你要知道Flink消费kafka数据的时候,Flink的并行度和topic的partition是什么关系?那我们就来简单的看一下源码,FlinkKafkaConsumer的源码比较多,就不从头开始看了,直接看相关部分的代码KafkaTopicPartitionAssigner这个类里面的assign方法.源原创 2020-10-09 17:52:03 · 6561 阅读 · 2 评论 -
【Flink实战系列】Flink SQL 实现interval Join
上一篇是用API实现的interval join,这一篇主要是用Flink sql实现一个interval join,实现的逻辑和上一篇一样,包括最后的返回值都是一样的,直接看下面的代码:package flink.joinimport java.util.TimeZoneimport com.alibaba.fastjson.JSONimport flink.util.CommonUtilsimport org.apache.flink.api.scala._import org.apa原创 2020-09-20 19:31:40 · 1721 阅读 · 0 评论 -
【Flink实战系列】为什么不建议用 JSONKeyValueDeserializationSchema 反序列化
为什么不建议用JSONKeyValueDeserializationSchema?上一篇文章中在反序列化kafka的数据时候用的是KafkaDeserializationSchema,因为我要获取kafka的元数据信息,有同学问我说为什么不直接用Flink自带的JSONKeyValueDeserializationSchema呢? 这个也可以获取到kafka的元数据信息啊,而且使用起来也非常的简单,JSONKeyValueDeserializationSchema 确实可以获取到kafka的元数据信息,但原创 2020-09-05 15:53:41 · 2543 阅读 · 1 评论 -
【Flink实战系列】Flink怎么获取kafka的topic,partition,offset信息
Flink怎么获取kafka的topic信息最近也是有同学问我Flink程序里面怎么获取kafka的topic信息,今天就来介绍两种方法,先说一种比较简单的使用JSONKeyValueDeserializationSchema反序列化,就可以了,我们看一下他的源码,这个类是实现了KeyedDeserializationSchema这个接口的deserialize方法.你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解原创 2020-06-23 21:59:14 · 2949 阅读 · 0 评论 -
【Flink实战系列】Flink使用StreamingFileSink写入HDFS(parquet格式snappy压缩)
这篇文章主要介绍一下Flink使用StreamingFileSink写入HDFS怎么用snappy压缩,之前的文章介绍过了写入parquet格式的数据,当时也有星球里面的朋友问这种写法怎么压缩,我只是简单的回复了说可以用AvroParquetWriter,今天就来详细介绍一下具体怎么实现我们首先来看一下AvroParquetWriter的源码/** Create a new {@link AvroParquetWriter}. * * @param file a file path * @p原创 2020-06-13 13:46:49 · 5596 阅读 · 8 评论