需求

创建一个nifi处理器,根据自己的业务需求编写处理器的功能,集成到nifi中,进行数据的处理。

网上有很多相关的资料可供参考,但是大家都懂得,跟着网上的做总是会出现这样那样的问题,不是网上讲的不对,而是可能不够全,或者自己的情况与其并不相同,在经过半天的研究之后,终于搞定了这个问题,现将过程记录下来,以备查阅,大家有需要的也可以看看,但是不保证能解决你的问题。

步骤

1.安装好各种环境(maven,jdk之类的)

本人的机器无外网,之前已经成功编译过nifi,因此编译nifi的一些必要的包已经在本地仓库中有了(怎么编译nifi可以看之前的记录)。

2.使用mvn archetype:generate命令创建nifi处理器模板工程。

如果机器环境有外网,那么直接使用mvn archetype:generate命令即可,如果机器环境无外网,则需要去有网络的环境,将nifi-processor-bundle-archetype和nifi-service-bundle-archetype的最新包下载下来放到本地仓库的对应位置,然后运行命令mvn archetype:crawl命令来扫描本地仓库,生成archetype-catalog.xml文件,然后使用mvn archetype:generate –DarchetypeCatalog=local命令来生成nifi处理器模板文件。

根据提示填写项目的信息,生成项目之后,在processor目录下的MyProcessor文件里修改代码,编写自己的代码,至于怎么写,网上很多资料讲的都很详细,这里就不讲了。

注意事项

当只需要读取处理器接收的文件流时,使用如下代码去获得文件流。

session.read(flowFile, new InputStreamCallback() {

         @Override

         public void process(final InputStream in) throws IOException {}

}

 

但是若需要处理完文件流,然后再传出时,则使用下面代码去获得输入流和输出流,否则可能会出现文件流大小不一致的情况。

flowFile = session.write(flowFile, new StreamCallback() {

   @Override

   public void process(final InputStream in, final OutputStream out) throws IOException {}

});

 

将数据流写入flowfile使用session.write功能,依照情况不同,使用不同的方法,实现不同的process。若是从流来到流去,则使用上面的方法;若从本地文件来到流去,则使用flowFile = session.importFrom(filePath, keepingSourceFile, flowFile);其中filePath为文件的路径,keepingSourceFile为是否保留原文件;若从数据库中来到流去,则使用下面方法,out为输出流,将从数据库中获取的数据放到out流中即可。其余的情况参考这三种情况。

flowFile = session.write(flowFile, new OutputStreamCallback() {

   @Override

   public void process(OutputStream out) throws IOException{}

});

 

问题

按照上述步骤进行操作时,可能会遇到缺依赖的或者缺文件的问题,比如如果用目前最新的1.6.0的processor模板进行创建的话,需要org.apache.apache的19pom来运行,还需要其他的一些文件等。所以建议最好在外网环境中进行一次成功操作,然后将maven下载下来的而本地仓库没有的文件拷贝回来,再在本地进行操作。