nifi在开发和使用时会有调试的需求,但是由于nifi是多子项目组成,调试不像普通工程一样方便,因此这里介绍一下nifi的几种调试方法。
nifi版本:1.11.4
Intellij IDEA版本:2020.3.1
该方法为使用开发工具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即可。
该方法为使用开发工具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远程实例上配置流程,当代码运行到断点处时即可进行断点调试。
该方法为使用开发工具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运行,则可进行断点调试。
原文:https://www.cnblogs.com/it-abang/p/14370705.html