::: IT인터넷 :::

Hadoop Edge 노드간 통신 설정하기

곰탱이푸우 2023. 10. 16. 08:20
하둡 클러스터 외부에서 하둡 클러스터에 접근하기 위한 에지 노드를 구성했다.

 

기본 Edge 노드 구성 방법은 아래 문서를 참고한다.
현재 업무에서 하둡 클러스터를 활용하려는 목적은 다음과 같다.
  • 기본 데이터는 MinIO에 업로드한다.
  • 데이터 저장은 HDFS, 데이터 처리는 Spark을 이용한다.
  • Spark Application은 Livy를 통해 Submit한다.
  • AirFlow로 데이터 업로드와 Spark Application 실행을 자동화한다.
  • Jupyter Notebook으로 Livy에 수동으로 Spark Application을 Submit 한다.
  • 사용자는 Spark에 연동 된 Zeppelin으로 HDFS의 데이터를 조회하거나 추출한다.
 
이러한 목적을 위해 구성한 하둡 클러스터와 에지 노드 구조를 그림으로 표현하면 다음과 같다.

 

 

현재 구성 환경 특징

가상 환경에 클러스터 구성

개발 부서가 아니라서 하둡 환경 구축이 가능한 서버는 단 두 대뿐이다.
구분 CPU RAM SSD/HDD
Server 1 10C/20T x2 256G 240GB/2TB/118TB
Server 2 20C/40T x2 512G  480GB/2TB/118TB
 
두 대 밖에 없다보니 실제 물리 서버로 클러스터를 구성할 수 없는 상황이다.
 
이러한 이유로 두 대의 서버에 VirtualBox로 개별 하둡 클러스터를 구축했다.
향후 물리 노드 구성을 대비하여 7개의 가상 머신으로 아래와 같이 구성했다.
  • 필요한 서비스는 포트 포워딩 적용 (Ambari, NameNode UI, Livy Server 등)
  • HDFS 데이터 업로드, MinIO와의 중계는 하둡 엣지 노드 활용
 
구분
vCPU
vRAM
SSD/HDD
Server 1
8vcpu*7
32G*7 (224G)
10TB*2 + 20TB*5 (HDFS 100TB)
Server 2
16vcpu*7
64G*7 (448G)
10TB*2 + 20TB*5 (HDFS 100TB)
 
각 서버의 하둡 클러스터는 다음과 같은 용도로 구분하여 활용한다.
구분
용도
비고
Server 1
데이터 분석, 조회, 임시 저장
팀원 접근 허용
Server 2
파이프라인+장기보관 전용
팀원 접근 차단
 
그러나 가상환경 기반이기 때문에 특정 클러스터에서 다른 클러스터로 데이터 전송이 불가능하다는 문제가 있다.
 

하둡 클러스터간 파일 전송 불가

실제로 테스트를 해보면 Server 1에서 Server 2의 네임노드에 접근하는 ls, mkdir 등의 명령어는 정상적으로 실행된다.
그러나 Server 1의 Edge 노드에서 Server 2의 HDFS에 파일을 업로드 하면 실패한다.
 

실제 발생하는 증상

실제로 copyFromLocal, put 등 데이터 업로드 명령을 실행하면 아래와 같은 오류 로그가 발생한다.
2023-09-07 17:40:47,142 WARN hdfs.DataStreamer: 
                        Exception in createBlockOutputStream blk_1073838908_98131
java.io.EOFException: Unexpected EOF while trying to read response from server
    at org.apache.hadoop.hdfs.protocolPB.PBHelperClient.vintPrefixed(PBHelperClient.java:521)
    at org.apache.hadoop.hdfs.DataStreamer.createBlockOutputStream(DataStreamer.java:1811)
    at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1728)
    at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:713)
2023-09-07 17:40:47,145 WARN hdfs.DataStreamer: 
                        Abandoning BP-245832060-192.168.56.201-1681288112081:blk_1073838908_98131
2023-09-07 17:40:47,153 WARN hdfs.DataStreamer: Excluding datanode DatanodeInfoWithStorage
                        [192.168.56.207:50010,DS-880c6ccd-bd66-4118-87a0-63710d1de44d,DISK]
 
오류 로그에서 호스트 전용 어댑터의 IP인 192.168.56.20x 대역이 출력된다.
Server 1의 에지 노드에서 Server 2에 구축 된 하둡 클러스터의 데이터 노드와 통신이 불가능하다는 것을 의미한다.
 
아래 그림과 같이 Server 1의 에지 노드에서 Server 2의 데이터 노드에 접근하는 것이 불가능하다.
 

문제의 원인

Server 1과 Server 2 모두 가상 환경 기반으로 하둡 클러스터(HDFS)를 구축했다.
  • 가상 머신들은 호스트전용어댑터로 구성 (192.168.56.20x)
  • 외부 통신은 NAT 어댑터로 진행
 
Server 2의 3~7번 노드의 데이터 노드는 모두 동일한 50010 포트를 사용한다.
외부에서 포트포워딩을 하려고 해도 5개 가상 머신에 동일하게 연결하는 것은 불가능하다.
포트포워딩은 특정 포트당 가상머신 1개만 연결 가능하기 대문이다.
 
또한 하둡 클러스터의 데이터 노드가 서로 통신할 때 내부 IP (192.168.56.20x) 대역을 사용한다.
이러한 점으로 인해 서버 외부에서 접근이 불가능하다.
 
 

검토할 수 있는 대안은

의사 분산 모드 적용

가상머신 하나에 모든 기능 설치 (Pseudo Distributed Mode)하면 해결 가능하지만 아래 이유로 제외했다.
  • 실제 물리환경에 가깝게 구축하려는 의도에 부합하지 않음
  • 클러스터를 처음부터 재구축 해야 하는 시간 문제
 

가상 머신의 IP를 브릿지 네트워크로 설정

가상 머신의 IP를 호스트와 동일한 수준의 IP를 적용해도 되지만 아래 이유로 제외했다.
  • 사내 서버망에 위치하여 가상머신이 단독 IP를 부여받으면 보안 정책 적용 의무
  • IP 할당부터 취약점 점검까지 할일이 산더미 같이 늘어남
  • 클러스터를 처음부터 재구축 해야 하는 시간 문제
 
이러한 문제로 인해 내부 통신만 가능한 호스트 전용 어댑터로 구성해 둔 상태이다.
 

에지 노드를 구성하고 에지 노드간 통신으로 해결 (선택)

에지 노드를 A 서버와 B 서버의 하둡 클러스터에 각각 구성하고, 에지 노드간의 SSH 통신을 설정한다.
 
특정 에지 노드에서 상대 에지 노드에 원격으로 명령을 수행하면 클러스터간 통신이 가능하도록 중계할 수 있다.
구분
방법
설명
방법 1
SCP 사용
SCP로 에지노드에 파일 업로드 + SSH 원격 명령으로 HDFS에 업로드
방법 2
MinIO 클라이언트 사용
SSH 원격 명령으로 MinIO 다운로드 및 HDFS 업로드
 
따라서 하둡 클러스터에 모두 에지 노드를 구성하고, 에지 노드간 통신을 설정하여 문제를 해결한다.
Edge 노드간의 통신을 설정하는 목적과 역할은 다음과 같다.
  • 다른 HDFS의 Edge 노드와 통신
  • 다른 Hadoop 클러스터의 HDFS에 파일 업로드와 다운로드
 

해결 방법 적용하기

구체적인 해결 방법

앞서 설명한 해결 방법을 구체적인 절차로 정리하면 다음과 같다.
1. Server 2에 에지 노드를 추가하고 Server 2의 HDFS와 통신을 확인한다.
  • ls, mkdir 의 정상 동작
  • copyFromLocal, put  등 업로드/다운로드의 정상 동작

 

2. Server 2의 Edge 노드는 Server 1의 에지 노드와 SSH 통신을 설정한다.
  • SSH 통신은 SSH Key 기반 인증을 사용하여 비밀번호 입력을 생략한다.
  • SSH 연결 명령 마지막에 실행하고자 하는 명령을 전달한다.
 
3. Server 1의 에지 노드에서 Server 2의 에지 노드에 원격으로 아래 작업을 실행한다.
  • 파일 전송 - Server 2의 에지 노드에 파일 복사 (scp 명령)
  • HDFS 업로드 - Server 2의 노드에서 HDFS로 파일 업로드 (ssh와 hdfs fs -copyFromLocal 명령)
  • 삭제 - Server 2의 에지 노드에서 복사한 파일 삭제 (ssh와 hdfs fs -rm -r -f 명령)
 
4. Server 1과 Server 2의 Edge 노드에서 MinIO Client가 MinIO 서버와 정상 통신하는지 확인한다.
 
이러한 과정을 그림으로 표현하면 다음과 같다.
 
이러한 방식이면 가상 머신으로 설정한 다른 하둡 클러스터에도 접근 가능하다.
 

다른 하둡 클러스터에 Edge 노드 구성

두개 이상의 하둡 클러스터가 있을때 각 클러스터마다 별도의 엣지노드 구성한다.
 
아래 문서를 참고하여 다른 하둡 클러스터에도 Edge 노드를 구성한다.
/etc/hosts 설정에서 서버 명이 잘못 지정되지 않도록 주의한다.
 
 

에지 노드간 SSH Key 설정

Server 1의 에지 노드에 진입하여 Server 2의 에지 노드와 SSH Key 기반 연결을 설정한다.
# 에지 노드
$ ssh docker exec -it -u hadoop hadoop-edge /bin/bash
$ ssh-keygen -t rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2222 hadoop@hdp-edge.bearpooh.com
$ ssh -p 2222 hadoop@hdp-edge.bearpooh.com
 
Server 2의 에지 노드에도 Server 1의 에지 노드와 SSH Key 기반 연결을 설정한다.
 

SSH를 이용하여 원격으로 명령 수행

SSH 연결 명령 뒤에 실행하고자 하는 명령을 추가하여 원격 명령을 실행한다.
 
Server 1의 에지 노드에 hadoop 계정으로 진입한다.
$ docker exec -it -u hadoop hadoop-edge /bin/bash
 
아래 명령의 정상 동작 여부를 확인한다.
그리고 Server 2의 에지노드에서 Server 1의 에지 노드를 대상으로 동일한 방법으로 실행한다.
 

ls 명령어 확인

MinIO의 ls 명령어

mc ls 명령이 정상 동작하는지 확인한다.
# mc ls 명령어 확인
$ ssh hadoop@hdp-edge.bearpooh.com -p 2222 -t 'bash -cli "mc ls minio/ocean"'
 
참고로 bash의 각 옵션을 다음을 의미한다.
  • -c : command 명령어 읽어들임
  • -l : bash가 로그인 쉘로 호출 된 것처럼 동작
  • -i : 스크립트를 대화형(interactive) 모드로 실행
 
아래와 같이 결과가 출력되면 정상 실행 된 것이다.
 

Hadoop의 ls 명령어

hadoop ls 명령이 정상 동작하는지 확인한다.
# hadoop ls 명령어 확인
$ ssh hadoop@hdp-edge.bearpooh.com -p 2222 -t 'bash -cli "hadoop fs -ls /data"'
 
아래와 같이 결과가 출력되면 정상 실행 된 것이다.
 
 

HDFS 파일 원격 업로드 확인

HDFS에 원격으로 파일이 정상적으로 업로드 되는지 확인한다.
# 원격 파일 업로드 확인
$ scp -P 2222 ~/mc hadoop@hdp-edge.bearpooh.com:/home/hadoop/
$ ssh hadoop@hdp-edge.bearpooh.com -p 2222 \
    -t 'bash -cli "hadoop fs -copyFromLocal /home/hadoop/mc /data/pylon/"'
$ ssh hadoop@hdp-edge.bearpooh.com -p 2222 \
    -t 'bash -cli "hadoop fs -ls /data/pylon/"'
$ ssh hadoop@hdp-edge.bearpooh.com -p 2222 \
    -t 'bash -cli "hadoop fs -rm -skipTrash /data/pylon/mc"'
 
아래와 같이 결과가 출력되면 정상 실행 된 것이다.

 

MinIO 파일 원격 업로드 확인

MinIO에 원격으로 파일이 정상적으로 업로드 되는지 확인한다.
# mc 업로드 확인
$ ssh hadoop@hdp-edge.bearpooh.com -p 2222 \
    -t 'bash -cli "mc cp /home/hadoop/mc minio/ocean/"'
$ ssh hadoop@hdp-edge.bearpooh.com -p 2222 -t 'bash -cli "mc ls minio/ocean/"'
$ ssh hadoop@hdp-edge.bearpooh.com -p 2222 -t 'bash -cli "mc rm minio/ocean/mc"'
$ ssh hadoop@hdp-edge.bearpooh.com -p 2222 -t 'bash -cli "mc ls minio/ocean/"'
 
아래와 같이 결과가 출력되면 정상 실행 된 것이다.