记一次线上环境flink任务连接kafka失败的问题

文章描述了一次线上环境的问题排查和解决过程,主要涉及15台Kafka和30台Flink服务器。由于部分消费者组积压,计划调整Flink配置,但发现任务频繁重启。经过检查,确定是两台Kafka因JVM堆内存不足导致FullGC,进而影响服务。通过增加Kafka的堆内存,解决了这个问题,同时强调了在调整配置和重启服务时应避免数据丢失并保持集群稳定性。

简单说一下线上环境配置:
15台kafka、30台flink(2台job,28台task)512G内存,挂载7T硬盘
数据量大概是每秒560w+

背景:发现kafka的部分消费者组有积压,打算调整程序的一些配置参数,来提高flink的处理能力,只做配置文件的修改,然后重启程序。再flink界面观察到任务在不停重启。

解决:先在flink界面查看报错任务的日志,报错的大意是无法获取到kafka-topic的元数据信息,由于已经明确程序未做任何变更,修改的参数也并不会产生此类报错。
1、优先考虑是不是由于网络波动导致连不上kafka,ping过之后排除网络原因。
2、查看kafka-manager,发现broker的值是13,说明有两台kafka挂掉了,在zookeeper中找到挂掉的两台机器的brokerid(我们的网口用的v6的网口,在kafka-manager界面ipv6的地址无法完全展示,所以没办法通过界面查看是那哪两台挂掉了,如果网口是ipv4的话,应该可以直接通过界面查看)
2、查看挂掉的两台的kafka日志,在kafka安装目录下的 logs/ 目录,ll -rt 命令找到最新的日志文件,通过查看日志发现两台机器是由于JVM的堆内存不足,不停的fullGC,导致程序无法正常连接kafka集群。
3、首先想到的就是增加堆内存,但是由于这两台kafka进程无法通过正常的启停重启(停不掉)。所以只能选择强行kill的方式,但是强行kill掉程序,会导致kafka安装目录下 kafka-logs/ 目录中的index损坏,还是无法正常启动kafka,所以想到一个办法就是先将 *kafka-logs/*目录下的数据移动到别的地方,再启动kafka,然后再将它们移回 kafka-logs/,但是我当时移走发现还是无法启动,于是我又给它移回去了,再启动就可以正常启动了…(很神奇,我也不知道为什么,希望有大佬可以解答一下)。两台挂掉的kafka都进行同样的操作。确保kafka集群的15台机器全部正常。
4、由于堆内存不是一下子占满的,所以等kafka集群正常以后,再停掉kafka集群,在修改堆内存也是可以的(由于我这里允许有数据丢失,所以就全部同时重启了,最好不要这样做,最好的做法就是停一部分留一部分,保证永远有kafka在接收数据)
5、kafka安装目录的 bin/ 目录下,有一个kafka的启动脚本 kafka-server-start.sh,export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G" 找到这句话,Xmx表示的是最大的堆内存,Xms表示的是初始化的堆内存,根据项目需要修改,我这里是把最大的堆内存从20g扩到了40g,初始化堆内存4g不变。
6、修改完堆内存后重启kafka集群,可以先通过kafka的消费命令消费一个topic,看看能否正常消费。如果不能正常消费,再看kafka日志,定位问题
此致,问题解决。

在 Apache Flink 1.14.4 中,Kafka 是一个常用的外部数据源,用于实现流式数据的读取与处理。Flink 提供了 Kafka 连接器(Kafka Source),允许用户从 Kafka 主题中读取数据,并与 Flink 的流处理功能集成[^1]。 ### Kafka Source 的基本使用方法 在 Flink 1.14.4 中,可以通过 `KafkaSource` 类来构建 Kafka 数据源。以下是一个典型的 Kafka Source 配置示例: ```java import org.apache.flink.connector.kafka.source.KafkaSource; import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class KafkaFlinkIntegration { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); KafkaSource<String> kafkaSource = KafkaSource.<String>builder() .setBootstrapServers("localhost:9092") .setTopic("input-topic") .setGroupId("flink-group") .setDeserializer(KafkaRecordDeserializationSchema.builder() .setValueDeserializer(new SimpleStringDeserializer()) .build()) .setStartingOffsets(OffsetsInitializer.latest()) .build(); env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "Kafka Source") .print(); env.execute("Flink Kafka Integration Example"); } } ``` ### 关键配置说明 - **Bootstrap Servers**:指定 Kafka 集群的地址。 - **Topic**:指定要读取Kafka 主题。 - **Group ID**:消费者组 ID,用于管理消费者的消费进度。 - **Deserializer**:指定如何反序列化 Kafka 消息。例如,`SimpleStringDeserializer` 用于处理字符串类型的消息。 - **Starting Offsets**:定义 Kafka 消费者的起始偏移量策略,如 `latest` 表示从最新的消息开始读取。 ### 依赖配置 在 Maven 项目中,需要引入 FlinkKafka 连接器依赖。对于 Flink 1.14.4,可以使用以下依赖: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.11</artifactId> <version>1.14.4</version> </dependency> ``` ### 偏移量管理与容错机制 Flink Kafka Source 支持偏移量的自动提交,并且可以通过 Checkpoint 机制确保数据处理的精确一次语义。当 Flink 作业失败时,可以通过 Checkpoint 恢复状态,确保数据处理的完整性[^3]。 ### Kafka Source 与并行度 当 Kafka Source 的并行度高于 Kafka 主题的分区数时,Flink 提供了处理空闲(idleness)的机制,确保不会因为部分并行任务没有数据而影响整体性能[^2]。 ### 相关问题 1. 如何在 Flink 1.14.4 中配置 Kafka Source 的偏移量初始位置? 2. Flink 1.14.4 如何处理 Kafka 消费者的容错和状态恢复? 3. Kafka Source 的并行度设置与 Kafka 主题分区数之间有何关系? 4. Flink Kafka Source 是否支持从特定时间点开始消费数据? 5. 如何在 Flink 1.14.4 中实现 Kafka 数据的反序列化?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值