Apache NiFi 入門指南

本指南使用於誰?

本指南適用於從未使用過,在NiFi中有限度接觸或僅完成特定任務的用戶。本指南不是詳盡的說明手冊或參考指南。“ 用戶指南”提供了大量信息,旨在提供更加詳盡的資源,並且作爲參考指南非常有用。相比之下,本指南旨在爲用戶提供所需的信息,以便了解如何使用NiFi,以便快速輕鬆地構建強大而靈活的數據流。

一些因爲本指南中的某些信息僅適用於初次使用的用戶,而其他信息可能適用於那些使用過NiFi的人,本指南分爲幾個不同的部分,其中一些可能對某些部分沒用讀者。隨意跳轉到最適合您的部分。

本指南確實希望用戶基本瞭解NiFi是什麼,並且沒有深入研究這個細節。可以在Overview文檔中找到此級別的信息 。

本指南中使用的術語

爲了談論NiFi,讀者應該熟悉一些關鍵術語。我們將在此高度解釋這些特定於NiFi的術語。

FlowFile:每條“用戶數據”(即用戶帶入NiFi進行處理和分發的數據)稱爲FlowFile。FlowFile由兩部分組成:屬性和內容。內容是用戶數據本身。屬性是與用戶數據關聯的 key-value 對。 

Processor:處理器是NiFi組件,負責創建,發送,接收,轉換,路由,拆分,合併和處理FlowFiles。它是NiFi用戶可用於構建其數據流的最重要的組件。

下載和安裝NiFi

NiFi可以從NiFi下載頁面下載。有兩種可用的打包選項:針對Linux定製的“tarball”和更適用於Windows用戶的zip文件。Mac OS X用戶也可以使用tarball或通過Homebrew安裝。

要通過Homebrew安裝,只需運行命令即可brew install nifi

對於未運行OS X或未安裝Homebrew的用戶,在下載您想要使用的NiFi版本後,只需將存檔解壓縮到您希望運行該應用程序的位置。

有關如何配置NiFi實例的信息(例如,配置安全性,數據存儲配置或運行NiFi的端口),請參閱“ 管理員指南”

啓動NiFi

一旦按照上述方式下載並安裝了NiFi,就可以使用適合您操作系統的機制啓動它。

對於Windows用戶

對於Windows用戶,請導航到安裝NiFi的文件夾。在此文件夾中有一個名爲bin的子文件夾。導航到此子文件夾,然後雙擊該run-nifi.bat文件。

這將啓動NiFi並讓它在前臺運行。要關閉NiFi,請選擇已啓動的窗口,並在按下C的同時按住Ctrl鍵。

適用於Linux / Mac OS X用戶

對於Linux和OS X用戶,使用終端窗口導航到安裝NiFi的目錄。要在前臺運行NiFi,請運行bin/nifi.sh run。這將使應用程序繼續運行,直到用戶按下Ctrl-C。那時,它將啓動應用程序的關閉。

要在後臺運行NiFi,請運行bin/nifi.sh start。這將啓動應用程序以開始運行。要檢查狀態並查看NiFi當前是否正在運行,請執行該命令bin/nifi.sh status。可以通過執行命令關閉NiFi bin/nifi.sh stop

作爲服務安裝

目前,僅支持Linux和Mac OS X用戶安裝NiFi作爲服務。要將應用程序作爲服務安裝,請導航到“終端”窗口中的安裝目錄,然後執行命令bin/nifi.sh install 以使用默認名稱安裝服務nifi。要爲服務指定自定義名稱,請使用可選的第二個參數(該服務的名稱)執行該命令。例如,要將NiFi作爲具有名稱的服務安裝dataflow,請使用該命令bin/nifi.sh install dataflow

安裝後,可以使用適當的命令啓動和停止服務,例如sudo service nifi start 和sudo service nifi stop。此外,可以通過檢查運行狀態sudo service nifi status

我開始使用NiFi。怎麼辦?

現在NiFi已經啓動,我們可以調出用戶界面(UI)來創建和監控我們的數據流。要開始使用,請打開Web瀏覽器並導航到http://localhost:8080/nifi。可以通過編輯nifi.propertiesNiFi conf目錄中的文件來更改端口,但默認端口爲8080。

這將打開用戶界面,此時這是一個用於編排數據流的空白畫布:

 

 

用戶界面有多種工具可用於創建和管理您的第一個數據流:

全局菜單包含以下選項:

添加處理器

我們現在可以通過在畫布中添加Processor來開始創建數據流。要執行此操作,請將處理器圖標(處理器)從屏幕左上方拖動到畫布中間(圖紙類背景)並將其放在那裏。這將爲我們提供一個對話框,允許我們選擇要添加的處理器:

我們有很多選擇可供選擇。爲了成爲系統的導向,假設我們只想將本地磁盤中的文件導入NiFi。當開發人員創建處理器時,開發人員可以爲該處理器分配“標籤”。這些可以被認爲是關鍵字。我們可以通過在對話框右上角的“過濾器”框中鍵入來按這些標記或處理器名稱進行過濾。想要從本地磁盤中提取文件時,請鍵入您想到的關鍵字。例如,鍵入關鍵字“file”將爲我們提供一些處理文件的不同處理器。按“本地”一詞過濾也會很快縮小列表範圍。如果我們從列表中選擇處理器,我們將在對話框底部附近看到處理器的簡要說明。這應該告訴我們處理器的確切功能。GetFile Processor 的描述 告訴我們它將數據從我們的本地磁盤拉入NiFi,然後刪除本地文件。然後我們可以雙擊處理器類型或選擇它並選擇 Add按鈕。處理器將被添加到畫布中刪除它的位置。

 

配置處理器

現在我們已經添加了GetFile處理器,我們可以通過右鍵單擊Processor並選擇Configure菜單項來配置它。提供的對話框允許我們配置許多可在“ 用戶指南”中閱讀的不同選項,但爲了本指南,我們將重點關注“屬性”選項卡。選擇Properties選項卡後,我們將獲得一個可以爲Processor配置的幾個不同屬性的列表。可用的屬性取決於處理器的類型,並且每種類型通常都不同。粗體屬性是必需屬性。在配置完所有必需屬性之前,無法啓動處理器。爲GetFile配置的最重要的屬性是從中獲取文件的目錄。如果我們將目錄名設置爲./data-in,這將導致處理器開始拾取中的任何數據 data-in NiFi主目錄的子目錄。我們可以選擇爲此處理器配置多個不同的屬性。如果不確定特定屬性的作用,我們可以將鼠標懸停在救命 屬性名稱旁邊的幫助圖標( )上,以便閱讀該屬性的描述。此外,將鼠標懸停在“幫助”圖標上時顯示的工具提示將提供該屬性的默認值(如果存在),有關該屬性是否支持表達式語言的信息(請參閱下面的“ 屬性值”部分中的“ 表達式語言/使用屬性”)),以及之前爲該屬性配置的值。

data-in要使此屬性有效,請創建在NiFi主目錄中命名的目錄,然後單擊Ok按鈕以關閉對話框。

連接處理器

每個處理器都有一組定義的“Relationships”,它能夠將數據發送到。處理器完成FlowFile的處理後,會將其傳輸到其中一個關係。這允許用戶根據Processing的結果配置如何處理FlowFiles。例如,許多處理器定義了兩個關係:successfailure。然後,如果處理器能夠成功處理數據並且如果處理器由於某種原因無法處理數據而以完全不同的方式將數據路由通過流,則用戶能夠配置要通過流單向路由的數據。或者,根據用例,它可以簡單地將兩個關係路由到流中的相同路由。

現在我們已經添加並配置了我們的GetFile處理器並應用了配置,我們可以在處理器的左上角看到一個警告圖標( 警報 ),表示處理器未處於有效狀態。將鼠標懸停在此圖標上,我們可以看到該success 關係尚未定義。這只是意味着我們沒有告訴NiFi如何處理處理器轉移到success關係的數據。

爲了解決這個問題,讓我們按照上面的相同步驟添加另一個可以連接GetFile處理器的處理器。但是,這一次,我們只需記錄FlowFile存在的屬性。爲此,我們將添加一個LogAttributes處理器。

我們現在可以將GetFile處理器的輸出發送到LogAttribute Processor。用鼠標懸停在GetFile處理器上,連接圖標( 連接 )將出現在處理器的中間。我們可以將此圖標從GetFile處理器拖到LogAttribute處理器。這爲我們提供了一個對話框,用於選擇我們要爲此連接包含哪些關係。由於GetFile只有一個關係success,因此會自動爲我們選擇。

單擊“設置”選項卡提供了一些用於配置此連接的行爲方式的選項:

如果我們願意,我們可以給Connection一個名字。否則,連接名稱將基於所選的關係。我們還可以設置數據的到期時間。默認情況下,它設置爲“0秒”,表示數據不應過期。但是,我們可以更改該值,以便當此Connection中的數據達到特定年齡時,它將自動刪除(並且將創建相應的EXPIRE Provenance事件)。

背壓閾值允許我們指定在不再安排源處理器運行之前允許隊列的完整程度。這使我們能夠處理一個處理器能夠比下一個處理器能夠消耗該數據更快地生成數據的情況。如果在整個過程中爲每個連接配置了背壓,則將數據引入系統的處理器最終將經歷背壓並停止引入新數據,以便我們的系統能夠恢復。

最後,我們在右側有優先順序。這允許我們控制如何排序此隊列中的數據。我們可以將優先級從“可用的優先級排序器”列表拖到“選定的優先級排序器”列表中,以激活優先級排序器。如果激活了多個優先級排序器,則將對它們進行評估,以便首先評估首先列出的優先級排序器,如果根據該優先級排序器確定兩個FlowFiles相等,則將使用第二個優先級排序器。

爲了便於討論,我們只需單擊Add即可將Connection添加到圖表中。我們現在應該看到Alert圖標已更改爲Stopped圖標( 停止 )。但是,LogAttribute Processor現在無效,因爲它的success關係尚未連接到任何東西。讓我們通過發信號通知success由LogAttribute 路由到的數據應該是“自動終止” 來解決這個問題,這意味着NiFi應該考慮FlowFile的處理完成並“丟棄”數據。爲此,我們配置LogAttribute Processor。在“設置”選項卡的右側,我們可以選中“ success自動終止關係數據”旁邊的框。單擊OK將關閉對話框並顯示兩個處理器現已停止。

啓動和停止處理器

此時,我們的圖表上有兩個處理器,但沒有發生任何事情。爲了啓動處理器,我們可以單獨單擊每個處理器,然後右鍵單擊並選擇Start菜單項。或者,我們可以選擇第一個處理器,然後在選擇其他處理器的同時按住Shift鍵以選擇兩者。然後,我們可以右鍵單擊並選擇Start菜單項。作爲使用上下文菜單的替代方法,我們可以選擇處理器,然後單擊“操作”調板中的“開始”圖標。

啓動後,處理器左上角的圖標將從停止的圖標更改爲正在運行的圖標。然後,我們可以使用“操作”調板或Stop菜單項中的“停止”圖標來停止處理器。

處理器啓動後,我們無法再配置它。相反,當我們右鍵單擊處理器時,我們可以選擇查看其當前配置。爲了配置處理器,我們必須首先停止處理器並等待可能正在執行的任何任務完成。當前正在執行的任務數顯示在處理器的右上角附近,但如果當前沒有任務,則不會顯示任何內容。

獲取處理器的更多信息

由於每個處理器都能夠公開多個不同的屬性和關係,因此記住每個處理器的所有不同部分的工作原理可能很困難。要解決此問題,您可以右鍵單擊處理器並選擇Usage菜單項。這將爲您提供處理器的使用信息,例如處理器的描述,可用的不同關係,何時使用不同的關係,處理器及其文檔公開的屬性,以及哪些FlowFile屬性(在傳入的FlowFiles上有預期的,以及哪些屬性(如果有的話)被添加到傳出的FlowFiles中。

其他組件

用戶可以將處理器拖放到圖表上的工具欄包括可用於構建數據流的其他幾個組件。這些組件包括輸入和輸出端口,漏斗,進程組和遠程進程組。由於本文檔的預期範圍,我們不會在此討論這些元素,但可以在“ 用戶指南”的“ 構建數據流”部分中找到相關信息 。

什麼處理器可用

爲了創建有效的數據流,用戶必須瞭解可用的處理器類型。NiFi包含許多不同的處理器。這些處理器提供了從衆多不同系統中提取數據,路由,轉換,處理,拆分和聚合數據以及將數據分發到多個系統的功能。

幾乎每個NiFi版本中可用的處理器數量都在增加。因此,我們不會嘗試命名每個可用的處理器,但我們將重點介紹一些最常用的處理器,按功能對它們進行分類。

數據轉換

  • CompressContent:壓縮或解壓縮內容

  • ConvertCharacterSet:將用於編碼內容的字符集從一個字符集轉換爲另一個字符集

  • EncryptContent:加密或解密內容

  • ReplaceText:使用正則表達式修改文本內容

  • TransformXml:將XSLT轉換應用於XML內容

  • JoltTransformJSON:應用JOLT規範來轉換JSON內容

路由和調解

  • ControlRate:限制數據流經流量的一部分的速率

  • DetectDuplicate:根據一些用戶定義的標準監視重複的FlowFiles。通常與HashContent一起使用

  • DistributeLoad:通過僅將一部分數據分發到每個用戶定義的關係來加載平衡或樣本數據

  • MonitorActivity:當用戶定義的時間段過去時發送通知,而沒有任何數據通過流中的特定點。(可選)在數據流恢復時發送通知。

  • RouteOnAttribute:根據FlowFile包含的屬性路由FlowFile。

  • ScanAttribute:掃描FlowFile上用戶定義的屬性集,檢查是否有任何屬性與用戶定義的字典中找到的術語匹配。

  • RouteOnContent:搜索FlowFile的內容,以查看它是否與任何用戶定義的正則表達式匹配。如果是,則FlowFile將路由到已配置的關係。

  • ScanContent:搜索FlowFile的內容,以查找用戶定義的字典中存在的術語,並根據這些術語的存在與否進行路由。字典可以包含文本條目或二進制條目。

  • ValidateXml:針對XML模式驗證XML內容; 根據用戶定義的XML Schema,FlowFile的內容是否有效,路由FlowFile。

數據庫訪問

  • ConvertJSONToSQL:將JSON文檔轉換爲SQL INSERT或UPDATE命令,然後可以將其傳遞給PutSQL Processor

  • ExecuteSQL:執行用戶定義的SQL SELECT命令,將結果寫入Avro格式的FlowFile

  • PutSQL:通過執行FlowFile內容定義的SQL DDM語句來更新數據庫

  • SelectHiveQL:對Apache Hive數據庫執行用戶定義的HiveQL SELECT命令,將結果寫入Avro或CSV格式的FlowFile

  • PutHiveQL:通過執行FlowFile內容定義的HiveQL DDM語句來更新Hive數據庫

屬性提取

  • EvaluateJsonPath:用戶提供JSONPath表達式(類似於XPath,用於XML解析/提取),然後根據JSON內容評估這些表達式,以替換FlowFile內容或將值提取到用戶命名的Attribute中。

  • EvaluateXPath:用戶提供XPath表達式,然後根據XML內容評估這些表達式,以替換FlowFile內容或將值提取到用戶命名的Attribute中。

  • EvaluateXQuery:用戶提供XQuery查詢,然後根據XML內容評估此查詢,以替換FlowFile內容或將值提取到用戶命名的Attribute中。

  • ExtractText:用戶提供一個或多個正則表達式,然後根據FlowFile的文本內容對其進行評估,然後將提取的值添加爲用戶命名的屬性。

  • HashAttribute:對用戶定義的現有屬性列表的串聯執行散列函數。

  • HashContent:對FlowFile的內容執行散列函數,並將散列值添加爲Attribute。

  • IdentifyMimeType:評估FlowFile的內容,以確定FlowFile封裝的文件類型。此處理器能夠檢測許多不同的MIME類型,例如圖像,文字處理器文檔,文本和壓縮格式,僅舉幾例。

  • UpdateAttribute:向FlowFile添加或更新任意數量的用戶定義屬性。這對於添加靜態配置的值以及使用表達式語言動態地派生屬性值非常有用。該處理器還提供“高級用戶界面”,允許用戶根據用戶提供的規則有條件地更新屬性。

系統交互

  • ExecuteProcess:運行用戶定義的操作系統命令。進程的StdOut被重定向,以便寫入StdOut的內容成爲出站FlowFile的內容。此處理器是源處理器 - 其輸出預計會生成新的FlowFile,並且系統調用預計不會接收任何輸入。要爲進程提供輸入,請使用ExecuteStreamCommand Processor。

  • ExecuteStreamCommand:運行用戶定義的操作系統命令。FlowFile的內容可選地流式傳輸到進程的StdIn。寫入StdOut的內容將成爲hte出站FlowFile的內容。此處理器不能用作源處理器 - 必須輸入傳入的FlowFiles才能執行其工作。要使用源處理器執行相同類型的功能,請參閱ExecuteProcess Processor。

數據攝取

  • GetFile:將文件內容從本地磁盤(或網絡連接的磁盤)流式傳輸到NiFi,然後刪除原始文件。此處理器應將文件從一個位置移動到另一個位置,而不是用於複製數據。

  • GetFTP:通過FTP將遠程文件的內容下載到NiFi中,然後刪除原始文件。期望此處理器將數據從一個位置移動到另一個位置,而不是用於複製數據。

  • GetSFTP:通過SFTP將遠程文件的內容下載到NiFi中,然後刪除原始文件。期望此處理器將數據從一個位置移動到另一個位置,而不是用於複製數據。

  • GetJMSQueue:從JMS隊列下載消息,並根據JMS消息的內容創建FlowFile。可選地,JMS屬性也可以作爲屬性複製。

  • GetJMSTopic:從JMS主題下載消息,並根據JMS消息的內容創建FlowFile。可選地,JMS屬性也可以作爲屬性複製。此處理器支持持久訂閱和非持久訂閱。

  • GetHTTP:將基於HTTP或HTTPS的遠程URL的內容下載到NiFi中。處理器將記住ETag和Last-Modified Date,以確保不會持續攝取數據。

  • ListenHTTP:啓動HTTP(或HTTPS)服務器並偵聽傳入連接。對於任何傳入的POST請求,請求的內容將作爲FlowFile寫出,並返回200響應。

  • ListenUDP:偵聽傳入的UDP數據包,併爲每個數據包或每個數據包創建一個FlowFile(取決於配置),並將FlowFile發送到“成功”關係。

  • GetHDFS:監視HDFS中用戶指定的目錄。每當新文件進入HDFS時,它將被複制到NiFi並從HDFS中刪除。此處理器應將文件從一個位置移動到另一個位置,而不是用於複製數據。如果在羣集中運行,預計此處理器也僅在主節點上運行。要從HDFS複製數據並使其保持原狀,或者從羣集中的多個節點流式傳輸數據,請參閱ListHDFS處理器。

  • ListHDFS / FetchHDFS:ListHDFS監視HDFS中用戶指定的目錄,併發出一個FlowFile,其中包含它遇到的每個文件的文件名。然後,它通過分佈式緩存在整個NiFi集羣中保持此狀態。然後可以在羣集中扇出這些FlowFile並將其發送到FetchHDFS處理器,後者負責獲取這些文件的實際內容併發出包含從HDFS獲取的內容的FlowFiles。

  • FetchS3Object:從Amazon Web Services(AWS)簡單存儲服務(S3)獲取對象的內容。出站FlowFile包含從S3接收的內容。

  • GetKafka:從Apache Kafka獲取消息,特別是0.8.x版本。消息可以作爲每個消息的FlowFile發出,也可以使用用戶指定的分隔符一起批處理。

  • GetMongo:對MongoDB執行用戶指定的查詢,並將內容寫入新的FlowFile。

  • GetTwitter:允許用戶註冊過濾器以收聽Twitter“花園軟管”或企業端點,爲收到的每條推文創建一個FlowFile。

數據出口/發送數據

  • PutEmail:向配置的收件人發送電子郵件。FlowFile的內容可選擇作爲附件發送。

  • PutFile:將FlowFile的內容寫入本地(或網絡連接)文件系統上的目錄。

  • PutFTP:將FlowFile的內容複製到遠程FTP服務器。

  • PutSFTP:將FlowFile的內容複製到遠程SFTP服務器。

  • PutJMS:將FlowFile的內容作爲JMS消息發送到JMS代理,可選擇根據Attributes添加JMS屬性。

  • PutSQL:將FlowFile的內容作爲SQL DDL語句(INSERT,UPDATE或DELETE)執行。FlowFile的內容必須是有效的SQL語句。屬性可以用作參數,以便FlowFile的內容可以是參數化的SQL語句,以避免SQL注入攻擊。

  • PutKafka:將FlowFile的內容作爲消息發送到Apache Kafka,特別是0.8.x版本。FlowFile可以作爲單個消息或分隔符發送,例如可以指定換行符,以便爲單個FlowFile發送許多消息。

  • PutMongo:將FlowFile的內容作爲INSERT或UPDATE發送到Mongo。

分裂和聚合

  • SplitText:SplitText接收單個FlowFile,其內容爲文本,並根據配置的行數將其拆分爲1個或多個FlowFiles。例如,可以將處理器配置爲將FlowFile拆分爲多個FlowFile,每個FlowFile只有一行。

  • SplitJson:允許用戶將包含數組或許多子對象的JSON對象拆分爲每個JSON元素的FlowFile。

  • SplitXml:允許用戶將XML消息拆分爲多個FlowFiles,每個FlowFiles包含原始段。這通常在多個XML元素與“wrapper”元素連接在一起時使用。然後,此處理器允許將這些元素拆分爲單獨的XML元素。

  • UnpackContent:解壓縮不同類型的存檔格式,例如ZIP和TAR。然後,歸檔中的每個文件都作爲單個FlowFile傳輸。

  • MergeContent:此處理器負責將許多FlowFiles合併到一個FlowFile中。可以通過將其內容與可選的頁眉,頁腳和分界符連接在一起,或者通過指定存檔格式(如ZIP或TAR)來合併FlowFiles。FlowFiles可以根據公共屬性進行分箱,或者如果它們被其他拆分過程拆分,則可以進行“碎片整理”。根據元素的數量或FlowFiles內容的總大小,每個bin的最小和最大大小是用戶指定的,並且還可以分配可選的Timeout,以便FlowFiles只等待其bin變爲滿多少時間。

  • SegmentContent:根據某些已配置的數據大小將FlowFile劃分爲可能的許多較小的FlowFile。不對任何類型的分界符執行拆分,而是僅基於字節偏移執行拆分。這是在傳輸FlowFiles之前使用的,以便通過並行發送許多不同的部分來提供更低的延遲。另一方面,MergeContent處理器可以使用碎片整理模式重新組裝這些FlowFiles。

  • SplitContent:將單個FlowFile拆分爲可能的許多FlowFile,類似於SegmentContent。但是,對於SplitContent,不會在任意字節邊界上執行拆分,而是指定要拆分內容的字節序列。

HTTP

  • GetHTTP:將基於HTTP或HTTPS的遠程URL的內容下載到NiFi中。處理器將記住ETag和Last-Modified Date,以確保不會持續攝取數據。

  • ListenHTTP:啓動HTTP(或HTTPS)服務器並偵聽傳入連接。對於任何傳入的POST請求,請求的內容將作爲FlowFile寫出,並返回200響應。

  • InvokeHTTP:執行用戶配置的HTTP請求。此處理器比GetHTTP和PostHTTP更通用,但需要更多配置。此處理器不能用作源處理器,並且需要具有傳入的FlowFiles才能被觸發以執行其任務。

  • PostHTTP:執行HTTP POST請求,將FlowFile的內容作爲消息正文發送。這通常與ListenHTTP結合使用,以便在無法使用站點到站點的情況下在兩個不同的NiFi實例之間傳輸數據(例如,當節點無法直接訪問並且能夠通過HTTP進行通信時代理)。 注意:除了現有的RAW套接字傳輸之外,HTTP還可用作站點到站點傳輸協議。它還支持HTTP代理。建議使用HTTP站點到站點,因爲它更具可擴展性,並且可以使用具有更好用戶身份驗證和授權的輸入/輸出端口提供雙向數據傳輸。

  • HandleHttpRequest / HandleHttpResponse:HandleHttpRequest Processor是一個源處理器,與ListenHTTP類似,啓動嵌入式HTTP(S)服務器。但是,它不會向客戶端發送響應。相反,FlowFile與HTTP請求的主體一起作爲其內容和屬性發送,作爲屬性的所有典型Servlet參數,標題等。然後,HandleHttpResponse能夠在FlowFile完成處理後將響應發送回客戶端。這些處理器總是希望彼此結合使用,並允許用戶在NiFi中可視化地創建Web服務。這對於將前端添加到非基於Web的協議或圍繞已經由NiFi執行的某些功能(例如數據格式轉換)添加簡單的Web服務特別有用。

亞馬遜網絡服務

  • FetchS3Object:獲取存儲在Amazon Simple Storage Service中的對象的內容(S3)。然後,從S3檢索的內容將寫入FlowFile的內容。

  • PutS3Object:使用配置的憑據,密鑰和存儲桶名稱將FlowFile的內容寫入Amazon S3對象。

  • PutSNS:將FlowFile的內容作爲通知發送到Amazon Simple Notification Service(SNS)。

  • GetSQS:從Amazon Simple Queuing Service(SQS)中提取消息,並將消息內容寫入FlowFile的內容。

  • PutSQS:將FlowFile的內容作爲消息發送到Amazon Simple Queuing Service(SQS)。

  • DeleteSQS:從Amazon Simple Queuing Service(SQS)中刪除消息。這可以與GetSQS一起使用,以便從SQS接收消息,對其執行一些處理,然後僅在成功完成處理後才從隊列中刪除該對象。

使用屬性

每個FlowFile都使用多個屬性創建,這些屬性將在FlowFile的生命週期中發生變化。FlowFile的概念非常強大,並提供三個主要優點。首先,它允許用戶在流中做出路由決策,以便滿足某些條件的FlowFiles可以與其他FlowFiles不同地進行處理。這是使用RouteOnAttribute和類似的處理器完成的。

其次,使用屬性以便以這樣的方式配置處理器:處理器的配置依賴於數據本身。例如,PutFile Processor能夠使用Attributes來知道每個FlowFile的存儲位置,而每個FlowFile的目錄和文件名屬性可能不同。

最後,屬性提供了有關數據的極有價值的上下文。在查看FlowFile的Provenance數據時,這非常有用。這允許用戶搜索符合特定條件的Provenance數據,並且還允許用戶在檢查Provenance事件的詳細信息時查看此上下文。通過這樣做,用戶然後能夠獲得關於爲什麼以這樣或那樣的方式處理數據的有價值的見解,簡單地通過瀏覽與內容一起攜帶的該上下文。

共同屬性

每個FlowFile都有一組最小的屬性:

  • filename:可用於將數據存儲到本地或遠程文件系統的文件名。

  • path:可用於將數據存儲到本地或遠程文件系統的目錄的名稱。

  • uuid:一個通用唯一標識符,用於區分FlowFile與系統中的其他FlowFiles。

  • entryDate:FlowFile進入系統的日期和時間(即已創建)。此屬性的值是一個數字,表示自1970年1月1日午夜(UTC)以來的毫秒數。

  • lineageStartDate:任何時候克隆,合併或拆分FlowFile,都會導致創建“子”FlowFile。隨着這些孩子被克隆,合併或拆分,建立了一系列祖先。該值表示最早的祖先進入系統的日期和時間。另一種思考方式是,此屬性表示FlowFile通過系統的延遲。該值是一個數字,表示自1970年1月1日午夜(UTC)以來的毫秒數。

  • fileSize:此屬性表示FlowFile內容佔用的字節數。

需要注意的是uuidentryDatelineageStartDate,和fileSize屬性是系統生成的,不能改變。

提取屬性

NiFi提供了幾種不同的處理器,用於從FlowFiles中提取屬性。可以在上面的“ 屬性提取”部分中找到用於此目的的常用處理器列表。這是構建自定義處理器的一個非常常見的用例。編寫許多處理器是爲了理解特定的數據格式,並從FlowFile的內容中提取相關信息,創建屬性來保存該信息,以便可以決定如何路由或處理數據。

添加用戶定義的屬性

除了能夠將特定信息片段從FlowFile內容提取到屬性中的處理器之外,用戶還希望將自己的用戶定義屬性添加到流中特定位置的每個FlowFile。UpdateAttribute Processor專爲此目的而設計。用戶可以通過單擊“屬性”選項卡右上角的“+”按鈕,在“配置”對話框中向處理器添加新屬性。然後提示用戶輸入屬性的名稱,然後輸入值。對於此UpdateAttribute Processor處理的每個FlowFile,將爲每個用戶定義的屬性添加一個Attribute。Attribute的名稱將與添加的屬性的名稱相同。

屬性的值也可以包含表達式語言。這允許基於其他屬性修改或添加屬性。例如,如果我們想要將處理文件的主機名和日期添加到文件名之前,我們可以通過添加名稱filename和值的屬性來實現${hostname()}-${now():format('yyyy-dd-MM')}-${filename}。雖然這一開始可能會讓人感到困惑,但下面關於表達式語言/使用屬性值中的屬性的部分將有助於清理這裏發生的事情。

除了始終添加一組已定義的屬性外,UpdateAttribute Processor還具有一個高級UI,允許用戶配置一組規則,以便在何時添加屬性。要訪問此功能,請在“配置”對話框的“屬性”選項卡中,單擊Advanced對話框底部的按鈕。這將提供專門爲此處理器定製的UI,而不是爲所有處理器提供的簡單屬性表。在此UI中,用戶可以配置規則引擎,實質上是指定必須匹配的規則,以便將已配置的屬性添加到FlowFile。

屬性路由

NiFi最強大的功能之一是能夠根據屬性路由FlowFiles。執行此操作的主要機制是RouteOnAttribute Processor。此處理器與UpdateAttribute一樣,通過添加用戶定義的屬性進行配置。通過單擊處理器的“配置”對話框中“屬性”選項卡右上角的“+”按鈕,可以添加任意數量的屬性。

每個FlowFile的屬性將與配置的屬性進行比較,以確定FlowFile是否滿足指定的條件。每個屬性的值應該是一個表達式語言表達式並返回一個布爾值。有關表達式語言的更多信息,請參閱下面的“ 屬性值中表達式語言/使用屬性”部分。

在評估針對FlowFile的屬性提供的表達式語言表達式之後,處理器根據所選的路由策略確定如何路由FlowFile。最常見的策略是“物業名稱路徑”策略。選擇此策略後,處理器將爲配置的每個屬性公開關係。如果FlowFile的屬性滿足給定的表達式,則FlowFile的副本將路由到相應的Relationship。例如,如果我們有一個名爲“begin-with-r”的新屬性和值“$ {filename:startsWith(\'r')}”,那麼任何文件名以字母'r'開頭的FlowFile將是路由到那個關係。所有其他FlowFiles將被路由到“無與倫比”。

表達式語言/在屬性值中使用屬性

當我們從FlowFiles的內容中提取屬性並添加用戶定義的屬性時,除非我們有一些可以使用它們的機制,否則它們不會作爲運算符做得很好。NiFi表達式語言允許我們在配置流時訪問和操作FlowFile屬性值。並非所有處理器屬性都允許使用表達式語言,但很多都可以。爲了確定屬性是否支持表達式語言,用戶可以將鼠標懸停在救命 “處理器配置”對話框的“屬性”選項卡中的“幫助”圖標上 。這將提供一個工具提示,顯示屬性的描述,默認值(如果有)以及屬性是否支持表達式語言。

對於支持表達式語言的屬性,可以通過在開始${標記和結束 }標記中添加表達式來使用它。表達式可以像屬性名一樣簡單。例如,要引用uuidAttribute,我們可以簡單地使用該值${uuid}。如果屬性名稱以字母以外的任何字符開頭,或者包含除數字,字母,句點(。)或下劃線(_)以外的字符,則需要引用屬性名稱。例如,${My Attribute Name} 將無效,但${'My Attribute Name'}將引用屬性My Attribute Name

除了引用屬性值之外,我們還可以對這些屬性執行許多功能和比較。例如,如果我們想檢查filename屬性是否包含字母'r'而不注意大小寫(大寫或小寫),我們可以使用表達式來完成${filename:toLower():contains('r')}。請注意,函數由冒號分隔。我們可以將任意數量的函數鏈接在一起以構建更復雜的表達式。同樣重要的是要明白,即使我們正在調用filename:toLower(),這也不會改變filename屬性的價值,而只是給我們一個新的價值。

我們也可以在另一箇中嵌入一個表達式。例如,如果我們想要將attr1Attribute 的值與Attribute的值進行比較attr2,我們可以使用以下表達式來執行此操作:${attr1:equals( ${attr2} )}

表達式語言包含許多不同的函數,可用於執行路由和操作屬性所需的任務。存在用於解析和操作字符串,比較字符串和數值,操縱和替換值以及比較值的函數。對可用的不同功能的完整解釋超出了本文檔的範圍,但“ 表達式語言指南”爲每個功能提供了更多詳細信息。

此外,此表達式語言指南內置於應用程序中,以便用戶可以輕鬆查看哪些功能可用,並在鍵入時查看其文檔。設置支持表達式語言的屬性的值時,如果光標位於表達式語言的開始和結束標記內,則在關鍵字上按Ctrl + Space將彈出所有可用的函數,並將提供自動 - 完整的功能。單擊或使用鍵盤導航到彈出窗口中列出的某個功能將導致顯示工具提示,這解釋了該功能的作用,它所期望的參數以及函數的返回類型。

表達式語言中的自定義屬性

除了使用FlowFile屬性外,您還可以定義表達式語言使用的自定義屬性。定義自定義屬性爲處理和配置數據流提供了額外的靈活性。例如,您可以引用連接,服務器和服務屬性的自定義屬性。創建自定義屬性後,您可以nifi.variable.registry.properties在“nifi.properties”文件中的字段中標識它們的位置。更新'nifi.properties'文件並重新啓動NiFi後,您可以根據需要使用自定義屬性。

使用模板

當我們使用處理器在NiFi中構建越來越複雜的數據流時,我們經常會發現我們將相同的處理器序列串在一起以執行某些任務。這可能變得乏味且低效。爲解決這個問題,NiFi提供了模板概念。模板可以被認爲是可重用的子流。要創建模板,請按照下列步驟操作:

  • 選擇要包含在模板中的組件。我們可以通過單擊第一個組件選擇多個組件,然後按住Shift鍵同時選擇其他組件(以包括這些組件之間的連接),或者在畫布上拖動所需組件周圍的框時按住Shift鍵。

  • 新模板圖標 從“操作”調板中選擇“創建模板圖標”( )。

  • 提供模板的名稱和可選的描述。

  • 單擊Create按鈕。

一旦我們創建了一個模板,我們就可以將它用作流程中的構建塊,就像處理器一樣。爲此,我們將單擊並將“模板”圖標(模板 )從“組件”工具欄拖動 到我們的畫布上。然後,我們可以選擇要添加到畫布的模板,然後單擊Add按鈕。

最後,我們可以使用“模板管理”對話框來管理模板。要訪問此對話框,請從全局菜單中選擇模板。從這裏,我們可以看到存在哪些模板並過濾模板以找到感興趣的模板。在表的右側是一個圖標,用於將模板導出或下載爲XML文件。然後可以將其提供給其他人,以便他們可以使用您的模板。

要將模板導入NiFi實例,請上傳模板 從“操作”選項板中選擇“上載模板”圖標( ),單擊“搜索”圖標並導航到計算機上的文件。然後單擊Upload按鈕。模板現在將顯示在您的表格中,您可以將其拖動到畫布上,就像您創建的任何其他模板一樣。

使用模板時需要記住一些重要注意事項:

  • 任何標識爲敏感屬性的屬性(例如在處理器中配置的密碼)都不會添加到模板中。每次將模板添加到畫布時,都必須填充這些敏感屬性。

  • 如果模板中包含的組件引用Controller Service,則Controller Service也將添加到模板中。這意味着每次將模板添加到圖表時,它都會創建Controller Service的副本。

監控NiFi

當數據在NiFi中流經您的數據流時,瞭解您的系統執行情況以評估您是否需要更多資源以及評估當前資源的運行狀況非常重要。NiFi提供了一些監控系統的機制。

狀態欄

在“組件”工具欄下的NiFi屏幕頂部附近有一個條形,稱爲狀態欄。它包含一些關於NiFi當前健康狀況的重要統計數據。活動線程的數量可以指示NiFi當前的工作狀態,排隊統計數據表示當前在整個流程中排隊的FlowFile數量以及這些FlowFiles的總大小。

如果NiFi實例位於羣集中,我們還會在此處看到一個指示器,告訴我們羣集中有多少節點以及當前連接的節點數。在這種情況下,活動線程的數量和隊列大小指示當前連接的所有節點的所有總和。

組件統計

畫布上的每個處理器,進程組和遠程進程組都提供了有關組件處理了多少數據的若干統計信息。這些統計信息提供有關在過去五分鐘內處理了多少數據的信息。這是一個滾動窗口,允許我們查看處理器消耗的FlowFiles數量,以及處理器發出的FlowFiles數量。

處理器之間的連接還會顯示當前排隊的項目數。

查看這些指標的歷史值以及(如果是羣集的)不同節點如何相互比較也可能很有價值。爲了查看此信息,我們可以右鍵單擊組件並選擇Stats菜單項。這將向我們展示一個圖表,該圖表涵蓋自NiFi啓動以來的時間,或最多24小時,以較少者爲準。通過更改屬性文件中的配置,可以擴展或減少此處顯示的時間量。

在此對話框的右上角有一個下拉列表,允許用戶選擇他們正在查看的指標。底部的圖表允許用戶選擇圖表的較小部分進行放大。

公告

除了每個組件提供的統計信息之外,用戶還想知道是否出現任何問題。雖然我們可以監視日誌中的任何有趣內容,但在屏幕上彈出通知會更方便。如果處理器將任何內容記錄爲WARNING或ERROR,我們將在處理器的右上角看到“Bulletin Indicator”。此指示器看起來像一個粘滯便箋,將在事件發生後顯示五分鐘。將鼠標懸停在公告上可提供有關所發生情況的信息,以便用戶無需篩選日誌消息即可查找。如果在羣集中,公告還將指示羣集中的哪個節點發布公告。我們還可以在處理器的“配置”對話框的“設置”選項卡中更改公告的日誌級別。

如果框架發佈公告,我們還會在屏幕右上方突出顯示公告指示符。在全局菜單中是公告板選項。單擊此選項將我們帶到公告板,在那裏我們可以看到NiFi實例中出現的所有公告,並可以根據組件,消息等進行過濾。

數據來源

NiFi對其攝取的每個數據保持非常精細的細節。當數據通過系統處理並被轉換,路由,拆分,聚合和分發到其他端點時,這些信息都存儲在NiFi的Provenance Repository中。爲了搜索和查看此信息,我們可以從全局菜單中選擇數據源。這將爲我們提供一個表格,列出我們搜索過的Provenance事件:

來源表

最初,此表填充了最近發生的1,000個Provenance事件(儘管事件發生後可能需要幾秒鐘才能處理信息)。在此對話框中,有一個Search按鈕,允許用戶搜索特定處理器發生的事件,按文件名或UUID或其他幾個字段搜索特定的FlowFile。該nifi.properties文件提供了配置這些屬性中的哪些屬性編入索引或可搜索的功能。此外,屬性文件還允許您選擇將被索引的特定FlowFile屬性。因此,您可以選擇哪些屬性對您的特定數據流很重要,並使這些屬性可搜索。

活動詳情

一旦我們執行了搜索,我們的表格將僅填充與搜索條件匹配的事件。從這裏,我們可以選擇細節圖標 表左側的Info圖標( )來查看該事件的詳細信息:

活動詳情

從這裏,我們可以確切地看到該事件發生的時間,事件影響的FlowFile,事件執行的組件(處理器等),事件花費的時間以及事件發生時NiFi數據的總體時間發生了(總潛伏期)。

下一個選項卡提供事件發生時FlowFile上存在的所有屬性的列表:

事件屬性

從這裏,我們可以看到事件發生時FlowFile上存在的所有屬性,以及這些屬性的先前值。這允許我們知道哪些屬性因此事件而發生變化以及它們如何變化。此外,在右側角是一個複選框,允許用戶僅查看那些已更改的屬性。如果FlowFile只有少數屬性,這可能不是特別有用,但當FlowFile有數百個屬性時,它可能非常有用。

這非常重要,因爲它允許用戶理解FlowFile處理的確切上下文。理解FlowFile的“原因”是有幫助的,特別是在使用表達式語言配置處理器時。

最後,我們有Content選項卡:

活動內容

此選項卡向我們提供有關存儲FlowFile內容的內容存儲庫位置的信息。如果事件修改了FlowFile的內容,我們將看到'之前'(輸入)和'之後'(輸出)內容聲明。如果數據格式是NiFi瞭解如何呈現的數據格式,我們可以選擇下載內容或查看NiFi內部的內容。

此外,在選項卡的重播部分,有一個“重播”按鈕,允許用戶將FlowFile重新插入到流中,並從事件發生的時間點重新處理它。這提供了一種非常強大的機制,因爲我們能夠實時修改流程,重新處理FlowFile,然後查看結果。如果它們不符合預期,我們可以再次修改流程,並再次重新處理FlowFile。我們能夠執行流程的迭代開發,直到它完全按照預期處理數據。

譜系圖

除了查看Provenance事件的詳細信息之外,我們還可以通過單擊血統 表視圖中的Lineage圖標()來查看所涉及的FlowFile的譜系。

這爲我們提供了一個圖形表示,說明了在遍歷系統時該數據發生了什麼:

譜系圖

從這裏,我們可以右鍵單擊任何表示的事件,然後單擊View Details菜單項以查看事件詳細信息。此圖形表示向我們準確顯示了數據發生的事件。有一些“特殊”事件類型需要注意。如果我們看到JOIN,FORK或CLONE事件,我們可以右鍵單擊並選擇Find Parents或Expand。這允許我們查看父FlowFiles和創建的子FlowFiles的譜系。

左下角的滑塊允許我們查看這些事件發生的時間。通過左右滑動,我們可以看到哪些事件將延遲引入系統,這樣我們就可以非常好地瞭解系統中可能需要提供更多資源的位置,例如處理器的併發任務數。或者它可能揭示,例如,大多數延遲是由JOIN事件引入的,我們在等待更多的FlowFiles連接在一起。在任何一種情況下,能夠輕鬆查看其發生的位置是一項非常強大的功能,可幫助用戶瞭解企業的​​運營方式。

哪裏有更多信息

NiFi社區已經建立了大量關於如何使用該軟件的文檔。除本入門指南外,還提供以下指南:

  • Apache NiFi概述 - 概述Apache NiFi是什麼,它做什麼,以及它的創建原因。

  • Apache NiFi用戶指南 - 一個相當廣泛的指南,經常被用作參考指南,因爲它對構成應用程序的所有不同組件進行了相當冗長的討論。本指南以NiFi運營商爲其受衆編寫。它提供有關NiFi中可用的每個不同組件的信息,並說明如何使用應用程序提供的不同功能。

  • 管理指南 - 爲生產環境設置和管理Apache NiFi的指南。本指南提供有關不同系統級設置的信息,例如設置NiFi羣集以及保護對Web UI和數據的訪問。

  • 表達語言指南 - 比上面提供的更爲詳盡的理解表達式語言的指南。本指南是NiFi表達語言的權威文檔。它提供了EL的介紹以及每個函數,其參數和返回類型的解釋以及提供示例。

  • 開發人員指南 - 雖然不是All Things NiFi Development的詳盡指南,但本指南提供了有關不同API的可用性以及如何使用它們的全面概述。此外,它還提供了開發NiFi組件和常用處理器習語的最佳實踐,以幫助理解許多現有NiFi組件背後的邏輯。

  • 貢獻者指南 - 解釋如何將工作貢獻回Apache NiFi社區以便其他人可以使用它的指南。

Apache NiFi博客網站上還添加了幾篇博客文章:https://blogs.apache.org/nifi/

除了此處提供的博客和指南,您還可以瀏覽不同的 NiFi郵件列表,或發送電子郵件至[email protected][email protected]之一的郵件列表 。

NiFi社區的許多成員也可以通過Twitter獲得,並積極監控提及@apachenifi的推文。



原文: http://nifi.apache.org/docs.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章