2. 저는요?
저는 Apache에 소속된 오픈 소스에요. 분산 환경에서 대량의 데이터를 수집,
처리하기 위해 만들어 졌죠. NSA(National Security Agency)에서 태어 났어요.
실시간 ETL 정도로 쉽게 생각하실 수 있지만, 저는 FBP(flow-based programming)라는 개념을
가지고 더 많은 일을 할 수 있어요.
3. 제가 잘하는 건요?
전 실시간 처리를 정말 잘해요. 예를들어 특정 디렉토리에 파일이 생성되면 바로
다른 DB에 저장할 수도, 다른 곳으로 FTP로 보낼 수도 있죠. 요즘 빅데이터 시대가
되면서 더 많은 일을 하게 되었죠.
장애가 나도 저는 복구 될때까지 데이터를 처리를 못할 수는 있지만, 잃어버리는
일은 없어요.
Zero Master 클러스터 환경을 제공하고, 확장도 쉽게되요.
그 밖에 HTTPS를 지원해 통신에 대한 보안도 잘 되어있고요. 웹 기반에 비교적
직관적인 인터페이스를 가지고 있어 사용하기도 쉬워요. 데이터의 이동 경로를
추적할 수 있어요. 마지막으로 클러스터간의 Site-to-Site라는 것을 이용해 데이터를
교환할 수 있어요.
4. 제가 못하는 것은?
배치 작업은 잘 못해요. 예를들어 하둡 환경에서 대용량 파일을 빠르게 전송해야
한다면 DistCP가 더 좋아요. 그리고 원본 소스의 있는 파일들이 목적지까지 다
전달되었는지도 알기 힘들어요.
스케줄러가 있다고 저를 (배치) 스케줄러라고 생각하시면 안 되요. Jenkins와 같이
현재 실행되는 내용을 확인할 수 없어요. 오직 실행이 끝나고 성공과 실패, 출력
결과를 알 수 있어요.
저는 간단한 데이터 조작만 가능하지, 복잡한 연산은 잘 못 해요. 하지만 Spark,
Storm 등과 연동해 할 수 있죠.
5. 저를 구성하는 요소
Processor Connection FlowFile
FlowFile는 제가 인식하는 데이터 단위에요. Processor는 FlowFile을 수집, 변형,
저장하는 기능을 해요. Connection은 Processor와 Processor를 연결해,
FlowFile을 전달하죠.
6. FlowFile
속성(Attribute)과 내용(Content)로 구성되어 있어요. 속성은 키/값 형태로
데이터의 이동 및 저장 시 필요한 정보들이 들어 있고요. Expression Language가
지원되서 값을 다양하게 제어할 수 있어요. Processor와 Processor를 이동할
때마다 복사본이 만들어져서 추적이 가능하죠. 근데 내용은 복사하지 않고, 어디에
있는지 포인트 정보만 복사해 크게 부담되지는 않아요.
7. 여기서 잠깐! 저장소(repository)
FlowFile 정보가 어디에 저장되고, 또 어떻게 이것을 추적 가능할 까요?
FlowFile은 생성되면 FlowFile Repository에 속성값과 내용이 어디에 있는지
저장되고, Content Repository에 내용이 저장되요. 그리고 Processor가 처리될
때마다 Provenance Repository에 FlowFile 이력(이벤트)이 남아요.
8. FlowFile 흐름
간단하게 FlowFile이 어떻게 저장소에 있는지 알아볼께요. 최대한 쉽게 설명할텐데 솔직히 이해하기 쉽지 않아요. 그냥
그렇구나 하고 받아드리셔도 되고, 꼭 아시고 싶으시면 공식 설명서인 Apache NiFi In Depth를 참고하세요.
9. Processor
150개가 넘는 Processor를 제공하고, 확장 가능해요. ExecuteScript
Processor까지 활용한다면 훨씬 더 많은 일들을 할 수 있어요.
근데, 자주 쓰는거는 몇개 안되요. HTTP, Kafka, DB, FTP 관련 Processor와 속성을
변경하는 UpdateAttribute, 데이터를 합치는 MergeContent, 데이터를 특정 개수로
분할하는 Split* 시리즈, 데이터 타입을 변경하는 Convert* 시리즈 등을 많이
사용한답니다.
10. Connection
FlowFile의 대기열(Queue)라고 생각하면 되요. 이 대기열은 FlowFile의 우선순위,
만료, 부하 조절 기능 제공해요. 우선순위는 어떤 순(Prioritization)으로 FlowFile을 다음
Processor에게 제공할 지, 만료는 얼마까지만 대기열에 머물지(expiration), 부하 조절
기능은 얼마 만큼 차면 FlowFile 생성을 더디게 만들지(Back Pressure)를 말해요.
11. 기타 구성 요소
Flow Controller는 제가 사용하는 스케줄러를 말해요. 특정 간격 또는 Cron 표현식으로 스케줄링을 할 수 있고요. 클러스터
환경에서 동시에 실행되는 것을 막기 위해 Primary Node에서만 실행할 수도 있죠.
Controller Service를 이용해 Processor간 자원을 공유할 수 있어요. 예를들어 DBCPConnectionPool을 이용해서 DB 연결
정보를 Processor간에 공유할 수 있어요.
Process Group을 통해 관련있는 Processor들을 묶어서 관리할 수 있어요. 계층적으로 사용할 수 있어 Processor들이 많을
때도 잘 관리할 수 있어요. Input Port와 Output Port를 이용해 Process Group간에 데이터를 주고 받을 수 있어요.
Remote Process Group을 이용해 또 다른 NiFi 시스템과 Site-to-site 프로토콜을 이용해 데이터를 주고 받을 수 있어요.
Remote Input Port와 Output Port를 이용해 데이터를 주고 받을 수 있어요.
Web Server가 내장되어 있어요. Jetty 서버를 사용하고, 스프링 기반의 웹 애플리케이션이죠. 모두 비동기 방식으로
처리해서 비교적 높은 성능을 내요(SEDA: An Architecture for Highly Concurrent Server Applications).