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