NiFi란?
다양한 포맷의 데이터들을 ETL 처리할 수 있는 Flow-Based Programming(FBP) 툴
관련 글
[NiFi] Docker & NiFi로 HDFS 데이터 수집하기
[NiFi] Docker & NiFi 클러스터 환경에서 HDFS 데이터 분산 수집하기
빅데이터와 관련된 주제로써 이번에는 NiFi를 소개하겠습니다. NiFi는 미국 국가안보국(NSA)에서 Apache에 기증한 dataflow 엔진입니다. 기본적으로 데이터를 Extract, Transformation, Load (ETL)할 수 있는 툴로써 UI를 통해 다양한 기능들을 통해 데이터들을 flow화 시킬 수 있습니다. 그리고 가장 큰 특징으로는 클러스터를 구성해서 데이터를 처리할 수 있습니다.
NiFi의 핵심 개념
FlowFile
NiFi에서 사용하는 데이터 단위로써 파일명과 고유의 UUID를 가지며 추가적으로 attribute와 content들로 이루어져 있습니다. 이 때 attribute는 쉽게 말해 변수, content는 해당 파일의 내용이라고 생각하면 됩니다. FlowFile이 이동하면서 attribute를 추가하거나 수정할 수 있고 이 값들을 통해서 분기, 통합, 필터 등 다양한 전처리를 할 수 있습니다.
Processor
실제로 작업이 이루어지는 모듈로써 FlowFile들을 라우팅, 수집, 변형, 저장하는 기능들을 제공합니다. 기본적으로 NiFi에서는 150개 이상의 Processor 종류들을 지원하고 있으며 사용자가 직접 정의할 수 있습니다. 대표적인 Processor로써 ListSFTF, FetchSFTF, GetKafka, GetHbase, PutSFTF, PutHDFS, PutKafka, SelectHiveQL 등이 있습니다.
Connection
각 Processor들을 연결해주는 역할을 담당하고 있으며 FlowFile들의 Queue 공간을 제공합니다. 이 때 Queue는 우선 순위를 지정할 수 있고 FlowFile을 조절할 수 있는 기능도 제공합니다.
NiFi의 Architecture
기본적으로 NiFi는 JVM 환경에서 실행되면서 아래와 같은 구성으로 이루어집니다.
Web Server
NiFi의 UI를 제공하는 Web Server로써 API를 사용할 수 있습니다.
Flow Controller
Processor들을 관리하는 주체로써 thread를 할당할 수 있고 스케쥴링할 수 있습니다.
Extension
NiFi에서 제공하는 기본 Processor 외에 사용자가 직접 커스텀한 processor입니다.
FlowFile Repository
FlowFile 상태와 속성 값들의 정보들을 담고있는 WAL(Write-Ahead-Log)를 저장하는 곳입니다.
Content Repository
실제 데이터를 저장하는 곳으로써 데이터를 블럭화해서 저장할 수 있습니다.
Provenance Repository
FlowFile를 처리했던 event 정보들을 보관하는 곳입니다. 아래와 같이 FlowFile이 각 Processor를 거쳤을 때 content 또는 attribute 값이 계속해서 변경이되는데 Provenance Repository를 통해서 해당 FlowFile의 모든 변화 과정을 볼 수 있습니다. 가장 유용하게 사용할 수 있는 것은 Processor의 전, 후 값들을 비교하며 볼 수 있다는 점입니다. 최종 FlowFile이 원하는 결과가 아닐 때, 어느 Processor에서 잘못되었는지를 확인할 수 있습니다.
NiFi의 클러스터 환경
NiFi도 클러스터 환경으로 운영할 수 있습니다. 그러나 일반적인 Hadoop의 Master - Slave 구조처럼 다른 노드들을 관리만 하는 NameNode가 존재하지 않습니다. NiFi의 각 노드들은 동일한 역할을 수행하며 단지 특정 노드 몇개만 추가적인 역할을 담당하고 있습니다. 이 때 추가적인 역할은 Primary Node와 Cluster Coordinator이고 ZooKeeper가 특정 노드에게 역할을 부여합니다.
Primary Node
클러스터 환경에서 데이터 수집과 같은 작업을 진행할 때 여러 노드 중에서 조율하는 역할을 담당합니다.
기본적으로 NiFi의 노드들은 동일한 dataflow를 수행하지만, 모든 노드에서 동일하게 수행되는 것이 적합하지 작업들이 존재합니다. 예를 들어 HDFS 데이터를 가져오는 경우 모든 노드에서 데이터 리스트를 가져와 분배하는 작업을 한다면, race condition이 발생할 가능성이 있습니다. 그래서 가져올 데이터 리스트를 Primary Node가 독자적으로 수행한 뒤 각 노드들에게 분담시켜주는 역할을 담당합니다.
Cluster Coordinator
Cluster Coordinator는 다른 노드들과 heartbeat를 통해 현재 상태를 모니터링합니다. 디폴트 값으로는 5초마다 heartbeat를 송수신하고 만약 40초동안 heartbeat를 받지 못했다면 Cluster Coordinator 쪽에서 연결을 끊어버립니다. 이러한 이유는 NiFi의 클러스터 환경에서는 각 노드들이 데이터를 분산해서 처리하기 때문에 sync를 유지하는 것이 상당히 중요하기 때문입니다. 하지만 이후에 다시 새로운 heartbeat를 보낸다면 자동으로 Cluster Coordinator가 해당 노드를 클러스터 환경에 다시 참여시킵니다.
References
https://www.popit.kr/apache-nifi-overview-and-install/
https://paulsmooth.tistory.com/204
https://nifi.apache.org/docs.html
https://nifi.apache.org/docs/nifi-docs/html/administration-guide.html
'Hadoop Ecosystem > NiFi' 카테고리의 다른 글
[NiFi] Json 데이터의 동적 크기 Array 전처리하기 (Base64 decoding) (1) | 2022.09.21 |
---|---|
[NiFi] Untrusted proxy 및 UninheritableFlowException 에러 해결 방법 (0) | 2022.05.22 |
[NiFi] Docker & NiFi 클러스터 환경에서 HDFS 데이터 분산 수집하기 (0) | 2022.02.12 |
[NiFi] Docker로 NiFi 클러스터 구성하기 (0) | 2022.01.31 |
[NiFi] Docker & NiFi로 HDFS 데이터 수집하기 (0) | 2021.11.17 |