::: 데이터 분석 :::

배포한 HDP Sandbox Docker 이미지 사용을 위한 스크립트 작성

곰탱이푸우 2021. 9. 30. 08:20
참고사항

본 글은 2018년에 기술 조사를 진행하면서 확인한 내용으로, 최신 상황에 맞게 업데이트 하였으나 일부 부족한 내용이 있을 수 있습니다.
빅데이터나 하둡 관련 전문가가 아니기 때문에 셋팅과 기본적인 사용 외에, 하둡과 하둡 생태계 운영의 트러블 슈팅은 잘 모릅니다.
오픈소스 특성상 직접 조사하고 해결해야 하는 부분이 많습니다. 기본 셋팅 관련해서 참고만 부탁 드립니다.


생성한 이미지를 사용하기 위한 스크립트를 작성한다.
Docker 컨테이너 실행할 때 개방하는 포트가 많아서 docker-compose 대신 Shell 스크립트를 사용한다.

HDP Sandbox에 대한 소개와 설치 스크립트 다운로드는 다음 포스팅을 참고한다.

 

HDP Sandbox 소개와 Docker 셋팅 파일 다운로드

참고사항 본 글은 2018년에 기술 조사를 진행하면서 확인한 내용으로, 최신 상황에 맞게 업데이트 하였으나 일부 부족한 내용이 있을 수 있습니다. 빅데이터나 하둡 관련 전문가가 아니기 때문에

www.bearpooh.com


HDP Sandbox 2.6.5 버전을 Docker로 설치하는 방법은 다음 포스팅을 참고한다.

 

HDP Sandbox 2.6.5 Docker 설정과 Ambari 로그인하기

참고사항 본 글은 2018년에 기술 조사를 진행하면서 확인한 내용으로, 최신 상황에 맞게 업데이트 하였으나 일부 부족한 내용이 있을 수 있습니다. 빅데이터나 하둡 관련 전문가가 아니기 때문에

www.bearpooh.com


HDP Sandbox 2.6.5 Docker 컨테이너의 HDFS에 데이터 파일 업로드 방법은 다음 포스팅을 참고한다.

 

HDP Sandbox 2.6.5 HDFS에 데이터 업로드 하기

참고사항 본 글은 2018년에 기술 조사를 진행하면서 확인한 내용으로, 최신 상황에 맞게 업데이트 하였으나 일부 부족한 내용이 있을 수 있습니다. 빅데이터나 하둡 관련 전문가가 아니기 때문에

www.bearpooh.com


설정을 변경한 HDP Sandbox 2.6.5 Docker 컨테이너를 Docker 이미지로 배포하는 방법은 다음 포스팅을 참고한다.

 

설정 변경한 HDP Sandbox 2.6.5의 Docker 이미지 배포

참고사항 본 글은 2018년에 기술 조사를 진행하면서 확인한 내용으로, 최신 상황에 맞게 업데이트 하였으나 일부 부족한 내용이 있을 수 있습니다. 빅데이터나 하둡 관련 전문가가 아니기 때문에

www.bearpooh.com

 

 

생성한 이미지 사용을 위한 스크립트 작성

sandbox-proxy 이미지를 위한 설정 파일 준비

HDP Sandbox 컨테이너를 생성하고 Ambari에 로그인하는 과정은 다음 포스팅에서 다뤘다.

 

HDP Sandbox 2.6.5 Docker 설정과 Ambari 로그인하기

참고사항 본 글은 2018년에 기술 조사를 진행하면서 확인한 내용으로, 최신 상황에 맞게 업데이트 하였으나 일부 부족한 내용이 있을 수 있습니다. 빅데이터나 하둡 관련 전문가가 아니기 때문에

www.bearpooh.com


HDP Sandbox 설치 Shell 스크립트를 실행하면 sandbox\proxy 폴더 하위에 conf로 시작하는 두 개의 폴더가 생성된다.

  • 해당 폴더 내에는 각각 sandbox-proxy 이미지에서 사용하는 포트를 설정하는 conf 파일들이 존재한다.
  • 설치 Shell 스크립트를 실행해야 생성된다. 실행하지 않으면 존재하지 않는다.


또한 asset 폴더 하위에 nginx.conf 파일이 존재하는데, sandbox-proxy 이미지에서 사용하는 nginx의 설정 파일이다.

생성한 이미지 사용을 위한 Shell 스크립트를 작성하기에 앞서 위의 파일들을 아래와 같은 구조로 준비한다.

root 
  \assets
    \nginx.conf # nginx 서버 설정
  \sandbox\proxy 
    \conf.d
      \http-hdp.conf # nginx 서버에 생성한 이미지가 사용할 http 포트 설정 
    \conf.stream.d
      \tcp-hdp.conf # nginx 서버에 생성한 이미지가 사용할 tcp 포트 설정

 

http-hdp.conf 수정

HDP Sandbox 컨테이너에 특정 포트를 사용하는 서비스를 추가로 설정했다면 Proxy 컨테이너에 해당 포트를 설정해야 한다.
Proxy 컨테이너에 설정하지 않으면 해당 포트로 연결되지 않는다.

http-hdp.conf 파일을 열고 제일 하단에 추가한 포트를 등록한다.
만약 9997 포트를 사용하는 경우 다음과 같이 작성한다.

server { 
    listen 9997; 
    server_name sandbox-hdp.hortonworks.com; 
    location / { 
        proxy_pass http://sandbox-hdp:9997; 
        proxy_http_version 1.1; 
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection $connection_upgrade; 
    } 
}

 

 

hdp-sanbox-run.sh 작성

아래 두 Docker 이미지를 컨테이너로 실행하는 Shell 스크립트를 작성한다.

  • 생성한 hdp-sandbox-265-srteam 이미지
  • sandbox-proxy 이미지


다음과 같은 기능을 포함해야 한다.

  • sandbox-hdp-265-srteam, sandbox-proxy Docker 이미지를 Pull 한다.
  • sandbox-hdp-265-srteam 컨테이너를 생성하고 postgresql 서비스를 재시작한다.
  • sandbox-proxy 컨테이너를 생성하고 nginx 서비스의 포트 연결을 설정한다.
  • Host PC와 sandbox-hdp-265-srteam컨테이너를 연결할 포트들을 설정한다.


다음과 같은 순서로 작성한다.
아래 코드들은 각 기능별로 구분하여 정리했지만, 순서대로 hdp-sandbox-run.sh에 작성하면 된다.

기본 정보 설정
Docker 컨테이너에 대한 기본적인 정보를 설정하는 부분이다.

  • Docker 저장소, Docker 이미지와 컨테이너의 이름과 버전, 네트워크 정보 등을 정의한다.
  • 이미지가 저장소에 없고 로컬에만 존재하는 경우 registry 항목을 "" 으로 정의한다.
# CAN EDIT THESE VALUES 
registry="Docker저장소URL:포트" # 로컬의 이미지를 사용하는 경우 ""로 정의 
name="hdp-265-srteam" 
sandboxContainer="sandbox-hdp" 
version="latest" 
proxyName="hortonworks/sandbox-proxy" 
proxyContainer="sandbox-proxy" proxyVersion="1.0" 
hostName="sandbox-hdp.hortonworks.com" 
networkName="cda"


사용할 포트 정의
sandbox-proxy 컨테이너에서 사용할 포트들을 정의한다.
Cloudera 홈페이지에서 다운로드 한 HDP Sandbox 설정 스크립트 파일에 정의 된 포트 관련 변수를 옮겼다.

HDP Sandbox 설정 스크립트 파일을 사용한 HDP Sandbox 설정은 아래 포스팅을 참고한다.

 

HDP Sandbox 2.6.5 Docker 설정과 Ambari 로그인하기

참고사항 본 글은 2018년에 기술 조사를 진행하면서 확인한 내용으로, 최신 상황에 맞게 업데이트 하였으나 일부 부족한 내용이 있을 수 있습니다. 빅데이터나 하둡 관련 전문가가 아니기 때문에

www.bearpooh.com


HDP Sandbox 설정 스크립트 파일 다운로드는 다음 포스팅을 참고한다.

 

HDP Sandbox 소개와 Docker 셋팅 파일 다운로드

참고사항 본 글은 2018년에 기술 조사를 진행하면서 확인한 내용으로, 최신 상황에 맞게 업데이트 하였으나 일부 부족한 내용이 있을 수 있습니다. 빅데이터나 하둡 관련 전문가가 아니기 때문에

www.bearpooh.com


HDP Sandbox 컨테이너에 특정 포트를 사용하는 서비스를 추가로 설정했다면 해당 포트를 추가한다.

  • http-hdp.conf에 포트를 추가한 경우 httpPorts에 해당 포트를 추가한다.
  • tcp-hdp.conf에 포트를 추가한 경우 tcpPortsHDP에 해당 포트를 추가한다.
# Define ports for HDP Sandbox 
httpPorts=(1080 4200 7777 7788 8000 8080 \ 
    8744 8886 9088 9089 61080 61888 4040 \ 
    6080 8042 8088 8188 8888 9995 11000 \ 
    15000 16010 18081 19888 21000 50070 \ 
    50075 50111 8081 9997) 
# http-hdp.conf에 포트를 추가한 경우 httpPorts에 해당 포트를 추가한다. 

tcpPortsHDF=([2202]=22 [2182]=2181 [4557]=4557 \ 
    [6627]=6627 [6667]=6667 [9090]=9090 \
    [9091]=9091 [15500]=15500)
    
tcpPortsHDP=([12049]=2049 [2201]=22 [2222]=22 \ 
    [1100]=1100 [1111]=1111 [12200]=1220 \ 
    [1988]=1988 [2100]=2100 [2181]=2181 \ 
    [3000]=3000 [4242]=4242 [5007]=5007 \ 
    [5011]=5011 [6001]=6001 [6003]=6003 \ 
    [6008]=6008 [6188]=6188 [8005]=8005 \ 
    [8020]=8020 [8032]=8032 [8040]=8040 \ 
    [8082]=8082 [8086]=8086 [8090]=8090 \ 
    [8091]=8091 [8443]=8443 [8765]=8765 \ 
    [8889]=8889 [8983]=8983 [8993]=8993 \ 
    [9000]=9000 [9996]=9996 [10000]=10000 \ 
    [10001]=10001 [10015]=10015 [10016]=10016 \ 
    [10500]=10500 [10502]=10502 [15002]=15002 \ 
    [16000]=16000 [16020]=16020 [16030]=16030 \ 
    [18080]=18080 [33553]=33553 [39419]=39419 \ 
    [42111]=42111 [50079]=50079 [50095]=50095 \ 
    [60000]=60000 [60080]=60080)
# tcp-hdp.conf에 포트를 추가한 경우 tcpPortsHDP에 해당 포트를 추가한다.

 


사용할 포트 목록 생성
위에 정의한 포트들을 사용하여 sandbox-proxy 컨테이너 실행에 필요한 포트 목록을 생성한다.

  • 생성한 포트 목록은 호스트 PC와 sandbox-proxy의 포트를 연결한다.
  • 각 포트들을 -p 1234:1234 형태로 변환하며, sandbox-proxy 컨테이너 실행할 때 전달 인자로 사용한다.
  • sandbox-proxy 컨테이너는 호스트 PC와 sandbox-hdp 컨테이너의 포트 연결을 수행한다.
# Setting ports for HDP Sandbox

echo "[+] set httpPorts"
for port in ${httpPorts[@]}; do
  ports_http="-p $port:$port $ports_http"
done

echo "[+] set tcpPortsHDF"
for port in ${!tcpPortsHDF[@]}; do
  ports_hdf="-p $port:$port $ports_hdf"
done

echo "[+] set tcpPortsHDP"
for port in ${!tcpPortsHDP[@]}; do
  ports_hdp="-p $port:$port $ports_hdp"
done


원격 저장소에서 sandbox-hdp Docker 이미지 Pull
원격 저장소에서 배포한 sandbox-hdp Docker 이미지를 Pull한다.

  • 원격 저장소를 지정하지 않은 경우 호스트 PC에 해당 이미지가 없는 경우 오류메시지를 출력하고 종료한다.
  • 원격 저장소를 지정한 경우 로컬에 이미지가 없는 경우 Pull하고, 있으면 pass 한다.
# pull the sandbox docker image

if [ ${#registry} -eq 0 ]  # 로컬의 이미지를 사용하는 경우
then
  sandboxRef=$name:$version
  
  _=`docker image list -f reference=$sandboxRef | grep $sandboxRef`
  
  if [ $? -ne "0" ]
  then
    echo "[+] HDP Sandbox image is not exist!"
    exit 1
  fi
else  # 특정 Docker 저장소의 이미지를 사용하는 경우
  sandboxRef=$registry/$name:$version
  
  _=`docker image list -f reference=$sandboxRef | grep $sandboxRef`
  
  if [ $? -ne "0" ]
  then
    echo "[+] Pull the HDP Sandbox image from registry!"
    docker pull $sandboxRef
  fi  
fi


원격 저장소에서 sandbox-proxy Docker 이미지 Pull
원격 저장소에서 sandbox-proxy Docker 이미지를 Pull한다.

  • 원격 저장소를 지정하지 않은 경우 호스트 PC에 해당 이미지가 없는 경우 오류메시지를 출력하고 종료한다.
  • 원격 저장소를 지정한 경우 로컬에 이미지가 없는 경우 Pull하고, 있으면 pass 한다.
  • sandbox-proxy 이미지는 변경과 배포를 하지 않았으므로, hortonwork의 이미지를 사용한다.
# pull the proxy container

if [ ${#registry} -eq 0 ]  # 로컬의 이미지를 사용하는 경우
then
  proxyRef=$proxyName:$proxyVersion
  
  _=`docker image list -f reference=$proxyRef | grep $proxyRef`
  
  if [ $? -ne "0" ]
  then
    echo "[+] HDP Proxy image is not exist!"
    exit 1
  fi
else  # 특정 Docker 저장소의 이미지를 사용하는 경우
  proxyRef=$registry/$proxyName:$proxyVersion
  
  _=`docker image list -f reference=$proxyRef | grep $proxyRef`

  if [ $? -ne "0" ]
  then
    echo "[+] Pull the HDP Proxy image from registry!"
    docker pull $proxyRef
  fi  
fi

 


HDP Sandbox에서 사용할 가상 네트워크 생성
HDP Sandbox에서 사용하기 위한 가상 네트워크를 생성한다.

  • 이미 해당 네트워크가 존재하는 경우 pass한다.
  • 172.31.0.0/16 대역을 사용하며, 기존 Docker 네트워크나 사설망에서 IP 중복을 피하기 위한 목적이다.
  • 172 대역은 사설 IP 중 B 클래스 대역으로 172.10.x.x~172.31.x.x 대역을 사용한다.
  • 172.31.x.x 대역을 이미 사용 중이라면 31을 10~30 사이의 다른 값으로 변경한다.
# Create the HDP Sandbox network

_=`docker network ls | grep $networkName`
if [ $? -ne "0" ]
then
  echo "[+] Create the HDP Sandbox network"
  docker network create --subnet=172.31.0.0/16 --gateway=172.31.0.1 $networkName 2>/dev/null
fi


HDP Sandbox 컨테이너 실행
Docker 저장소에서 Pull한 sandbox-hdp 컨테이너를 실행한다.

  • 컨테이너 중 sandbox-hdp 컨테이너가 이미 존재하는 경우 실행을 중단한다.
  • 다른 sandbox-hdp 컨테이너가 없는 경우 위에서 지정한 네트워크로 컨테이너를 생성한다.
  • 실행되면 설정 정보를 저장한 postgresql 데이터베이스 서비스를 재시작한다.
# Run the HDP Sandbox container

_=`docker ps -a -f name=$sandboxContainer | grep $sandboxContainer`
if [ $? -ne "0" ]
then
  echo "[+] Run the HDP Sandbox container"

  docker run --privileged --name $sandboxContainer -h $hostName \
		   --add-host="dl.bintray.com:127.0.0.1" \
		   --add-host="repo1.maven.org:127.0.0.1" \
		   --network=cda --network-alias=$hostName \
		   -d $sandboxRef
  sleep 2  # 컨테이너 실행 이후 postgresql 서비스 재시작 위해 2초 대기
  docker exec -t $sandbox Container sh -c "systemctl restart postgresql;"
else
  echo "$sandboxContainer is running! Please check container!"
  exit 1
fi


HDP Proxy 컨테이너 실행
Docker 저장소에서 Pull한 sandbox-proxy 컨테이너를 실행한다.

  • 컨테이너 중 sandbox-proxy 컨테이너가 이미 존재하는 경우 기존 컨테이너를 삭제한다.
  • 사용할 포트 목록 생성 의 포트 목록을 사용하여 hdp-proxy 컨테이너를 생성한다.
# Run the HDP Proxy container

_=`docker ps -a -f name=$proxyContainer | grep $proxyContainer`
if [ $? -eq "0" ]
then
  docker rm -f $proxyContainer 2>/dev/null
fi

echo "[+] Run the HDP Proxy container"

absPath=$(pwd)
docker run --privileged --name $proxyContainer --network=cda \
-v $absPath/assets/nginx.conf:/etc/nginx/nginx.conf \
-v $absPath/sandbox/proxy/conf.d:/etc/nginx/conf.d \
-v $absPath/sandbox/proxy/conf.stream.d:/etc/nginx/conf.stream.d \
$ports_http $ports_hdf $ports_hdp -d $proxyRef

 

 

최종 폴더 구조

스크립트 작성이 완료되면 최종적으로 다음과 같이 배치한다.

root  
    \hdp-sanbox-run.sh
    \assets 
        \nginx.conf   # nginx 서버 설정 
    \sandbox\proxy 
        \conf.d 
            \http-hdp.conf   # nginx 서버에 생성한 이미지가 사용할 http 포트 설정 
        \conf.stream.d 
            \tcp-hdp.conf   # nginx 서버에 생성한 이미지가 사용할 tcp 포트 설정


컨테이너를 최초 실행할 때는 hdp-sandbox-run.sh 파일을 bash shell로 실행한다.

$ bash hdp-sandbox-run.sh


이후 컨테이너를 시작, 종료할 때는 다음 명령을 사용한다.

# sandbox-hdp, sandbox-proxy 컨테이너 종료

$ docker stop sandbox-hdp
$ docker stop sandbox-proxy


# sandbox-hdp, sandbox-proxy 컨테이너 시작

$ docker start sandbox-hdp 
$ docker start sandbox-proxy


컨테이너를 삭제하고자 하는 경우 다음 명령을 사용한다.

# sandbox-hdp, sandbox-proxy 컨테이너 삭제 

$ docker stop sandbox-hdp 
$ docker rm sandbox-hdp 
$ docker stop sandbox-proxy 
$ docker rm sandbox-proxy

 

 

작성한 스크립트 커밋

해당 스크립트를 향후 재사용하기 위해서는 형상 관리 시스템에 커밋하는 것이 좋다.

  • 버전별 변경 사항 추적과 관리가 편리하다.
  • 고정 된 시스템에 보관하므로 분실이나 의도하지 않은 변경의 위험이 적다.


gitlab을 이용한 형상 관리는 다음 포스팅을 참고한다.

 

gitlab에서 group, project 생성하기

gitlab을 설치하는 과정은 이전 포스팅에서 진행했다. 시놀로지 NAS에서 GitLab 설정 방법 개요 시놀로지 NAS에서 GitLab도 설치 가능하며, DS21x 모델 기준으로 DS216 부터 추가되었다. 아마도 Docker를 DS216

www.bearpooh.com

 

gitlab에서 소스코드 작업하기 (clone, checkout, commit, push)

project와 branch까지 만들었으면 코드 개발을 위해 실제 개발 환경에 코드 저장소를 clone 해야 한다. gitlab에서 project 와 branch 생성하는 것은 아래 포스팅을 참고한다. gitlab에서 group, project 생성하..

www.bearpooh.com

 

gitlab에서 소스코드 Pull Request와 Merge 하기

이전 포스팅에서 gitlab에서 clone, checkout, commit, push 등 소스 코드 관련 작업 방법을 다뤘다. gitlab에서 소스코드 작업하기 (clone, checkout, commit, push) project와 branch까지 만들었으면 코드 개..

www.bearpooh.com