Docker
내가 원하는 환경의 서버를 container라는 개념으로 쉽게 생성 및 삭제할 수 있는 플랫폼.
NiFi
다양한 포맷의 데이터들을 ETL 처리할 수 있는 Flow-Based Programming(FBP) 툴
관련 글
[NiFi] Docker로 NiFi 클러스터 환경에서 HDFS 데이터 분산 수집하기
이번에는 Docker를 이용해서 NiFi와 HDFS 서비스를 실행시키고 간단한 예제를 실습하겠습니다. 예제는 NiFi에서 Processor를 직접 만들고 HDFS 데이터를 수집할 예정입니다.
NiFi & HDFS 서비스 실행하기
docker-compose를 통해 서비스들을 실행하는 방법은 이전 글들에서 많이 다뤘기 때문에 이번 글에서는 간단하게 yml 파일만 명시하겠습니다.
docker-compose.yml |
version: '2' services: ## Hadoop namenode: image: bde2020/hadoop-namenode:1.1.0-hadoop2.8-java8 container_name: namenode-nifi volumes: - ./data/namenode:/hadoop/dfs/name environment: - CLUSTER_NAME=test env_file: - ./hadoop.env ports: - 50070:50070 datanode1: image: bde2020/hadoop-datanode:1.1.0-hadoop2.8-java8 container_name: datanode1-nifi depends_on: - namenode volumes: - ./data/datanode:/hadoop/dfs/data env_file: - ./hadoop.env ports: - 50075:50075 zookeeper: # the configuration manager hostname: zookeeper container_name: zookeeper image: 'bitnami/zookeeper:latest' environment: - ALLOW_ANONYMOUS_LOGIN=yes nifi: image: apache/nifi:latest ports: - 8080:8080 # Unsecured HTTP Web Port environment: - NIFI_WEB_HTTP_PORT=8080 - NIFI_CLUSTER_IS_NODE=true - NIFI_CLUSTER_NODE_PROTOCOL_PORT=8082 - NIFI_ZK_CONNECT_STRING=zookeeper:2181 - NIFI_ELECTION_MAX_WAIT=1 min - NIFI_SENSITIVE_PROPS_KEY=qkrxodn12345 |
yml 파일을 모두 작성했다면 Hadoop 서비스에 필요한 volume mount를 위해 현재 폴더에 "data/namenode", "data/datanode" 폴더를 만듭니다. yml 파일에서 namenode와 datanode 서비스를 보면 이 폴더들을 대상으로 mount를 진행하기 때문입니다.
/* New Docker Compose folder */
$ mkdir -p data/namenode
$ mkdir -p data/datanode
그리고 마지막으로 hadoop.env 파일을 생성해줍니다. 파일의 내용은 아래와 같습니다.
CORE_CONF_fs_defaultFS=hdfs://namenode:8020
CORE_CONF_hadoop_http_staticuser_user=root
CORE_CONF_hadoop_proxyuser_hue_hosts=*
CORE_CONF_hadoop_proxyuser_hue_groups=*
HDFS_CONF_dfs_webhdfs_enabled=true
HDFS_CONF_dfs_permissions_enabled=false
YARN_CONF_yarn_log___aggregation___enable=true
YARN_CONF_yarn_resourcemanager_recovery_enabled=true
YARN_CONF_yarn_resourcemanager_store_class=org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore
YARN_CONF_yarn_resourcemanager_fs_state___store_uri=/rmstate
YARN_CONF_yarn_nodemanager_remote___app___log___dir=/app-logs
YARN_CONF_yarn_log_server_url=http://historyserver:8188/applicationhistory/logs/
YARN_CONF_yarn_timeline___service_enabled=true
YARN_CONF_yarn_timeline___service_generic___application___history_enabled=true
YARN_CONF_yarn_resourcemanager_system___metrics___publisher_enabled=true
YARN_CONF_yarn_resourcemanager_hostname=resourcemanager
YARN_CONF_yarn_timeline___service_hostname=historyserver
YARN_CONF_yarn_resourcemanager_address=resourcemanager:8032
YARN_CONF_yarn_resourcemanager_scheduler_address=resourcemanager:8030
YARN_CONF_yarn_resourcemanager_resource__tracker_address=resourcemanager:8031
현재 폴더의 구조가 위와 같으면 준비가 완료된 상태입니다. 완료가 되었다면 Docker Compose 명령어를 실행해줍니다.
$ docker compose up -d
정상적으로 실행되었다면 "docker compose ps" 명령어로 확인해줍니다.
NiFi Data Flow 만들기
Docker를 통해 NiFi 서비스는 정상적으로 동작하고 있으므로 "localhost:8080/nifi" 웹 주소로 접속해줍니다. 접속했을 때 NiFi 웹 화면에 " Invalid State: The Flow Controller is initializing the Data Flow " 문구가 나타난다면 모든 서비스가 준비될 때까지 기다리면 됩니다.
이제 Processor를 직접 만들어야 합니다. 상단의 메뉴에서 Processor 아이콘을 드래그해서 대쉬보드로 가져옵니다.
가져오면 아래와 같이 Processor 종류를 선택해야하는데 우리는 HDFS에서 데이터를 가져와 NiFi container 서버에 옮길 예정이므로 "ListHDFS", "FetchHDFS", "putFile"을 각각 선택해서 만들어줍니다.
Processor 위에 마우스를 올리면 나타나는 화살표 아이콘 드래그해서 다음 Processor에 이어줍니다. 이 때 relationship 설정은 success로 합니다. 모두 연결을 했다면 아래와 같이 Processor 사이에 Queue가 생긴 것을 확인할 수 있습니다.
사전 작업 및 Processor 실행하기
다음으로는 각 Processor의 설정 값을 넣어주기 전에 각 서비스에서 필요한 파일과 폴더 생성을 진행하겠습니다. 가장 첫번째로는 HDFS에 테스트 파일을 넣어줍니다. (NameNode container에는 vi,vim 명령어가 없으므로 내 로컬 컴퓨터에서 파일 생성 후 docker cp를 통해 옮겨주면 됩니다.) 그리고 NiFi에서 HDFS 폴더에 접근해야하므로 편의상 파일 권한은 777로 지정하겠습니다.
/* NameNode Container */
$ hdfs dfs -mkdir /nifi_test
$ hdfs dfs -put test /nifi_test
$ hdfs dfs -chmod -R 777 /nifi_test
NiFi에서는 HDFS에 접근하기 위해서 hadoop config 파일들이 필요합니다. docker cp 명령어를 통해서 NameNode container -> Local computer -> NiFi container 의 과정으로 파일들을 옮겨주면 됩니다. NameNode에서 옮겨야할 파일들은 아래와 같습니다. NiFi container에 저장할 경로는 원하는 곳으로 해주면 됩니다. 저의 경우에는 "/home/nifi"에 했습니다.
- /etc/hadoop/core-site.xml
- /etc/hadoop/hdfs-site.xml
마지막으로 NiFi Processor들의 설정 값을 넣어줍니다.
- ListHDFS processor
- FetchHDFS processor
- PutHDFS processor
설정 값을 모두 넣어줬으니 좌측에서 ListHDFS부터 실행해줍니다. 각 Processor가 수행되면 이어진 Queue에 적재되는 것을 확인할 수 있습니다.
모든 Processor들이 성공적으로 끝났다면 아래와 같이 In,Out 정보들을 확인할 수 있고 NiFi Container에서 "test" 파일이 저장된 것을 볼 수 있습니다.
References
'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] NiFi의 핵심 개념 및 아키텍쳐 (0) | 2021.11.17 |