1、什么是Apache NiFi?
簡單地說,NiFi是為了自動化系統之間的數據流。雖然數據流這種形式很容易理解,但我們在此使用它來表示系統之間的自動化和不同系統之間數據的流轉。企業擁有多個系統,其中一些系統創建了數據,部分系統消耗了數據,那么問題就出現了。出現的問題和解決方案已經廣泛討論和闡述。nifi就是一個致力於數據對接的集成框架。
數據流面臨的一些比較高級的挑戰包括:
1、系統故障
網絡故障、硬盤故障、軟件宕機、人員操作失誤。
2、數據接入超出處理能力
有時候一個數據源的輸出可能超出,系統所能處理的能力。此外,有可能傳遞鏈出現問題,比如某一個弱連接處出現問題。
- 3、很少對邊界做出界定
- 你可能經常遇到數據量太大、太小、太快、太慢、損壞、錯誤、格式不對等問題。
- 4、系統的調整
- 系統地某一部分經常需要改動,需要快速的使用一個新的數據流,或者調整現有的一個流。
- 5、系統以不同的速度發展
- 給定系統使用的協議和格式可以隨時改變,而不管其周圍的系統如何。數據流存在的連接本質上是大量分散的組件系統,這些組件松散地或者不是全部設計在一起工作。
- 6、 合規性和安全性
- 法律法規和政策變化。企業對企業協議的變化。系統對系統和系統與用戶的交互必須是安全,可靠,負責任的。
- 7、生產中持續改善
- 實驗室通常不可能接近復制生產環境。
- 多年以來,數據流已經成為一種架構中必不可少的惡性循環之一。現在雖然有一些積極和快速發展的運動,使得數據流更有趣,對於給定企業的成功更為重要。這些包括像 面向服務的架構 SOA ,API的興起 ,物聯網 IOT ,和大數據 bigdata 。此外,合規性,隱私性和安全性所需的嚴謹程度不斷增加。即使仍然存在所有這些新概念,數據流的模式和需求仍然基本相同。主要的差異在於復雜性的范圍,適應需要的變化率,並且在規模上,邊緣情況變得普遍存在。NiFi旨在幫助解決這些現代數據流挑戰。
2、NiFi核心概念
Nifi 的設計理念接近於基於流的編程 Flow Based Programming [fbp]. 下面是nifi的一些核心概念,還有他和FBP的對於關系:
NiFi Term | FBP Term | Description |
---|---|---|
FlowFile |
Information Packet |
A FlowFile represents each object moving through the system and for each one, NiFi keeps track of a map of key/value pair attribute strings and its associated content of zero or more bytes. |
FlowFile Processor |
Black Box |
Processors actually perform the work. In [eip] terms a processor is doing some combination of data routing, transformation, or mediation between systems. Processors have access to attributes of a given FlowFile and its content stream. Processors can operate on zero or more FlowFiles in a given unit of work and either commit that work or rollback. |
Connection |
Bounded Buffer |
Connections provide the actual linkage between processors. These act as queues and allow various processes to interact at differing rates. These queues can be prioritized dynamically and can have upper bounds on load, which enable back pressure. |
Flow Controller |
Scheduler |
The Flow Controller maintains the knowledge of how processes connect and manages the threads and allocations thereof which all processes use. The Flow Controller acts as the broker facilitating the exchange of FlowFiles between processors. |
Process Group |
subnet |
A Process Group is a specific set of processes and their connections, which can receive data via input ports and send data out via output ports. In this manner, process groups allow creation of entirely new components simply by composition of other components. |
設計模型, 和seda也很相似,提供了許多優點,可以幫助NiFi成為構建強大而可擴展的數據流的非常有效的平台。其中一些好處包括:
-
適用於視覺創建和管理處理器的有向圖
-
本質上是異步的,即使在處理和流量波動時也允許非常高的吞吐量和自然緩沖
-
提供高度並發的模型,而開發人員不必擔心並發性的典型復雜性
-
促進發展粘性和松散耦合的部件,然后可以在其他情況下重復使用,並促進可測試的部件
-
資源受限的連接使關鍵功能(如背壓和壓力釋放)非常自然和直觀
-
錯誤處理變得與基本邏輯一樣自然,而不是粗粒度的一網打盡
-
數據進出系統的點以及流程如何被很好的理解和易於跟蹤
3、NiFi架構

NiFi在主機操作系統上的JVM內執行。JVM上的NiFi的主要組件如下:
- 網絡服務器
-
Web服務器的目的是托管NiFi的基於HTTP的命令和控制API。
- 流控制器
-
流控制器是操作的大腦。它提供用於擴展程序運行的線程,並管理擴展程序接收資源以執行的時間表。
- 擴展
-
有各種類型的NiFi擴展在其他文檔中描述。這里的關鍵是擴展在JVM中運行和執行。
- FlowFile存儲庫
-
FlowFile存儲庫是NiFi跟蹤目前在流程中活動的給定FlowFile的知識狀態。存儲庫的實現是可插拔的。默認方法是位於指定磁盤分區上的持久寫入前端日志。
- 內容存儲庫
-
Content Repository是給定FlowFile的實際內容字節。存儲庫的實現是可插拔的。默認方法是一個相當簡單的機制,它將數據塊存儲在文件系統中。可以指定多個文件系統存儲位置,以便獲得不同的物理分區,以減少任何單個卷上的爭用。
- 源頭存儲庫
-
Provenance Repository是存儲所有來源的事件數據的地方。存儲庫構造是可插入的,默認實現是使用一個或多個物理磁盤卷。在每個位置內,事件數據被索引和可搜索。
NiFi還能夠在集群內運行。

從NiFi 1.0版本開始,采用零主分類范例。NiFi集群中的每個節點對數據執行相同的任務,但是每個節點都在不同的數據集上進行操作。Apache ZooKeeper選擇單個節點作為群集協調器,故障轉移由ZooKeeper自動處理。所有群集節點向群集協調器報告心跳和狀態信息。集群協調器負責斷開連接節點。此外,每個群集都有一個主節點,也由ZooKeeper選擇。作為DataFlow管理器,您可以通過任何節點的用戶界面(UI)與NiFi集群進行交互。您所做的任何更改都會復制到群集中的所有節點,從而允許多個入口點。
4、NiFi的性能期望和特點
NiFi旨在充分利用其正在運行的底層主機系統的功能。對於CPU和磁盤,資源最大化特別強。有關其他詳細信息。
- 對於IO
-
可以看到的吞吐量或延遲可能會有很大的不同,這取決於系統的配置方式。考慮到大多數主要的NiFi子系統都有可插拔的方法,性能取決於實現。但是,對於具體和廣泛適用的內容,請考慮開箱即用的默認實現。這些都是持續的保證交付,並使用本地磁盤。因此,保守的,假設典型服務器中適度的磁盤或RAID卷上的讀/寫速率大約為每秒50 MB。對於大量數據流,NiFi應該能夠有效地達到每秒100 MB或更多的吞吐量。那是因為每個物理分區和內容存儲庫都預期添加到NiFi的線性增長。這將在FlowFile存儲庫和來源存儲庫的某個時間點出現瓶頸。我們計划提供一個基准測試和性能測試模板,以包含在構建中,從而允許用戶輕松測試他們的系統,並確定瓶頸在哪里,以及哪些可能成為一個因素。此模板還可使系統管理員輕松進行更改並驗證其影響。
- 對於CPU
-
流控制器用作引擎,指定特定處理器何時被執行線程。寫處理器一經執行任務就會立即返回線程。流控制器可以給出一個配置值,指示其維護的各種線程池的可用線程。使用的理想線程數取決於主機系統資源的核心數量,無論該系統是否運行其他服務,以及流程中的處理特性。對於典型的IO大流量,可以使數十條線程可用。
- 對於RAM
-
NiFi存在於JVM中,因此限於由JVM提供的內存空間。JVM垃圾收集成為限制實際堆大小的一個非常重要的因素,同時優化應用程序運行時間。當定期閱讀相同的內容時,NiFi工作可能是I / O密集型的。配置足夠大的磁盤以優化性能。
5、關鍵NiFi功能的高級概述
- 流量管理
-
- 保證交貨
-
NiFi的核心理念是,即使在非常高的規模,保證交付是必須的。這是通過有效使用專用的持久預寫日志和內容存儲庫來實現的。它們一起設計成允許非常高的事務速率,有效的負載傳播,寫時復制以及發揮傳統磁盤讀/寫功能的優勢。
- 數據緩沖帶背壓和壓力釋放
-
NiFi支持對所有排隊的數據進行緩沖,以及當隊列達到指定限制時提供背壓的能力,或者在數據達到指定年齡時使其老化(其值已經消失)的能力。
- 優先排隊
-
NiFi允許設置一個或多個優先級排序方案來了解如何從隊列中檢索數據。默認值是最早的,但有時候數據應該被拉到最新,最大的第一個或其他一些自定義方案。
- 流特定QoS(延遲v吞吐量,丟失容限等)
-
數據流的一些點數據絕對關鍵,並且是不容忍的。還有一段時間,它必須在幾秒鍾內被處理和交付成為任何價值。NiFi使得細粒度流特定配置這些問題。
- 使用方便
-
- 視覺指揮與控制
-
數據流可能變得相當復雜。能夠可視化這些流程並在視覺上表達它們可以大大減少復雜性並確定需要簡化的領域。NiFi不僅可以直觀地建立數據流,而且可以實時地實現。而不是設計和部署它更像是成型粘土。如果對更改的數據流進行更改立即生效。更改是細粒度的,並且與受影響的組件隔離。您不需要停止整個流程或流程只是為了進行一些具體的修改。
- 流模板
-
數據流往往是高度模式化的,而通常有許多不同的方式來解決問題,它可以大大地分享這些最佳實踐。模板允許主題專家構建和發布他們的流程設計,並為其他人創造和合作。
- 資料來源
-
NiFi自動記錄,索引並提供可用的來源數據,因為對象即使在扇入,扇出,轉換等過程中也可以流經系統。該信息在支持合規性,故障排除,優化和其他場景方面變得非常重要。
- 恢復/記錄細粒歷史的滾動緩沖區
-
NiFi的內容存儲庫旨在作為歷史的滾動緩沖區。只有當數據從內容存儲庫中老化或者需要空間時才會被刪除。這與數據來源功能相結合,使得在對象的生命周期中甚至跨越世代的特定點上實現點擊內容,內容下載和重放非常有用的基礎。
- 安全
-
- 系統到系統
-
數據流只是安全的一樣好。數據流中每一點的NiFi都可以通過使用諸如雙向SSL等加密協議提供安全交換。此外,NiFi使得流可以加密和解密內容,並使用發件人/收件人方程的任一側上的共享密鑰或其他機制。
- 用戶到系統
-
NiFi支持雙向SSL身份驗證,並提供可插拔授權,從而可以正確控制用戶的訪問和特定級別(只讀,數據流管理器,管理員)。如果用戶在流程中輸入密碼等敏感屬性,則立即加密服務器端,即使在加密形式下也不會再次暴露在客戶端。
- 多租戶授權
-
給定數據流的權限級別適用於每個組件,允許管理員用戶具有細粒度的訪問控制。這意味着每個NiFi集群都能夠處理一個或多個組織的要求。與獨立拓撲相比,多租戶授權可實現數據流管理的自助服務模式,從而允許每個團隊或組織對流程進行管理,同時充分了解流程的其他部分,無法訪問。
- 可擴展架構
-
- 延期
-
NiFi的核心是擴展的核心,因此它是數據流處理可以以可預測和可重復的方式執行和交互的平台。擴展點包括:處理器,控制器服務,報告任務,優先級和客戶用戶界面。
- 分類器隔離
-
對於任何基於組件的系統,可能會迅速發生依賴問題。NiFi通過提供自定義類加載器模型來解決這個問題,確保每個擴展捆綁包都暴露在非常有限的依賴關系中。因此,可以構建擴展,而不用擔心它們是否可能與另一個擴展沖突。這些擴展束的概念稱為NiFi Archives,並在開發人員指南中有更詳細的討論。
- 站點到站點通信協議
-
NiFi實例之間的首選通信協議是NiFi站點到站點(S2S)協議。S2S可以方便,高效,安全地將數據從一個NiFi實例傳輸到另一個。NiFi客戶端庫可以輕松構建並捆綁到其他應用程序或設備中,以通過S2S與NiFi通信。S2S中都支持基於套接字的協議和HTTP(S)協議作為底層傳輸協議,從而可以將代理服務器嵌入到S2S通信中。
- 靈活的縮放模型
-
- 橫向擴展(聚類)
-
NiFi旨在通過如上所述將多個節點聚類在一起使用來展開。如果單個節點被配置並配置為每秒處理數百MB,則可以配置適度的集群來處理每秒的GB數。這將帶來NiFi與獲取數據的系統之間的負載平衡和故障轉移的有趣挑戰。使用基於異步排隊的協議(如消息傳遞服務,Kafka等)可以幫助您。使用NiFi的站點到站點功能也非常有效,因為它是允許NiFi和客戶端(包括另一個NiFi集群)相互通話,共享關於加載的信息以及在特定授權端口上交換數據的協議。
- 放大和縮小
-
NiFi也被設計成以非常靈活的方式進行放大和縮小。在從NiFi框架的角度增加吞吐量方面,可以在配置時增加“計划”選項卡下的處理器上的並發任務數量。這允許更多的進程同時執行,提供更大的吞吐量。另一方面,您可以將NiFi完美地縮放到適合於在硬件資源有限的邊緣設備上運行,因為需要較小的占用空間。為了專門解決第一個英里數據收集挑戰和邊緣用例。
完事了,可以開始嘗試一把了。