Flink 1.9 FlinkKafkaProducer 使用 EXACTLY_ONCE 错误记录

使用flink FlinkKafkaProducer 往kafka写入数据的时候要求使用EXACTLY_ONCE语义
本以为本以为按照官网写一个就完事,但是却报错了

代码

1package com.meda.test 2 3import org.apache.flink.streaming.connectors.kafka.{ FlinkKafkaProducer, KafkaSerializationSchema} 4 5//创建一个DataStream 6val dStream: DataStream[MapDt] = ... 7 8//kafka配置 9val kafkaPro:Properties = ... 10 11//创建FlinkKafkaProducer 指定EXACTLY_ONCE 12val kafkaSink: FlinkKafkaProducer[ResultDt] = new FlinkKafkaProducer[ResultDt]("top[ic", new ResultDtSerialization("flink-topic-lillcol"), kafkaPro, FlinkKafkaProducer.Semantic.EXACTLY_ONCE) 13 14 15case class ResultDt(id: String, date_h: String, star: String, end: String, watermark: String, pv: Long, uv: Long) 16 17class ResultDtSerialization(topic: String) extends KafkaSerializationSchema[ResultDt] { 18 override def serialize(t: ResultDt, aLong: lang.Long): ProducerRecord[Array[Byte], Array[Byte]] = { 19 new ProducerRecord[Array[Byte], Array[Byte]](topic, t.toString.getBytes()) 20 } 21}

遇到问题

FlinkKafkaProducer.Semantic指定为FlinkKafkaProducer.Semantic.AT_LEAST_ONCE时,执行没有问题。

FlinkKafkaProducer.Semantic指定为FlinkKafkaProducer.Semantic.EXACTLY_ONCE时,执行报下面的错误:

1org.apache.kafka.common.KafkaException: Unexpected error in InitProducerIdResponse; The transaction timeout is larger than the maximum value allowed by the broker (as configured by transaction.max.timeout.ms). 2 at org.apache.kafka.clients.producer.internals.TransactionManager$InitProducerIdHandler.handleResponse(TransactionManager.java:984) 3 at org.apache.kafka.clients.producer.internals.TransactionManager$TxnRequestHandler.onComplete(TransactionManager.java:909) 4 at org.apache.kafka.clients.ClientResponse.onComplete(ClientResponse.java:109) 5 at org.apache.kafka.clients.NetworkClient.completeResponses(NetworkClient.java:557) 6 at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:549) 7 at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:288) 8 at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:235) 9 at java.lang.Thread.run(Thread.java:748) 10[INFO ] 2019-12-24 15:25:35,212 method:org.apache.flink.runtime.executiongraph.ExecutionGraph.transitionState(ExecutionGraph.java:1324)

错误大意是:
事务超时大于broker允许的最大值(transaction.max.timeout.ms)
一开始想都没想去修改transaction.max.timeout.ms的值,但是没有解决问题。


解决办法

官网关于Kafka Producers and Fault Tolerance有一段说明

1Kafka brokers by default have transaction.max.timeout.ms set to 15 minutes. 2This property will not allow to set transaction timeouts for the producers larger than it’s value. 3FlinkKafkaProducer011 by default sets the transaction.timeout.ms property in producer config to 1 hour, thus transaction.max.timeout.ms should be increased before using the Semantic.EXACTLY_ONCE mode.

Kafka brokers 默认的最大事务超时(transaction.max.timeout.ms)为15 minutes
生产者设置事务超时不允许大于这个值,这个属性不允许为大于其值的
但是在默认的情况下,FlinkKafkaProducer011设置事务超时属性(transaction.timeout.ms)为1 hour, 超过默认transaction.max.timeout.ms15 minutes。 因此在使用EXACTLY_ONCE语义的时候需要增大transaction.max.timeout.ms的值。

按照个和说法我只要transaction.max.timeout.ms增加到大于1 hour(即3 600 000ms)‬以上就可以了,但是经过测试还是不行。
最后通过修改生产者的事务超时属性transaction.timeout.ms解决问题

transaction.timeout.ms从1hour降到5 minutes 成功解决问题。

1//增加配置属性操作如下: 2kafkaPro.setProperty("transaction.timeout.ms",1000*60*5+"")

本文原创文章,转载请注明出处!!!

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

Flink 1.9 FlinkKafkaProducer 使用 EXACTLY_ONCE 错误记录 - HelloWorld