Apache kafka ApacheNIFI:有没有一种方法可以将消息键作为多个属性的组合发布到kafka?

Apache kafka ApacheNIFI:有没有一种方法可以将消息键作为多个属性的组合发布到kafka?,apache-kafka,apache-nifi,Apache Kafka,Apache Nifi,我有一个要求,我需要阅读CSV并以Avro格式发布到卡夫卡主题。在发布期间,我需要将消息键设置为两个属性的组合。假设我有一个名为id的属性和一个名为group的属性。我需要我的消息密钥为id+-+组。有没有一种方法可以在ApacheNIFI流中实现这一点?将消息键设置为单个属性对我来说很好 是的,在或您正在使用的任何版本中,设置Kafka Key属性以使用构造消息密钥。例如,表达式${id}-${group}将构成它,例如id=myId&group=MyGroup->myId-MyGroup 如

我有一个要求,我需要阅读CSV并以Avro格式发布到卡夫卡主题。在发布期间,我需要将消息键设置为两个属性的组合。假设我有一个名为id的属性和一个名为group的属性。我需要我的消息密钥为id+-+组。有没有一种方法可以在ApacheNIFI流中实现这一点?将消息键设置为单个属性对我来说很好

是的,在或您正在使用的任何版本中,设置Kafka Key属性以使用构造消息密钥。例如,表达式${id}-${group}将构成它,例如id=myId&group=MyGroup->myId-MyGroup

如果不显式填充此属性,处理器将查找属性kafka.key,因此如果之前设置了该值,则会传递该值

评论后的附加信息2020-06-15 16:49 啊,那么PublishKafka记录将向Kafka发布多条消息,每条消息都与单个NiFi流文件中的一条记录相关。在这种情况下,属性要求使用字段a来填充该消息键。我建议在此处理器之前使用Expression Language向每个记录添加一个名为messageKey的字段或任何您喜欢的字段,然后在publishing processor属性中引用此字段

是的,在或您正在使用的任何版本中,设置Kafka Key属性以使用构造消息密钥。例如,表达式${id}-${group}将构成它,例如id=myId&group=MyGroup->myId-MyGroup

如果不显式填充此属性,处理器将查找属性kafka.key,因此如果之前设置了该值,则会传递该值

评论后的附加信息2020-06-15 16:49
啊,那么PublishKafka记录将向Kafka发布多条消息,每条消息都与单个NiFi流文件中的一条记录相关。在这种情况下,属性要求使用字段a来填充该消息键。我建议在此处理器之前使用Expression Language向每个记录添加一个名为messageKey的字段或任何您喜欢的字段,然后在publishing processor属性中引用此字段

请注意每个属性上的s,它指示哪些是允许的或哪些是不允许的:


如果字段不包含表达式语言,请使用updateAttribute处理器设置所需的组合值。然后在下游使用组合值。

请注意每个属性上的s,它指示允许或不允许的内容:


如果字段不包含表达式语言,请使用updateAttribute处理器设置所需的组合值。然后使用下游的组合值。

谢谢您的输入。我不得不改变我最初使用组合键生成的设计,使用PartitionRecordProcessor根据特定字段对文件进行实际分区。我的CSV文件中有一个日期字段,每个日期可以有多条记录。我基于这个日期字段进行分区,并使用id字段作为每个分区的键生成kafka主题。卡夫卡主题名称是动态的,并以日期值作为后缀。因为我计划使用Kafka streams从这些主题中读取数据,所以这是一个比最初的设计好得多的设计


谢谢你的意见。我不得不改变我最初使用组合键生成的设计,使用PartitionRecordProcessor根据特定字段对文件进行实际分区。我的CSV文件中有一个日期字段,每个日期可以有多条记录。我基于这个日期字段进行分区,并使用id字段作为每个分区的键生成kafka主题。卡夫卡主题名称是动态的,并以日期值作为后缀。因为我计划使用Kafka streams从这些主题中读取数据,所以这是一个比最初的设计好得多的设计


谢谢你的回复。我正在使用PublishKafkareRecord_2_0处理器,并且我正在使用一个Message Key属性来设置密钥。我尝试了建议的组合,它发布了一个空键。当我尝试使用一个字段时,就像id一样,它是有效的。更新了我的问题与出版卡夫卡雷德进程截图或感谢你的回应。我正在使用PublishKafkareRecord_2_0处理器,并且我正在使用一个Message Key属性来设置密钥。我尝试了建议的组合,它发布了一个空键。当我尝试使用一个字段时,就像id一样,它是有效的。更新了我的问题,并附上了《卡夫卡记录处理程序》的截图。我能够从updateAttribute处理器中引用内置的nifi属性,如uuid、文件名、文件大小、记录计数。但是,如何引用有效负载中的字段?我正在读取一个csv文件,当我试图引用像${id}这样的属性时,它不起作用
litText->ExtractText。正如下面所建议的,UpdateRecord可以使用CSV读/写器处理CSV的更新,您可以在CSV读/写器中告诉nifi要用于读/写的模式。UpateRecord是首选方法。下面是CSV->SplitText、ExtractText、ReplaceText到PutSQL的示例。您的流看起来很相似,但您需要更改提取的值,以及它们在replaceText中的格式,然后发送到PublishKafka。另一种方法是首选的,因为它可以在整个CSV上运行,而不是将其拆分并处理单独的行。本讨论不围绕记录处理,因此本例中的字段不起作用。属性需要记录字段名,而不是像大多数属性那样的复合表达式。谢谢。我能够从updateAttribute处理器中引用内置的nifi属性,如uuid、文件名、文件大小、记录计数。但是,如何引用有效负载中的字段?我正在读取一个csv文件,当我尝试引用${id}之类的属性时,它不起作用。从flowfile内容到属性获取csv值的simples表单使用SplitText->ExtractText。正如下面所建议的,UpdateRecord可以使用CSV读/写器处理CSV的更新,您可以在CSV读/写器中告诉nifi要用于读/写的模式。UpateRecord是首选方法。下面是CSV->SplitText、ExtractText、ReplaceText到PutSQL的示例。您的流看起来很相似,但您需要更改提取的值,以及它们在replaceText中的格式,然后发送到PublishKafka。另一种方法是首选的,因为它可以在整个CSV上运行,而不是将其拆分并处理单独的行。本讨论不围绕记录处理,因此本例中的字段不起作用。属性需要记录字段名,而不是像大多数属性那样的复合表达式语言。请注意,每个代理的分区数超过4K以避免zookeeper的开销不是一个好的做法。请注意,每个代理的分区数超过4K以避免zookeeper的开销不是一个好的做法。