我正在使用apache nifi来存储kafka中的日志。
我有一些日志行,这取决于我必须将它们发送到主题kafka或其他内容。 我遇到的问题是有很多主题,因此我将不得不使用许多处理器。
我认为使用'executioncript',根据日志文本中的条件,我可以生成一个动态属性,我可以在publishkafka处理器的'topic name'属性中使用。
我开始使用代码来读取流文件的内容,以及编写一些条件,但我不知道如何生成属性。
日志行的一些示例: 吉姆,18岁,男,156,俄勒冈州,美国等 约翰,55,M 170,美国爱达荷州等
这是我到目前为止所拥有的:
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
from org.apache.nifi.processor.io import StreamCallback
class PyStreamCallback(StreamCallback):
def __init__(self):
pass
def process(self, inputStream, outputStream):
Log = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
TextLog = str(Log).split(',')
name = TextLog[0]
age = TextLog[1]
sex = TextLog[2]
if name == 'John' and age == '30':
Topic_A = str(TextLog)
outputStream.write(bytearray((Topic_A).encode('utf-8')))
elif name == 'Max' and age == '25':
Topic_B = str(TextLog)
outputStream.write(bytearray((Topic_B).encode('utf-8')))
elif name == 'Smith' and age == '10' or '20':
Topic_C = str(TextLog)
outputStream.write(bytearray((Topic_C).encode('utf-8')))
目标是拥有一个执行脚本处理器和一个kafka处理器。 拜托,有人可以帮助我。
答案 0 :(得分:4)
简短的回答是:
flowFile = session.putAttribute(flowFile, 'my-property', 'my-value')
https://funnifi.blogspot.com/2016/02/executescript-processor-hello-world.html
在不编写任何自定义代码的情况下执行此操作的典型方法是使用RouteOnContent ...
您可以添加用户定义的属性,其中名称将成为关系,值为正则表达式。
例如,添加两个属性:
john = John,30,.*
max = Max,25,.*
从那里你可以将每个关系发送到一个UpdateAttribute处理器,你可以在其中设置主题名称,因此john将转到设置topic = Topic_A的UpdateAttribute,而max将转到设置topic = Topic_B的UpdateAttribute。
然后他们都会连接到一个PublishKafka,其主题设置为$ {topic}。