NIFI란
NiFi는 시스템 간 ‘data flow(ETL)’ 자동화하기 위해 구축된 프로그램이다. 이 도구는 실시간 데이터 흐름을 처리하기 위한 시스템을 구축하고 관리하는 데 사용된다. 즉 데이터를 생성하는 소스에서부터 데이터를 처리하고 데이터를 최종 목적지까지 이동시키는 전체 프로세스를 관리하고 시각화하는데 중점을 둔다.
이 같은 툴을 ETL 툴이라고 명명하는데 그 중에서도 NiFi는 FBP(Flow Based Programming)툴이라고 한다. 이런 툴을 사용하는 이유는 ETL 데이터 파이프라인을 구축하는데 필요한 에러처리, 스레딩 처리 등이 이미 적용되어 있어 복잡한 코딩이 필요 없고, 빠르게 파이프라인을 구축할 수 있기 때문이다.
NiFi는 apache라이센스를 제공하며 최초 NASA에서 개발되어 2014년 오픈소스화 되었다.
NiFi는 Web UI 기반으로 데이터 흐름을 쉽게 구성하고 관리할 수 있다. NiFi에서 제공하는 ETL을 위한 100여가지 이상의 Processor들과 원본 source와의 Connection, Pool, 작업을 위한 Thread 등을 관리할 수 있으며, 각 Processor들의 실행 상태, 에러 상태 등을 모니터링 할 수 있고, 에러가 발생하더라도 데이터가 유실 되지 않도록 disk에 임시저장해놓은 후 재실행이 가능한 안정성을 제공한다. 또한 TimeDriven, CronDriven 등의 스케쥴링 기능을 제공하여 원하는 시간에 Processor들이 작동할 수 있도록 컨트롤 할 수 있다.
물론 NiFi가 ETL을 위한 완벽한 툴은 아니다. 대용량 데이터 작업을 하는데는 무리가 있으며, 이미 개발되어있는 Processor가 많지만 사용자를 위한 완벽한 작업을 제공하지 않을 수 있다. 하지만 빠르게 데이터 Pipeline을 만들 수 있고, 직관적으로 데이터 흐름을 파악하기 쉬워 다양한 원본 Source로부터 Data Lake를 만드는데 적합한 툴이다.
NiFi 핵념 개념
NiFi 용어 | FBP 용어 | 설명 |
FlowFile | Information Packet | FlowFile은 시스템에 의해 이동하는 각 객체를 의미한다. NiFi는 이 객체를 key/value 쌍의 맵으로 추적한다. |
FlowFile Processor | Black Box | 실제 작업을 수행하는 프로세스를 말한다. 데이터 라우팅, 변환, attribute 등을 제어한다. 프로세서는 0개 이상의 FlowFile을 위해 작동하며, 해당 작업을 커밋하거나 롤백할 수 있다. |
Connection | Bounded Buffer | Connection은 Processor간의 실제 연결을 제공한다. 대기열 역할을 하며, FIFO(First In First Ourt) 등 FlowFile의 우선순위를 지정하여 다양한 Processor들이 서로 다른 속도로 상호작용할 수 있도록 한다. |
Flow Controller | Scheduler | Flow controller는 모든 Processor가 사용하는 Thread 할당 및 연결을 관리한다. 또한 Processor사이에 이동하는 FlowFile 교환을 관리한다. |
Process Group | Subnet | Processor Group은 Input port를 통해 데이터를 수신하고 Output port를 통해 데이터를 보낼 수 있는 Processor들의 집합이다. 이를 활용하여 Processor들의 집합을 하나의 pipeline컴포넌트처럼 관리할 수 있다. |
NiFi 아키텍처
NiFi는 JVM가상 머신 위에서 실행되며, 아래와 같은 구성요소로 이루어진다.
- Web Server
- NiFi는 Data Pipeline을 만들기 위해 직관적인 Web GUI를 제공한다. Web Server는 NiFi의 HTTP 기반의 명령과 제어 API를 호스팅한다.
- Flow Controller
- Flow Controller는 NiFi의 두뇌를 담당한다. 실행을 위해 Thread를 제공하여 동시작업을 제어하며, 각 Processor들의 Schedule을 관리한다.
- Extentions
- NiFi는 여러 확장 모듈을 사용할 수 있다. 여기서 핵심은 확장 기능들이 JVM 내에서 작동하고 실행된다는 것이다.
- FlowFile Repository
- 현재 실행되고 있는 FlowFile의 상태를 추적한다.
- Content Repository
- 현재 실행되고 있는 FlowFile의 실재 데이터가 저장되어 있는 곳이다.
- Provenance Repository
- 모든 출처 이벤트 데이터가 저장되는 곳이다.
- FlowFile Repository, Content Repository, Provenance Repository에는 충분한 양의 디스크 공간을 할당해야 한다. 이에 대한 자세한 내용은 시스템 속성 섹션 문서를 참고한다.
NiFi는 클러스터 만들어 작동시킬 수도 있다.
NiFi 1.0 버전부터 Zero-Leader Clustering 패러다임을 사용하여 전체 클러스터가 동일한 Data Flow를 가지고 있다. 하지만 각 노드마다 다른 Data set에서 작동한다.
Apache Zookeeper는 클러스터링 된 여러 노드 중에서 하나의 노드를 Coordinator 노드로 선출한다. Coordinator 노드는 각 노드들의 연결을 끊고 다시 연결하는 일을 담당하며, 모든 노드들은 heart beat 및 상태 정보를 Coordinator노드에게 전달한다.
또한 모든 클러스터에서는 Apache Zookeeper가 DataFlow 매니저로 선출한 하나의 Primary node가 존재한다. DataFlow 매니처는 모든 노드의 UI를 통해 NiFi 클러스터와 상호작용한다. 때문에 NiFi UI를 통한 모든 변경사항은 클러스터의 모든 노드의에 복제되어 여러 진입점을 제공한다.
NiFi의 성능 기대치 및 특성
NiFi는 작동 중인 기본 호스트 시스템의 기능을 최대한 활용하도록 설계되었다.
- CPU의 경우
- Flow Controller는 특정 Processor를 실행할 Thread를 제공할 때 지시하는 엔진역할을 한다. Processor는 작업이 완료된 시점에 즉시 Thread를 반환하도록 작성되었다. Thread Pool의 수를 Flow Controller에서 지정할 수 있으며, 이상적인 Pool의 수는 호스트의 코어 수, 시스템 리소스, 같은 호스트의 다른 서비스의 실행 여부 및 Data Flow의 개수, 처리 특성에 따라 다르다. 일반적으로 IO가 많은 Data Flow의 경우 수십개의 스레드를 사용할 수 있도록 만드는 것이 합리적이다.
- RAM의 경우
- NiFi는 JVM 내에 있으므로 JVM이 제공할 수 있는 메모리 공간으로 한정된다.
System Requirements
- 자바 8 또는 자바 11 필요
- 지원되는 운영 체제 - 리눅스, 유닉스, 윈도우, 맥OS
- 지원되는 웹 브라우저
- Microsoft Edge: Current & (Current - 1)
- Mozilla FireFox: Current & (Current - 1)
- Google Chrome: Current & (Current - 1)
- Safari: Current & (Current - 1)
NiFi의 Hardware Driving Factors
- CPU Core 수 - 최소 각 노드당 8 core 이상
- 네트워크 용량, 속도
- Hard Disk의 전송속도
- NiFi에서 가용한 Ram Memory - 최소 각 노드당 8 gb 이상
- 각 요소들은 Data Flow를 어떻게 구성하느냐에 따라 필요한 하드웨어 및 메모리 크기가 달라질 수 있다.
참고자료
https://nifi.apache.org/docs.html
https://brunch.co.kr/@sokoban/94