「大數據系列」Apache NIFI:大數據處理和分發系統

什麼是Apache NiFi?

簡單地說,NiFi就是爲了實現系統間數據流的自動化而構建的。雖然術語“數據流”用於各種上下文,但我們在此處使用它來表示系統之間的自動和管理信息流。這個問題空間一直存在,因爲企業有多個系統,其中一些系統創建數據,一些系統消耗數據。已經討論並廣泛闡述了出現的問題和解決方案模式。企業集成模式[eip]中提供了一個全面且易於使用的表單。

數據流的一些高級別挑戰包括:

系統失敗

網絡故障,磁盤故障,軟件崩潰,人們犯錯誤。

數據訪問超出了消耗能力

有時,給定的數據源可能會超過處理鏈或交付鏈的某些部分 - 只需要一個弱鏈接就會出現問題。

邊界條件僅僅是建議

您將總是獲得太大,太小,太快,太慢,損壞,錯誤或格式錯誤的數據。

噪音有一天成爲下一個信號

組織的優先事項 - 迅速改變。啓用新流程和更改現有流程必須快速。

系統以不同的速度發展

給定系統使用的協議和格式可以隨時改變,而不管它們周圍的系統如何。存在數據流以連接本質上是大規模分佈的組件系統,這些組件鬆散地或根本不設計爲一起工作。

合規性和安全性

法律,法規和政策發生變化。企業對企業協議的變化。系統到系統和系統到用戶的交互必須是安全的,可信的,負責任的。

生產中持續改進

通常不可能在實驗室中複製生產環境。

多年來,數據流一直是架構中必不可少的證據之一。現在雖然有許多活躍且快速發展的運動,但數據流更有趣,對於特定企業的成功更爲重要。這些包括:面向服務的體系結構[soa],API [api] [api2],物聯網[iot]和大數據[bigdata]的興起。此外,合規性,隱私性和安全性所需的嚴格程度也在不斷提高。即使仍然存在所有這些新概念,數據流的模式和需求仍然大致相同。然後,主要區別在於複雜性的範圍,適應所需的變化率,以及大規模邊緣情況變得普遍。 NiFi旨在幫助解決這些現代數據流挑戰。

特徵

Apache NiFi支持強大且可擴展的數據路由,轉換和系統中介邏輯的有向圖。 Apache NiFi的一些高級功能和目標包括:

基於Web的用戶界面

  • 設計,控制,反饋和監控之間的無縫體驗

高度可配置

  • 容忍損失與保證交付
  • 低延遲與高吞吐量
  • 動態優先級
  • 可以在運行時修改流程
  • 背壓

數據來源

  • 從頭到尾跟蹤數據流

專爲擴展而設計

  • 構建自己的處理器等等
  • 實現快速開發和有效測試

安全

  • SSL,SSH,HTTPS,加密內容等......
  • 多租戶授權和內部授權/策略管理

NiFi的核心概念

NiFi的基本設計概念與基於流程編程的主要思想密切相關[fbp]。以下是一些主要的NiFi概念以及它們如何映射到FBP:

此設計模型也類似於[seda],提供了許多有益的結果,有助於NiFi成爲構建功能強大且可擴展的數據流的非常有效的平臺。其中一些好處包括:

  • 適用於處理器有向圖的可視化創建和管理
  • 本質上是異步的,即使在處理和流量波動時也允許非常高的吞吐量和自然緩衝
  • 提供高度併發的模型,而開發人員不必擔心併發的典型複雜性
  • 促進內聚和鬆散耦合組件的開發,然後可以在其他環境中重複使用並促進可測試單元
  • 資源受限的連接使得背壓和壓力釋放等關鍵功能非常自然和直觀
  • 錯誤處理變得像快樂路徑一樣自然而不是粗粒度的全部捕獲
  • 數據進入和退出系統的點以及它如何流過的點很容易理解和輕鬆跟蹤

NiFi架構

NiFi在主機操作系統上的JVM內執行。 JVM上NiFi的主要組件如下:

網絡服務器

Web服務器的目的是託管NiFi基於HTTP的命令和控制API。

流量控制器

流量控制器是操作的大腦。它爲擴展程序提供運行的線程,並管理擴展程序何時接收要執行的資源的計劃。

擴展

在其他文獻中描述了各種類型的NiFi擴展。這裏的關鍵點是擴展在JVM中運行和執行。

FlowFile存儲庫

FlowFile存儲庫是NiFi跟蹤其對流中當前活動的給定FlowFile的瞭解狀態的地方。存儲庫的實現是可插入的。默認方法是位於指定磁盤分區上的持久性預寫日誌。

內容存儲庫

內容存儲庫是給定FlowFile的實際內容字節的實時位置。存儲庫的實現是可插入的。默認方法是一種相當簡單的機制,它將數據塊存儲在文件系統中。可以指定多個文件系統存儲位置,以便獲得不同的物理分區以減少任何單個捲上的爭用。

來源庫

Provenance Repository是存儲所有起源事件數據的地方。存儲庫構造是可插入的,默認實現是使用一個或多個物理磁盤卷。在每個位置內,事件數據被索引和搜索。

NiFi也能夠在集羣內運行。

從NiFi 1.0版本開始,採用了Zero-Master Clustering範例。 NiFi羣集中的每個節點對數據執行相同的任務,但每個節點都在不同的數據集上運行。 Apache ZooKeeper選擇單個節點作爲集羣協調器,ZooKeeper自動處理故障轉移。 所有羣集節點都會向羣集協調器報告心跳和狀態信息。 羣集協調器負責斷開和連接節點。 此外,每個羣集都有一個主節點,也由ZooKeeper選舉。 作爲DataFlow管理器,您可以通過任何節點的用戶界面(UI)與NiFi羣集進行交互。 您所做的任何更改都將複製到羣集中的所有節點,從而允許多個入口點。

NiFi的性能期望和特性

NiFi旨在充分利用其運行的底層主機系統的功能。在CPU和磁盤方面,這種資源的最大化特別強大。有關其他詳細信息,請參閱“管理指南”中的最佳做法和配置提示。

對於IO

可以預期的吞吐量或延遲會有很大差異,具體取決於系統的配置方式。鑑於大多數主要NiFi子系統都有可插拔的方法,性能取決於實施。但是,對於具體且廣泛適用的內容,請考慮開箱即用的默認實現。這些都是持久的保證傳遞,並使用本地磁盤這樣做。因此保守一點,假設典型服務器中的適度磁盤或RAID捲上的讀取/寫入速率大約爲每秒50 MB。然後,對於大類數據流的NiFi應該能夠有效地達到每秒100 MB或更高的吞吐量。這是因爲預期每個物理分區和添加到NiFi的內容存儲庫都會線性增長。這將在FlowFile存儲庫和originance存儲庫的某個點上出現瓶頸。我們計劃提供一個基準測試和性能測試模板,以包含在構建中,允許用戶輕鬆測試他們的系統並確定瓶頸在哪裏,以及它們可能成爲一個因素。此模板還應使系統管理員可以輕鬆進行更改並驗證其影響。

對於CPU

流控制器充當引擎,指示特定處理器何時被賦予執行線程。編寫處理器以在執行任務後立即返回線程。可以爲Flow Controller提供一個配置值,指示它維護的各個線程池的可用線程。理想的線程數取決於主機系統資源的核心數量,系統是否正在運行其他服務,以及流程中處理的性質。對於典型的IO大流量,可以使許多線程可用。

對於RAM

NiFi存在於JVM中,因此僅限於JVM提供的內存空間。 JVM垃圾收集成爲限制總實際堆大小以及優化應用程序運行時間的一個非常重要的因素。定期閱讀相同內容時,NiFi作業可能是I / O密集型的。配置足夠大的磁盤以優化性能。

關鍵NiFi功能的高級概述

這部分提供了20,000英尺的NiFi基石基礎視圖,讓您可以瞭解Apache 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框架的角度來看,在增加吞吐量方面,可以在配置時增加Scheduling選項卡下處理器上的併發任務數。這允許更多進程同時執行,從而提供更高的吞吐量。另一方面,您可以完美地將NiFi縮小到適合在邊緣設備上運行,因爲硬件資源有限,所需的佔用空間很小。要專門解決第一英里數據收集挑戰和邊緣使用案例,您可以在此處找到更多詳細信息:https://cwiki.apache.org/confluence/display/NIFI/MiNiFi,關於Apache NiFi,MiNiFi的子項目工作(發音爲“縮小”,[min-uh-fahy])。

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