记一次线上环境flink任务连接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日志,定位问题
此致,问题解决。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache Flink 提供了与 Kafka 进行无缝集成的功能。使用 Flink SQL 连接 Kafka 可以轻松地将流处理和数据分析应用程序与 Kafka 集成。 以下是在 Flink SQL 中连接 Kafka 的步骤: 1. 首先,需要在 Flink 中导入 Kafka 的依赖项。可以在 pom.xml 文件中添加以下依赖项: ``` <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_{scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency> ``` 2. 在 Flink SQL 中,需要使用 CREATE TABLE 语句来创建与 Kafka 主题的连接。以下是一个示例 CREATE TABLE 语句: ``` CREATE TABLE myKafkaTable ( kafka_key STRING, kafka_value STRING, kafka_timestamp TIMESTAMP(3), kafka_topic STRING, kafka_partition INT, kafka_offset BIGINT ) WITH ( 'connector' = 'kafka', 'topic' = 'myKafkaTopic', 'properties.bootstrap.servers' = 'localhost:9092', 'properties.group.id' = 'myKafkaConsumerGroup', 'format' = 'json', 'scan.startup.mode' = 'earliest-offset' ) ``` 3. 在上面的示例中,`myKafkaTable` 是要创建的表的名称,`kafka_key`、`kafka_value`、`kafka_timestamp`、`kafka_topic`、`kafka_partition` 和 `kafka_offset` 是表中的列名。`'connector' = 'kafka'` 表示连接Kafka,`'topic' = 'myKafkaTopic'` 表示要连接Kafka 主题的名称,`'properties.bootstrap.servers' = 'localhost:9092'` 表示 Kafka 服务器的地址,`'properties.group.id' = 'myKafkaConsumerGroup'` 表示使用的消费者组的名称,`'format' = 'json'` 表示消息格式为 JSON,`'scan.startup.mode' = 'earliest-offset'` 表示从最早的可用偏移量开始读取消息。 4. 通过使用 Flink SQL 中的 SELECT 语句,可以从 Kafka 主题中读取和查询数据。以下是一个示例 SELECT 语句: ``` SELECT kafka_key, COUNT(*) as count FROM myKafkaTable GROUP BY kafka_key ``` 5. 最后,可以使用 Flink 中的 DataStream API 或 Table API 来处理从 Kafka读取的数据。 这就是在 Flink SQL 中连接 Kafka 的基本步骤。通过使用 Flink SQL 和 Kafka,可以轻松地构建流处理和数据分析应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值