참고사항
본 글은 2018년에 기술 조사를 진행하면서 확인한 내용으로, 최신 상황에 맞게 업데이트 하였으나 일부 부족한 내용이 있을 수 있습니다.
빅데이터나 하둡 관련 전문가가 아니기 때문에 셋팅과 기본적인 사용 외에, 하둡과 하둡 생태계 운영의 트러블 슈팅은 잘 모릅니다.
오픈소스 특성상 직접 조사하고 해결해야 하는 부분이 많습니다. 기본 셋팅 관련해서 참고만 부탁 드립니다.
생성한 이미지를 사용하기 위한 스크립트를 작성한다.
Docker 컨테이너 실행할 때 개방하는 포트가 많아서 docker-compose 대신 Shell 스크립트를 사용한다.
HDP Sandbox에 대한 소개와 설치 스크립트 다운로드는 다음 포스팅을 참고한다.
HDP Sandbox 2.6.5 버전을 Docker로 설치하는 방법은 다음 포스팅을 참고한다.
HDP Sandbox 2.6.5 Docker 컨테이너의 HDFS에 데이터 파일 업로드 방법은 다음 포스팅을 참고한다.
설정을 변경한 HDP Sandbox 2.6.5 Docker 컨테이너를 Docker 이미지로 배포하는 방법은 다음 포스팅을 참고한다.
생성한 이미지 사용을 위한 스크립트 작성
sandbox-proxy 이미지를 위한 설정 파일 준비
HDP Sandbox 컨테이너를 생성하고 Ambari에 로그인하는 과정은 다음 포스팅에서 다뤘다.
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 설정 스크립트 파일 다운로드는 다음 포스팅을 참고한다.
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을 이용한 형상 관리는 다음 포스팅을 참고한다.
'::: 데이터 분석 :::' 카테고리의 다른 글
HDP Sandbox 3.0.1 Docker 이미지로 Ambari 로그인하기 (0) | 2021.10.07 |
---|---|
설정 변경하여 배포한 HDP Sandbox의 Docker 이미지 사용 (0) | 2021.10.04 |
설정 변경한 HDP Sandbox 2.6.5의 Docker 이미지 배포 (0) | 2021.09.27 |
HDP Sandbox 2.6.5 접속 관련 참고사항 (0) | 2021.09.23 |
HDP Sandbox 2.6.5 HDFS에 데이터 업로드 하기 (0) | 2021.09.20 |