我目前正在开发一个NiFi流程,需要实现自定义处理器才能在csv记录上应用转换。
在我正在执行的一些基准测试中,我注意到了这种行为:如果每个自定义处理器只分配了一个线程,一切运行良好。为自定义处理器分配更多线程会导致由于java.lang.NullPointerException而无法处理会话。
由于错误无法通过单个线程重现,我更多地考虑了处理流文件的一些问题,或者我不知道的NiFi的某些方面。
访问flowfile属性时执行处理。永远不会读取flowfile内容,并在添加一些属性后返回输出流文件。以下是处理器代码相关部分的片段:
@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
// Will hold all the processed attributes
Map<String, String> processedAttributes = new HashMap<>();
FlowFile flowfile = session.get();
...
// Adds the attributes to the flowfile
flowfile = session.putAllAttributes(flowfile, processedAttributes);
session.transfer(flowfile, PROCESSED);
}
我在m4.4xlarge亚马逊ec2实例上运行NiFi 0.7。由于我正在寻求高性能(谁没有)我正在寻找一种增加线程数量的安全方法。任何建议都非常感谢。
提前谢谢。
答案 0 :(得分:3)
有可能(特别是对于多个线程/并发任务)session.get()方法将为某些线程返回null。如果调度了两个或多个线程,因为有可用的流文件,则会发生这种情况,然后一个线程获取流文件(通过session.get()),下一个线程将获得null。
在您的情况下,您可能无法读取或写入流文件,但其他方法(如session.putAllAttributes())会调用流文件上的方法。许多处理器添加一个检查以查看flowfile == null并将返回(因为它需要一个流文件来操作),这可能也会解决您的问题。