nifi在开发和使用时会有调试的需求,但是由于nifi是多子项目组成,调试不像普通工程一样方便,因此这里介绍一下nifi的几种调试方法。

nifi版本:1.11.4

Intellij IDEA版本:2020.3.1

一.本地IDEA实例调试

该方法为使用开发工具Intellij IDEA进行nifi整个工程的调试,可以达到在nifi界面配置流程运行,在idea代码中打断点进行调试的效果。

1.将nifi工程用idea打开,然后全局搜索NiFi.java文件,注释103行的bootstrapListener.start();和161行的bootstrapListener.sendStartedStatus(true);

 

 

2.有外网的情况下可以执行mvn clean install命令进行打包,如果无外网,或觉得打包耗时太长,可直接官网下载nifi编译好的安装包,解压后将bin、lib、conf、docs、extensions等目录拷贝到nifi项目的根目录下,

 

3.idea添加启动类,配置如下(具体路径部分改成各自工程具体位置)

其中Vm options配置如下:

-Xmx512m

-Xms512m

-Djavax.security.auth.useSubjectCredsOnly=true

-Djava.security.egd=file:/dev/urandom

-Dsun.net.http.allowRestrictedHeaders=true

-Djava.net.preferIPv4Stack=true

-Djava.awt.headless=true

-Djava.protocol.handler.pkgs=sun.net.www.protocol

-Dzookeeper.admin.enableServer=false

-Dnifi.properties.file.path=/data/projects/nifi/conf/nifi.properties

-Dnifi.bootstrap.listen.port=61884

-Dapp=NiFi

-Dorg.apache.nifi.bootstrap.config.log.dir=/data/projects/nifi/logs

 

 

 

4.将拷贝过来的conf和lib添加到nifi-runtime的依赖包里面

 

注意,当添加完这两个目录点击apply时,有时会出现Module must not contain source root…the root already be longs to module的错误提示,此时选择出错的module,然后将不属于他的root删除即可。

5.直接启动,访问http://localhost:8080/nifi即可访问nifi,当为debug运行时,在nifi界面上配置流程,则当代码运行到打断点的地方时即可进行debug调试。

 

nifi-1.11.4默认使用11进行编译,当开发环境的jdk为1.8时会报错,此时需要将nifi根目录下的pom.xml中的maven.compiler.source和maven.compiler.target改为8,然后Reimport即可。

 

二.IDEA调试远程实例

该方法为使用开发工具Intellij IDEA进行远程nifi实例调试,可以达到在远程nifi实例界面上配置流程运行,在idea代码中打断点进行调试的效果。

1.编辑远程nifi安装包conf目录下的bootstrap.conf文件,将第36行的Enable Remote Debugging下的配置项注释取消,打开该配置,address=8001的端口号自行配置。编辑完成后重启远程nifi实例。

 

2.将nifi工程用idea打开。然后点击Edit Configurations,点击+号,选择Remote JVM Debug.

 

3.根据具体情况进行配置,端口号与之前bootstrap.conf中配置的端口号相同。点击Logs选项,可以添加远程nifi实例运行日志映射。设置完成后点击保存。

 

4.选择刚才配置的Configuration,然后点击debug运行,此时在nifi远程实例上配置流程,当代码运行到断点处时即可进行断点调试。

 

三.IDEA调试处理器

该方法为使用开发工具Intellij IDEA进行nifi项目的处理器调试,调试代码如下所示,创建测试类,然后创建测试方法,主要使用TestRunner、nifi-mock和junit类进行处理器测试,常用方法如下代码所示,其余方法可查阅TestRunner类。

@Test

    public void testProcessor() throws FileNotFoundException {

        //创建调试类

        TestRunner runner = TestRunners.newTestRunner(ConvertAvroToTxt.class);

        InputStream in = new FileInputStream("/avro/737b589.avro");

        //设置处理器参数

        runner.setProperty(ConvertAvroToTxt.COLSPLIT, "\t");

        runner.setProperty(ConvertAvroToTxt.ROWSPLIT, "\n");

        //将flowfile放入队列

        runner.enqueue(in);

        //运行处理器

        runner.run();

        //判断队列是否空

        runner.assertQueueEmpty();

        //判断指定关系队列中flowfile的数量

        runner.assertAllFlowFilesTransferred(ConvertAvroToTxt.REL_SUCCESS, 1);

        //获取指定关系队列中的flowfile

        List<MockFlowFile> flowFiles = runner.getFlowFilesForRelationship(ConvertAvroToTxt.REL_SUCCESS);

        //获取指定flowfile的内容

        byte[] content = runner.getContentAsByteArray(flowFiles.get(0));

        System.out.println(new String(content));

    }

测试方法写完之后,在要调试的processor的代码中打断点,debug运行,则可进行断点调试。