::: IT인터넷 :::

Hadoop Edge 노드 구성하기 (1) - 컨테이너 설정 변경

곰탱이푸우 2023. 10. 5. 08:20
현재 하둡 클러스터는 다수의 VirtualBox 가상환경을 이용하여 구성했다.
클러스터의 외부에 있는 다른 서버에서는 데이터 노드 접근이 제한된다.
 
이러한 이유로 HDFS의 데이터를 클러스터 외부로 전송하거나 반대의 작업을 수행하는데 제약 사항이 존재한다.
따라서 클러스터와 외부 환경을 중계하는 에지 노드가 필요하다.
특히 HDFS와 MinIO 간의 데이터 파일 전송을 통해 데이터 파이프라인을 구성하라면 에지노드가 필수적이다.
 
이러한 에지 노드는 다음과 같은 장점이 있다.
  • 일반 사용자에게 클러스터의 내부 구조와 설정을 숨길 수 있다.
  • 보안과 사용자를 효과적으로 관리할 수 있다. 사용자의 클러스터 설정 변경이 불가능하다.
  • 외부 저장소(ex. MinIO)와 HDFS 간의 중계 역할을 수행하며, 추가적인 전처리를 수행할 수 있다.
  • 클러스터 내부에 접근하는 서버를 실행하여, 사용자의 클러스터 직접 접근을 막을 수 있다.
 

 

에지 노드는 중계 역할을 수행하는 것이 주목적이므로 VirtualBox 가상 환경 대신 Docker 컨테이너로 구성한다.
컨테이너 설정 과정을 Dockerfile로 작성해두면 필요할 때 컨테이너만 실행하면 되므로 상당히 편리하다.
아래 내용은 에지 노드 컨테이너 구성 방법을 설명하며, 향후 Dockerfile로 작성하여 관리한다.
 
하둡 클러스터 구성 방법은 아래 문서를 참고한다.
에지 노드를 구성하는 방법은 다음 순서로 진행한다.
 
 

컨테이너 설정 변경

Scala 빌드 에이전트 이미지를 활용하여 하둡 클러스터의 에지 노드를 구성한다.
sr-scala-agent 이미지 생성 방법은 아래 문서를 참고한다.
Hadoop 클라이언트와 MinIO 클라이언트 구성을 위해, 컨테이너 내부의 OS 설정을 변경한다.
sr-scala-agent 이미지는 우분투를 기반으로 구성되어 있음을 참고한다.
 
빌드 에이전트 설정 과정에서 아래 과정은 완료했으므로 생략한다.
  • APT 저장소 설정
  • JAVA 1.8 설치와 환경 변수 설정
  • JVM에 자체서명 인증서 설정 등록

 

컨테이너 실행과 설정 변경

Docker 컨테이너 실행을 위한 아래 과정을 진행한다.
  • 공유 볼륨으로 사용할 폴더 생성
  • 컨테이너 실행 코드 작성
 
컨테이너가 정상적으로 실행되면 아래 사항을 적용한다.
  • 하둡 클라이언트에 접근할 사용자 생성과 권한 부여
  • 기본 패키지 설치
  • SSH와 hosts 설정 변경
 

폴더 생성

공유 볼륨으로 사용할 폴더를 생성한다.
호스트와 컨테이너의 파일 공유를 목적으로 활용한다.
  • HDFS 클라이언트 설정 파일을 컨테이너 내부로 전달
  • HDFS에 업로드 할 파일을 호스트에서 컨테이너 내부로 전달
 
아래와 같이 폴더를 생성한다.
# 에지 노드 작업 폴더 생성
$ mkdir /data2/docker/hadoop-edge

# 공유 볼륨 폴더 생성
$ mkdir /data2/docker/hadoop-edge/workspace

# 에지 노드 폴더로 이동
$ cd /data2/docker/hadoop-edge
 
 

Docker 컨테이너 실행 코드 작성

Docker 컨테이너를 실행하는 코드를 작성한다.
 
docker run 부터 실제 컨테이너를 실행하는 코드이다.
docker run 상단에 작성한 코드는 컨테이너의 속성과 환경 변수에 전달하기 위한 변수 값이다.
Bash 쉘 스크립트이므로 각 변수 값을 사용하기 위해서는 $를 사용해야 한다.
 
또한 호스트와 다른 서버에서도 접근할 수 있어야 하므로, 2222 포트를 22 (SSH)포트에 바인딩한다.
이렇게 설정해두면 해당 컨테이너에 2222 포트를 사용하여 SSH 접근이 가능해진다.
 
자세한 내용은 주석을 참고한다.
$ vi run_hadoop_edge.sh
# 아래 내용 작성하고 :wq로 저장

#!/bin/bash
# Docker 이미지 경로와 버전
REPO_PATH="저장소IP주소:포트"
IMAGE_PATH="ocean/sr-scala-agent"
IMAGE_VER="1.0.0"

# 호스트와 컨테이너 이름 지정
HOST_NAME=hadoop-edge
CONTAINER_NAME=hadoop-edge

# 프록시 설정
HTTP_PROXY="http://프록시서버주소:포트"
# 프록시 설정 예외대상 지정
NO_PROXY="127.0.0.1,127.0.1.1,localhost,대상IP또는FQDN"

# Docker 컨테이너 실행
docker run -i -t -d -h $HOST_NAME \
        # 호스트의 2222 포트를 컨테이너 22 포트와 바인딩
        -p 2222:22 --name $CONTAINER_NAME \    
        --restart always -e TZ=Asia/Seoul \
        # 프록시 환경 변수 전달
        -e http_proxy="$HTTP_PROXY" -e https_proxy=$HTTP_PROXY -e NO_PROXY \    
        # 공유 볼륨 지정
        -v /data2/docker/hadoop8-edge/workspace:/var/workspace \    
        $REPO_PATH/$IMAGE_PATH:$IMAGE_VER
 
sr-scala-agent 이미지의 생성 방법은 아래 문서를 참고한다.

컨테이너 실행과 사용자 추가

컨테이너를 실행하고 root 계정으로 컨테이너 내부에 진입한다.
기본 계정이 jenkins로 되어 있기 때문에, 하둡 클러스터에 접근할때도 불편한 점이 있다.
따라서 root 계정으로 접근하여 hadoop 계정을 생성한다.
 
컨테이너 실행 스크립트에 실행 권한을 부여하고, root 계정으로 컨테이너 내부에 진입한다.
$ chmod +x run_hadoop_edge.sh    # 실행 권한 부여
$ ./run_hadoop_edge.sh    # 컨테이너 실행
$ docker exec -it -u root hadoop-edge /bin/bash    # root 계정으로 내부 진입
 
hadoop 계정을 추가하고 sudo 그룹에 추가한다.
$ adduser hadoop
$ usermod -aG sudo hadoop
 
하둡 컨테이너에 hadoop 계정이 이미 존재한다.
따라서 에지 노드에서 hadoop 계정으로 파일을 업로드하면, 추가적인 impersonate를 하지 않아도 hadoop 계정으로 업로드 된다.
프로덕션 환경에서는 하둡 클러스터와 에지 노드에 사용자 계정을 생성하고 권한을 부여하는 것이 좋다.
 

기본 패키지 설치

root 계정으로 패키지를 설치하고 SSH와 hosts 설정을 변경한다.
APT 저장소 설정은 Scala 빌드 에이전트 생성에서 이미 진행했으므로 생략한다.
 
컨테이너 내부에 필요한 기본 패키지들을 설치한다.
$ apt update
$ apt install ssh systemctl wget language-pack-en language-pack-ko
 
설치한 패키지들은 아래와 같이 사용한다.
  • ssh, systemctl - SSH 설정과 sshd 서비스 재시작에 필요
  • wget - MinIO 클라이언트 파일 다운로드에 필요
  • language-pack-* - SSH 연결할 때 발생하는 Locale 관련 Warning 메시지 방지
 
 

SSHD 설정

하둡 클러스터 외부에서 접근하여 사용할 것이므로 SSH의 환경 설정을 변경한다.
  • 비밀번호 인증 활성화
  • 사용자 환경 변수 유지
 
SSH 환경 설정 변경은 다음과 같이 진행한다.
$ vi /etc/ssh/sshd_config
# 아래 항목 주석 제거 및 yes 설정 후 :wq로 저장
PasswordAuthentication yes
PermitUserEnvironment yes

$ systemctl restart sshd    # sshd 서비스 재시작
$ exit
 

hosts 내용 변경

연상하기 쉬운 FQDN 기반으로 호스트명을 사용하기 위해 hosts의 내용을 변경한다.
동일한 호스트에서 운영 중인 하둡 클러스터의 각 노드들은 호스트전용어댑터로 할당한 IP를 지정한다. (192.168.56.20x)
다른 서버의 하둡 클러스터 노드들은 해당 서버의 물리 IP로 지정한다.
 
아래와 같이 hosts의 내용을 변경한다.
$ vi /etc/hosts
# 아래 내용 추가하고 :wq로 저장
192.168.56.201 bdp01.bearpooh.com
192.168.56.202 bdp02.bearpooh.com
192.168.56.203 bdp03.bearpooh.com

# 다른 클러스터에도 연결하려는 경우
다른클러스터물리IP hdp01.bearpooh.com
다른클러스터물리IP hdp02.bearpooh.com
다른클러스터물리IP hdp-edge.bearpooh.com
 
VirtualBox에서 호스트 전용 어댑터를 사용한 가상 환경으로 클러스터를 구축한 경우 노드 접근에 제한이 있다.
해당 호스트 내부에서만 접근 가능하고 특정 노드에 직접 접근하는 것은 불가능하다.
따라서 접근이 필요한 서비스는 해당 호스트 주소로 접근하고, 포트포워딩 된 포트를 사용해야 한다.
 
 

hadoop 계정으로 SSH 설정 (선택)

해당 컨테이너에 hadoop 계정으로 진입하고, 하둡 클러스터의 각 노드에 SSH 인증키를 복사한다.
SSH를 사용하여 원격 서버에 명령을 실행하려면, 비밀번호 인증이 없는 것이 편리하다.
 
아래와 같이 진행한다.
$ docker exec -it -u hadoop hadoop-edge /bin/bash

$ ssh-keygen -t rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub ambari@bdp01.bearpooh.com
$ ssh-copy-id -i ~/.ssh/id_rsa.pub ambari@bdp02.bearpooh.com
$ ssh-copy-id -i ~/.ssh/id_rsa.pub ambari@bdp03.bearpooh.com
 
에지 노드에서 하둡 클러스터를 관리하기에 편리한 기능이지만 실제 프로덕션 환경에서는 주의해야 한다.
클러스터에 직접 접근을 제한하는 에지 노드 구성 목적에 위배되기 때문이다.
 
따라서 내부에서만 사용하는 인하우스 (In-house) 환경에서만 사용하는 것을 원칙으로 한다.
프로덕션 환경에서는 해당 설정을 제한하거나, 관리자 계정에만 최소한으로 적용한다.
 

Hadoop 클라이언트

Hadoop 클라이언트 설정 방법은 아래 포스팅을 참고한다.