Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 以编程方式停止Flink Kafka使用者任务_Apache Kafka_Apache Flink - Fatal编程技术网

Apache kafka 以编程方式停止Flink Kafka使用者任务

Apache kafka 以编程方式停止Flink Kafka使用者任务,apache-kafka,apache-flink,Apache Kafka,Apache Flink,我将Kafka consumer与Flink 1.9(在Scala 2.12中)一起使用,并面临以下问题(类似于):在特定时间段内没有收到新消息时,consumer应该停止获取数据(并完成任务)(因为流可能是无限的,所以主题本身中没有“流结束”消息) 我尝试使用调用consumer.close()的ProcessFunction,但这没有帮助(consumer继续运行)。在ProcessFunction中抛出异常会完全终止作业,这不是我想要的(因为作业包含多个阶段,在抛出异常后会取消这些阶段)。

我将Kafka consumer与Flink 1.9(在Scala 2.12中)一起使用,并面临以下问题(类似于):在特定时间段内没有收到新消息时,consumer应该停止获取数据(并完成任务)(因为流可能是无限的,所以主题本身中没有“流结束”消息)

我尝试使用调用
consumer.close()
ProcessFunction
,但这没有帮助(consumer继续运行)。在
ProcessFunction
中抛出异常会完全终止作业,这不是我想要的(因为作业包含多个阶段,在抛出异常后会取消这些阶段)。以下是我的ProcessFunction:

class TimeOutFunction(//延迟,在此延迟之后将抛出警报标志
val超时:长,使用者:FlinkKafkaConsumer[行]
)扩展ProcessFunction[行,行]{
//状态以记住上次设置的计时器
私有变量lastTimer:ValueState[Long]=_
覆盖def open(形态:配置):单元={//设置计时器状态
val lastTimerDesc=新的ValueStateDescriptor[Long](“lastTimer”,classOf[Long])
lastTimer=getRuntimeContext.getState(lastTimerDesc)
}
重写def processElement(值:行,ctx:ProcessFunction[Row,Row]#上下文,out:Collector[Row]):Unit={//获取当前时间和计算超时时间
val currentTime=ctx.timerService.currentProcessingTime
val timeoutTime=当前时间+超时
//为超时时间注册计时器
ctx.timerService.RegisterProcessingTimer(超时)
//记住超时时间
更新(超时时间)
//通过事件
out.collect(值)
}
重写def onTimer(时间戳:Long,ctx:ProcessFunction[Row,Row]#OnTimerContext,out:Collector[Row]):单位={
//检查这是否是我们注册的最后一个计时器
if(timestamp==lastTimer.value){
//是的,因此之后没有收到任何数据。
//阻止消费者。
consumer.close()
}
}
}
反序列化模式上的
isEndOfStream()
方法也不好,因为它需要
nextElement
(我的情况正好相反,因为流应该在一段时间内没有下一个元素时停止)


因此,有一种方法可以做到这一点(最好不要子类化
flinkkaconsumer
和/或使用反射)?

你只是想停止消费者还是整个工作?@TobiSH仅限于消费者。我想不出任何针对flink的解决方案。当然,您可以使用带有一些控制消息的第二个主题(如“停止消费者”)。在进程函数中,可以发出这样的消息。这个模式在这里有更详细的描述:你能详细解释一下为什么要关闭消费者吗?@TobiSH这是因为作业的下一步处理数据块,只有在到达缓冲区中指定数量的事件或源末尾时才会触发。在卡夫卡,这可能永远不会发生,所以决定在超时时停止消费。