資料工程新革命:用 Apache NiFi 告別手刻 ETL 的時代

資料工程新革命:用 Apache NiFi 告別手刻 ETL 的時代

在今日數據驅動的時代,企業面臨著來自四面八方的資料source,如何高效、可靠地整合、處理並分發這些資料,成為資料工程領域的核心挑戰。Apache NiFi (源於美國國家安全局的 NiagaraFiles 技術) 應運而生,它是一個為自動化管理系統間資料流而設計的強大開源system。其官方網站簡潔有力地描述其為「一個易於使用、功能強大且可靠的資料處理與分發系統」。

相較於常見的 Apache Airflow 或特定雲端平台 (如 AWS Data Pipeline) 的解決方案,NiFi 更加專注於資料流本身 (Data Flow),提供一個視覺化的 Web 使用者介面,讓開發者透過拖拉設定的方式,以低程式碼(Low-code)甚至無程式碼(No-code)的方式建構複雜的資料管道(Data Pipeline)。本文旨在深入探討 Apache NiFi 的核心概念、關鍵特性、安裝設定及實戰應用,為讀者們提供一份詳盡的入門與實踐指南。

核心架構與關鍵元件

Apache NiFi 的設計哲學基於流程導向程式設計(Flow-Based Programming, FBP),將複雜的資料處理任務拆解為一系列獨立、可重複使用的模組。理解其核心元件是掌握 NiFi 的第一步:

  • FlowFile:是 NiFi 中資料移動的基本單位。每個 FlowFile 如同一個包裹,包含兩部分:內容 (Content),即實際的資料本身(例如一個 JSON 檔案、一張圖片);以及 屬性 (Attributes),即描述資料的元數據(例如檔案名稱、來源路徑、生成時間等),這些屬性還可透過nifi expression language進行動態存取與操作。整個資料流的處理,本質上就是對 FlowFile 的內容或屬性進行操作。
  • Processor (處理器):是 NiFi 的工作核心,負責執行具體的資料處理任務。每個 Processor 都像一個專門的工人,執行一項特定功能,例如從本地端讀取檔案的 GetFile、將 JSON 轉換為 SQL 的 ConvertJSONToSQL、執行自訂腳本的 ExecuteScript,或是將資料寫入資料庫的 PutSQL。NiFi 內建了數百個 Processor,涵蓋了各種資料來源與目標的整合。
  • Connection (連接):是連接不同 Processor 的橋樑,它在 NiFi 中扮演著佇列(Queue)的角色。當一個 Processor 處理完 FlowFile 後,會將其放入指定的 Connection 中,等待下一個 Processor 取用。這種機制支援背壓(Back Pressure)和負載平衡,能有效防止下游系統因處理不及而崩潰。
  • Process Group (處理器群組):當資料流程變得複雜時,可將一組相關的 Processor 和 Connection 封裝成一個 Process Group。這不僅讓畫布保持整潔,更能將一個複雜的子流程模組化,方便重複使用與管理。
  • Flow Controller (流程控制器):作為大腦,flow controller負責管理與調度。它為處理器提供執行緒等資源,並管理處理器執行的時程安排,確保整個資料流的順暢運行。
  • Controller Service (控制器服務):這是一種可供多個 Processor 共享的服務資源。最典型的例子就是資料庫連線池(DBCPConnectionPool)。您只需設定一次資料庫的連線資訊(如 JDBC URL、驅動程式、帳號密碼),之後所有需要連接該資料庫的 Processor 都可以直接取用此服務,避免了重複設定,也方便了集中管理。

Apache NiFi 的主要特點

NiFi 憑藉其獨特的設計,在資料工程領域佔有一席之地。以下是其優缺點的詳細分析,如下表中所示:

特性分類 優點 (Advantages) 缺點 (Disadvantages)
視覺化與易用性 圖形化介面: 提供直觀的 Web UI,透過拖拉即可建構資料流。
低程式碼/無程式碼: 大部分常見任務無需撰寫程式碼,降低入門門檻。
學習曲線: 介面參數繁多,初學者常需對照官方文件才能理解各項設定的具體涵義。
整合性與擴充性 廣泛的整合能力: 支援主流 RDB、NoSQL、雲端儲存 (AWS S3, GCP GCS) 及訊息佇列 (Kafka) 等。
跨雲端平台: 不受限於單一雲端供應商,可自由對接 AWS, GCP, Azure 服務。
自訂腳本: 可透過 ExecuteScript 處理器執行 Python, Groovy 等腳本,實現高度客製化的轉換邏輯。
台灣社群資源: 相較於 Airflow,在台灣的社群討論度和中文案例分享較少,遇到特定問題時較依賴國外社群或官方文件。
企業級特性 資料可追溯性 (Data Provenance): 可追蹤每個 FlowFile 從產生到結束的完整生命週期,包含所有轉換細節,便於偵錯與稽核。
叢集部署: 可建置成叢集 (Clustering) 以實現高可用性、安全性與負載平衡。
版本控制: 可搭配 NiFi Registry 實現對資料流程的 Git-like 版本控制。
動態調整: 可在不停止整個資料流的情況下,單獨啟動、停止或修改某個 Processor。
維運成本: 需要自行託管 (Self-hosted) 與維護,需要投入一定的伺服器與人力資源。
叢集擴展限制: 在叢集模式下,若要新增節點 (Node),需要將整個服務停機進行設定更改後再重啟。
錯誤處理 靈活的路由: Processor 的處理結果可分為 success, failure 等多種關係,可將失敗的 FlowFile 導向特定的錯誤處理流程。 N/A

安裝與初次設定

安裝 NiFi 的前提是系統中已安裝 Java (建議使用 JDK 8 或 11)。主要有兩種安裝方式:

原生安裝 (Native Installation)

  • 從 Apache NiFi 官網 下載最新的 Binaries 壓縮檔。
  • 解壓縮後,在終端機中進入 NiFi 目錄。
  • Windows: 執行 bin\run-nifi.bat。
  • macOS/Linux: 執行 bin/nifi.sh start,接著可使用 bin/nifi.sh status 來確認其運行狀態。
  • 常見陷阱:
    • macOS M系列晶片: 若使用 Homebrew 安裝,注意其路徑通常在 /opt/homebrew。且啟動腳本的正確位置在 libexec 子目錄下,例如 /opt/homebrew/Cellar/nifi/1.23.2/libexec/bin/nifi.sh,直接執行外層的 bin 腳本會導致 Web UI 無法登入。
    • 預設埠號: NiFi 預設使用 HTTPS8443 端口。請在瀏覽器中輸入 https://localhost:8443/nifi 或 https://127.0.0.1:8443/nifi。許多舊文章提到的 8080 埠號已不適用於新版本。

使用 Docker 安裝

這是目前最推薦的快速啟動方式。只需執行一行指令即可啟動:

docker run --name nifi -p 8443:8443 -d apache/nifi:latest

啟動後,NiFi 會在日誌 (logs/nifi-app.log) 中生成一組臨時的帳號密碼。首次登入後,建議使用以下指令設定一組永久憑證(密碼長度至少12個字元):

bin/nifi.sh set-single-user-credentials <您的username> <您的密碼>

實戰範例:從檔案到資料庫的 ETL 流程

以下示範一個比hello world更貼近真實專案需求的經典流程:讀取本地 JSON 檔案,將其內容寫入 PostgreSQL 資料庫。

設定 Controller Service (DBCPConnectionPool):

  • 在 NiFi 畫布右側的設定中,進入 Controller Services。
  • 新增一個 DBCPConnectionPool 服務。
  • 設定其屬性:
    • Database Connection URL: jdbc:postgresql://<主機IP>:5432/<資料庫名稱>
    • Database Driver Class Name: org.postgresql.Driver
    • Database Driver Location(s): 指向您下載的 PostgreSQL JDBC 驅動程式 .jar 檔案路徑。
    • Database User / Password: 您的資料庫帳號密碼。
  • 設定完成後,點擊閃電圖示啟用此服務。

拖曳並設定 Processor:

  • GetFile: 設定 Input Directory 為您存放 JSON 檔案的資料夾。
  • ConvertJSONToSQL:
    • JDBC Connection Pool: 選擇剛才建立的 DBCPConnectionPool。
    • Statement Type: 選擇 INSERT。
    • Table Name: 輸入目標資料表名稱,例如 user_info。
  • PutSQL:
    • JDBC Connection Pool: 同樣選擇設定好的 DBCPConnectionPool。

連接流程與啟動:

  • 將 GetFile 的 success 關係連接到 ConvertJSONToSQL。
  • 將 ConvertJSONToSQL 的 sql 關係連接到 PutSQL。
  • 將 ConvertJSONToSQL 的 failure 關係,以及 PutSQL 的 success 和 failure 關係都設定為 auto-terminate(即處理完後丟棄)。
  • 選取所有 Processor,點擊上方的啟動按鈕,資料流便會開始運行。

常見問題 (FAQ)

Q1: Apache NiFi 和 Apache Airflow 有什麼不同?

  • A: 兩者定位不同。NiFi 是一個資料流系統,專注於資料的移動、轉換和路由(ETL/ELT),強調即時性與視覺化流程。Airflow 則是一個工作流管理系統,專注於任務的排程、依賴關係管理和監控(以 DAGs 形式),它可以用來「觸發」一個資料處理任務(例如一個AI模型的訓練腳本),但本身不直接處理資料流動的細節。簡單來說,NiFi 管「資料怎麼流」,Airflow 管「任務何時做」。

Q2: 我在 M1/M2 Mac 上安裝 NiFi 遇到問題,該怎麼辦?

A: 首先推薦使用 Docker,這是最快且最不容易出錯的方式。若讀者堅持使用 Homebrew 原生安裝,請務必確認您執行的 nifi.sh 腳本位於 libexec 子目錄內,而非外層的 bin 目錄。同時檢查 Java 版本是否相容。

Q3: NiFi 的預設登入埠號是多少?為什麼我連不上?

A: 新版 NiFi 的預設埠號是 8443,且強制使用 HTTPS 協定。請務必在瀏覽器中輸入完整的 https://localhost:8443/nifi。如果無法連接,請檢查防火牆設定或確認 NiFi 這個software的服務是否已成功啟動。

Q4: 我可以在 NiFi 中執行自己的 Python 腳本嗎?

A: 可以。NiFi 提供了 ExecuteScript 處理器,它支援多種腳本語言,其中包含 Jython(Python 的 Java 實現)。您可以利用它來撰寫自訂的資料清洗、轉換或分析邏輯,無縫嵌入到您的視覺化資料流中。

總結

Apache NiFi 是一個功能極其豐富且強大的資料流自動化工具。它透過視覺化的方式,極大地簡化了資料管道的設計與管理,其卓越的資料追溯能力和靈活的整合性,使其在處理複雜、異構資料源的場景中表現出色。雖然它存在一定的學習曲線和維運成本,但一旦熟練掌握,它將成為解決資料整合難題、拯救 IT 人員於水火之中的超級英雄。對於任何需要建構穩定、可控、可視化資料流的團隊而言,Apache NiFi 都是一個值得投入時間學習和應用的絕佳選擇。

資料來源

返回頂端