nifi調試方法


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運行,則可進行斷點調試。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM