Apache kafka 在发送到任务之前修改KafkaConnect中的连接器配置
我正在用Kafka Connect写一篇文章,并讨论了一个问题。此连接器具有如下配置:Apache kafka 在发送到任务之前修改KafkaConnect中的连接器配置,apache-kafka,apache-kafka-connect,Apache Kafka,Apache Kafka Connect,我正在用Kafka Connect写一篇文章,并讨论了一个问题。此连接器具有如下配置: { “connector.class”:“a.b.ExampleFileSinkConnector”, “tasks.max”:“1”, “主题”:“我的主题”, “maxFileSize”:“50” } 我这样定义连接器的配置: @Override public ConfigDef config() { ConfigDef结果=新的ConfigDef(); 定义(“maxFileSize”,Type.ST
{
“connector.class”:“a.b.ExampleFileSinkConnector”,
“tasks.max”:“1”,
“主题”:“我的主题”,
“maxFileSize”:“50”
}
我这样定义连接器的配置:
@Override public ConfigDef config()
{
ConfigDef结果=新的ConfigDef();
定义(“maxFileSize”,Type.STRING,“10”,Importance.HIGH,“文件大小”);
返回结果;
}
在连接器中,我启动以下任务:
@覆盖公共列表任务配置(int-maxTasks){
列表结果=新建ArrayList();
对于(int i=0;i
一切都很顺利
但是,在启动任务时(在taskConfigs()中),如果我添加以下内容:
taskConfig.put(“历元”、“123”);
这破坏了整个基础设施:所有连接器都在一个无休止的循环中停止和重新启动
连接日志文件中没有任何异常或错误可以提供帮助
使其工作的唯一方法是在连接器配置中添加“epoch”,我不想这样做,因为它是连接器必须发送到任务的内部参数。它不打算暴露给连接器的用户
我注意到的另一点是,除了将其设置为默认值之外,不可能更新任何连接器配置参数的值。更改参数并将其发送到任务会产生相同的行为
我真的很感激在这个问题上有任何帮助
编辑:这是SinkTask::start()的代码
@覆盖公共无效启动(映射任务配置){
试一试{
connectorName=taskConfig.get(“connectorName”);
log.info(“{}--Task.start()”,connectorName);
fileNamePattern=taskConfig.get(“fileNamePattern”);
rootDir=taskConfig.get(“rootDir”);
fileExtension=taskConfig.get(“fileExtension”);
maxFileSize=SimpleFileSinkConnector.parseIntegerConfig(taskConfig.get(“maxFileSize”);
maxTimeMinutes=SimpleFileSinkConnector.parseIntegerConfig(taskConfig.get(“maxTimeMinutes”);
maxNumRecords=SimpleFileSinkConnector.parseIntegerConfig(taskConfig.get(“maxNumRecords”);
taskNumber=SimpleFileSinkConnector.parseIntegerConfig(taskConfig.get(“taskNumber”));
epochStart=SimpleFileSinkConnector.parseLongConfig(taskConfig.get(“epochStart”);
log.info(“{}--fileNamePattern:{},rootDir:{},fileExtension:{},maxFileSize:{},maxTimeMinutes:{},maxNumRecords:{},taskNumber:{},epochStart:{}”,
connectorName、fileNamePattern、rootDir、fileExtension、maxFileSize、maxTimeMinutes、maxNumRecords、taskNumber、epochStart);
如果(任务编号==0){
checkTempFilesForPromotion();
}
computeInitialFilename();
log.info(“{}--Task.start()END”,connectorName);
}捕获(例外e){
log.info(“{}--Task.start()异常:{}”,connectorName,e.getLocalizedMessage());
}
}
我们找到了问题的根本原因。Kafka Connect框架实际上按照设计的方式运行-问题与我们如何使用taskConfigs配置框架有关
问题
在我们的设计中,FileSinkConnector在其start()生命周期方法中设置一个历元,该历元通过taskConfigs()生命周期方法传递给其任务。因此,每次连接器的start()生命周期方法运行时,都会为任务生成不同的配置,这就是问题所在
每次生成不同的配置是不可能的。事实证明,Connect框架检测到配置的差异,并将在检测到时重新启动/重新平衡-停止并重新启动连接器/任务。重新启动将调用连接器的stop()和start()方法。。。这将(当然)产生另一个配置变化(因为新时代),恶性循环开始了
这是一个有趣而意想不到的问题。。。由于一种我们不欣赏的连接行为。这是我们第一次尝试生成不是连接器配置的简单功能的任务配置
请注意,Connect中的这种行为是有意的,它解决了动态更改配置的实际问题,比如JDBC接收器连接器,当它检测到要接收的新数据库表时,会自动更新其配置
感谢那些帮助我们的人 你能添加你的
SinkTask::start(…)
源代码吗?你写过,“没有异常或错误”,但“这破坏了整个基础结构”。是否可以添加带有“无止境循环”的部分日志?