环境:Hadoop2.75 + FLink1.4 + Kafka0.10
我已经设置了一个实时数据处理项目。我使用Flink Table源API(Kafka010JsonTableSource)作为tablaSource。从kafka获取数据然后执行SQL并最后输出到kafka主题。这是一个清晰的流程,但是当我在Flink集群上执行它时遇到异常,下面是我的主要代码:
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.getConfig.setRestartStrategy(RestartStrategies.fixedDelayRestart(4, 10000))
env.enableCheckpointing(5000)
val tableEnv = TableEnvironment.getTableEnvironment(env)
val tableSource:KafkaTableSource = Kafka010JsonTableSource.builder()
.forTopic(kafkaConfig.topic)
.withKafkaProperties(props)
.withSchema(dynamicJsonSchema)
.withRowtimeAttribute(
enventTimeFieldName,
new ExistingField(enventTimeFieldName),
new MyBoundedOutOfOrderTimestamps(100L))
.build()
tableEnv.registerTableSource(tableName, tableSource)
val tableResult:Table = tableEnv.sqlQuery(sql)
tableResult.writeToSink(new Kafka010JsonTableSink(kafkaOutput.topic, props))
我已经启用了检查点。我第一次在flink上执行,我只是遵循消费者的默认配置。在Flink任务运行后,我通过kafka shell命令(kafka-consumer-groups.sh)检查了偏移量并发现了一个奇怪的情况。基于shell命令输出和来自Flink任务管理器的日志,我发现偏移在几秒钟开始时成功提交,但后来我继续遇到许多异常,如下所示:
块引用 2018-01-19 09:24:03,174 WARN org.apache.flink.streaming.connectors.kafka.internal.Kafka09Fetcher - 向Kafka提交抵消失败。这不会影响Flink的检查站。 org.apache.kafka.clients.consumer.CommitFailedException:无法完成提交,因为该组已经重新平衡并将分区分配给另一个成员。这意味着后续调用poll()的时间长于配置的max.poll.interval.ms,这通常意味着轮询循环花费了太多时间进行消息处理。您可以通过增加会话超时或通过max.poll.records减少poll()中返回的批量的最大大小来解决此问题。 在org.apache.kafka.clients.consumer.internals.ConsumerCoordinator $ OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:792) 在org.apache.kafka.clients.consumer.internals.ConsumerCoordinator $ OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:738) 在org.apache.kafka.clients.consumer.internals.AbstractCoordinator $ CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:808) 在org.apache.kafka.clients.consumer.internals.AbstractCoordinator $ CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:788) 在org.apache.kafka.clients.consumer.internals.RequestFuture $ 1.onSuccess(RequestFuture.java:204) 在org.apache.kafka.clients.consumer.internals.RequestFuture.fireSuccess(RequestFuture.java:167) 在org.apache.kafka.clients.consumer.internals.RequestFuture.complete(RequestFuture.java:127) 在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient $ RequestFutureCompletionHandler.fireCompletion(ConsumerNetworkClient.java:488) 在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.firePendingCompletedRequests(ConsumerNetworkClient.java:348) 在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:262) 在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:208) 在org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:1096) 在org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1043) 在org.apache.flink.streaming.connectors.kafka.internal.KafkaConsumerThread.run(KafkaConsumerThread.java:247) 2018-01-19 09:24:03,174 WARN org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumerBase - 异步Kafka提交失败。 org.apache.kafka.clients.consumer.CommitFailedException:无法完成提交,因为该组已经重新平衡并将分区分配给另一个成员。这意味着后续调用poll()的时间长于配置的max.poll.interval.ms,这通常意味着轮询循环花费了太多时间进行消息处理。您可以通过增加会话超时或通过max.poll.records减少poll()中返回的批量的最大大小来解决此问题。 在org.apache.kafka.clients.consumer.internals.ConsumerCoordinator $ OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:792) 在org.apache.kafka.clients.consumer.internals.ConsumerCoordinator $ OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:738) 在org.apache.kafka.clients.consumer.internals.AbstractCoordinator $ CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:808) 在org.apache.kafka.clients.consumer.internals.AbstractCoordinator $ CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:788) 在org.apache.kafka.clients.consumer.internals.RequestFuture $ 1.onSuccess(RequestFuture.java:204) 在org.apache.kafka.clients.consumer.internals.RequestFuture.fireSuccess(RequestFuture.java:167) 在org.apache.kafka.clients.consumer.internals.RequestFuture.complete(RequestFuture.java:127) 在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient $ RequestFutureCompletionHandler.fireCompletion(ConsumerNetworkClient.java:488) 在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.firePendingCompletedRequests(ConsumerNetworkClient.java:348) 在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:262) 在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:208) 在org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:1096) 在org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1043) 在org.apache.flink.streaming.connectors.kafka.internal.KafkaConsumerThread.run(KafkaConsumerThread.java:247)
所以我根据上面的错误信息搜索了解决方案。有人告诉我应该增加session.timeout.ms,然后我按照它,但仍然失败。之后我尝试了多种以下的组合配置进行测试,kafka偏移总是在开始时成功提交,但稍后会提交失败。我真的不知道要解决它,你会帮我解决吗?非常感谢!!!!!!
kafka消费者配置组合如下:
{
"propertyKey": "session.timeout.ms",
"propertyValue": "300000"
},
{
"propertyKey": "request.timeout.ms",
"propertyValue": "505000"
},
{
"propertyKey": "auto.commit.interval.ms",
"propertyValue": "10000"
},
{
"propertyKey": "max.poll.records",
"propertyValue": "50"
},
{
"propertyKey": "max.poll.interval.ms",
"propertyValue": "500000"
},
{
"propertyKey": "client.id",
"propertyValue": "taxi-client-001"
},
{
"propertyKey": "heartbeat.interval.ms",
"propertyValue": "99000"
}
我尝试将上述配置更改为所有类型的值,但都失败了,即使我根据kafka官方文档指南配置它们。我希望你能帮助修复上述错误,非常感谢!!!
答案 0 :(得分:3)
我找到了根本原因。 重新平衡错误总是发生的原因是两个消费者' (一个是消费者输入数据,另一个是消费者输出数据)组名是相同的。我怀疑只有一个协调员没有足够的能力来处理两个消费者的偏移提交动作。我改变了一个消费者的团体名称,世界突然变得安静。错误从未发生过。