ETL 프로세스에 대해서..
다양한 서비스를 제공하다가 보면 다양한 서비스의 로그가 저장되게 된다. 예를 들어 사용자들의 과금 로그, 접속 로그 등 이렇게 쌓여진 로그를 분석하거나 재처리 해야 하는 일은 다양하게 발생하게 된다. 이럴때 사용하는 것이 ETL (Extract, Transform, Load) 이다. 유사한 개념으로 EAI 등도 있다.
MS-SQL을 메인 RDB로 사용했던 적이 있고 그러다 보니 Microsoft Integration Services 를 이용하여서 DataWare House를 구축하여 다양한 사용자들의 로그를 분석해야 했다. 이를 위한 ETL 개발시 기존의 코딩을 통해서 개발하기보다는 SSIS (SQL Server Integration Services)를 통해서 UI를 이용하여 간단하게 개발하여서 구축할 수 있었다.
특히 SSIS는 기존의 단순 코딩대비 UI를 통한 구성이 가능하였으므로 이를 통해서 개발 시간을 단축 시킬수 있을 뿐만 아닌 예외처리, 멀티 스레딩, DB 연결 등 다양한 부분을 모두 툴에서 제공해 주었기 때문에 초기 도입 시간을 확연하게 줄일수가 있었다.
물론 이것이 만능은 아니였다. 이기종의 데이터 베이스를 다수 연동해야 하거나 대용량의 데이터를 연동하여 배치작업을 하거나 실시간에 가깝게 구성하기에는 몇가지 단점이 존재도 또한 존재 하였다. 개발 리소스가 충분히 확보되지 못한 분석팀이나 보안팀에서 주로 한두명의 개발자가 보안 로그를 수집/정재/분석 하고자 할때에는 분명 좋은 툴임에는 틀림없었다.
SSIS와 유사한 툴들은 여러가지가 있었지만 상용 DB 답게 편리하게 사용할 수 있었다. 하지만 상용 RDB를 사용하는 단점 그리고 MS 제품에 최적화 되어 있었던 부분 덕택에 다른 제품을 찾아 볼수 밖엔 없었다.
https://en.wikipedia.org/wiki/Flow-based_programming#Concepts
ETL을 위한 다양한 방법중에서 위에서 소개한 SSIS같은 유형을 Flow-Based Programming 툴이라고 한다. 이러한 툴들은 미리 정의된 기능 컴포넌트들을 구성해 두고 이를 UI 상에서 다이어그램으로 배치하여 구현할 수 있다.
이러한 툴들의 장점으로는..
1. 빠른 프로트 타이핑이 가능하다.
2. 에러처리, 스레딩 처리 등이 이미 구현되어 있다.
3. 툴에 따라 틀리지만 대부분 결과를 보장한다.
(에러시 중단 지점을 정의해 두면 재처리에 용이하게 구성하기 편하게 되어 있다.)
4. 코딩을 위한 리소스가 들어가지 않으며 복잡한 코딩이 불필요 하다.
상세한 내용은 위의 위키 페이지를 참고 하기 바란다.
% 물론 이러한 툴이 만능은 아니다. 대용량의 작업을 위해서는 이러한 툴만으로는 불가능한 작업이 많으므로 소량의 데이터가 아닌 다량의 데이터를 실시간으로 처리 해야 하는 경우에는 프로트 타이핑 정도의 역할로 사용한다.
FBP 툴중에서 현재 시점에서 Hadoop과 SQL 그리고 다양한 포멧의 데이터들을 지원 하는 툴로 Nifi를 선택 할수 있다. nifi는 apache 라이센스에서 제공하는 툴로서 최초 NSA에서 개발된 것을 2014년에 오픈소스화 하여 개발되었다.
아래는 NiFi를 사용할때 반드시 알아야 하는 개념들이다.
1. FlowFile : Nifi에서 사용되는 각 개체
2. FlowFile Processor : 실제 작업을 수행하는 프로세스
3. Connection : 각 프로세스간에 접속
4. Flow Controller : 각 프로세서간의 연결, 그 사이에 오가는 FlowFile에 대해서 관리한다.
5. Process Group : 다양한 그룹에서 각 연결에 대한 프로세스의 그룹
NiFi는 자바 가상 머신 상에서 실행되며 아래와 같은 구성 요소로 구성 된다.
1. Web Server
Nifi를 실행하게 되면 내장된 웹 서비스를 통해서 다양한 작업을 할수 있게 하며 API도 제공된다.
2. Flow Controller
구성된 Flow에 대한 각각의 작업을 통재하고 스레딩 처리를 통하여 다수의 동시 작업을 제어한다.
3. Extensions
NiFi에서는 다양한 확장 모듈을 사용할 수 있다.
4. FlowFile Repository
현재 활성화되어 있어 동작하는 FlowFile의 상태를 추적
5. Content Repository
동작중인 FlowFile의 실제 데이터가 있는 곳
6. Provenance Repository
모든 출처 이벤트 데이터가 저장되는 저장소
추가적으로 NiFi는 클러스터로도 동작한다.
Nifi의 클러스터는 Zero-Leader 클러스터링을 채택하여 전체 클러스터가 동일한 작업을 수행한다. 하지만 각각의 노드들에서 다루어지는 데이터는 Apache ZooKeeper를 통해서 분산되어 처리 되게 되어 있다. 다량의 데이터를 동시에 처리하기 위해서 사용할 수 있다.
전체적인 구조와 상세한 내용을 알고 싶다면 아래의 NiFi 문서를 참고하기 바란다.
http://nifi.apache.org/docs.html
NiFi를 설치하는것은 간단한 설치가 가능하며 설치된 상태에서도 다양한 기능을 사용할 수 있다. 물론 클러스터나 인증을 거는 부분이 꼭 필요하지만 손쉽게 실행하는 것이 가능하다.
https://nifi.apache.org/download.html
위의 다운로드 사이트에서 패키지를 다운로드 한후 압축을 해제 하고 bin 디렉터리에서 아래와 같이 명령어를 수행한다. 물론 그 전에 Java가 설치 되어 있어야 한다.
위와 같이 하였다면 이제 http://localhost:8080/nifi 통해서 접속하면 아래와 같은 화면을 볼수 있다. (다만 모든 패키지를 로딩 하는데에는 꽤나 시간이 걸리므로 시스템에 따라서 잠깐 기다리면 된다.)
아파치 nifi에서는 인증을 위해서 LDAP, Kerberos를 이용한 사용자 인증과 OpenID 혹은 Apache Knox를 통한 방법을 제공한다. 다만 아쉬운점은 HTTP 베이직 인증을 제공하지는 않는다. (제대로된 보안을 위해서라면 위의 방법을 제공하는것이 맞으나 간단하게 구축해서 사용하고자 할때에는 아쉬운 부분이 남는다.)
기본 인증 걸기
https://medium.com/@jayprakash.bilgaye/understanding-ssl-and-ldap-in-hdf-504844bea8b9
https://github.com/LeapBeyond/nifi-tutorials/tree/master/introduction
https://www.batchiq.com/database-ingest-with-nifi.html
% 주의 : Apache NiFi는 FBP툴로서 제공되는 컴포넌트를 통해서 시스템 명령과 다양한 내부 접속이 가능한 툴이다. 만약 기업에서 개발할 때 외부의 데이터 연결을 위해서 공인 IP에 NiFi를 실행하는 것은 해커에서 대문을 열어주는것과 동일하다.
외부에 공개되어야 한다면 전체적인 구성에 대해서는 각 기업의 보안팀에 문의 하고 구축해야 한다. (인증을 걸고 HTTPS의 사용은 기본이며 반드시 연결된 LDAP과 커베로스에 BruteForce 인증 공격에 대한 대비가 되어 있어야 한다. 또한 반드시 내부와는 고립시켜야 한다. 이러한 부분이 관리 되지 않는다면 절대 외부에 오픈하지 않기를 권장한다.)
% 본글은 특정 단체나 기업의 의견이 아닌 개인적인 의견이며 사용된 내용과 이미지는 nifi.apache.org의 문서에 있는 부분을 발취하여 사용하였습니다