본문 바로가기
데이터 엔지니어( 실습 정리 )

도커 컨테이너 실습[하둡hive] 동적 실행

by 세용용용용 2024. 7. 4.

업데이트(Update)

2024-07-03
- 도커 레지스트리 활용 컨테이너 실행으로 스크립트 변경
- proc.sh 스크립트 수정(절차지향 >>> 객체지향) 재 사용성을 위해 수정하였습니다.
- component_proc.py(system_download.txt 배포부터 ~ 컨테이너run 자동화 클래스 구현)

2024-07-04
- 하둡,hive 개념 추가

 

참고 티스토리

리소스 부족으로 인한 프로세스 실행이 불가하면( 선행 작업!! 리소스가 충분하지 않으면....) 

가상환경 리눅스 스왑영역 잡아주기 (tistory.com)

 

가상환경 리눅스 스왑영역 잡아주기

1. 스왑 이미지 실행(디폴트 2기가)swapon /swap.img  기존 top : 스왑영역이 0으로 할당됨 (즉, 현재 메모리 보다 큰 프로세스를 실행하려하면 실행이 안되는 문제가 발생) 스왑설정 top 스왑 2기가 할

sy02229.tistory.com

스왑 영역 할당 해줘!!!!!! 이얏ㅎ호이얏호~!~!

 

하둡 설치 각종 설정파일

하둡 클러스터 운영( 도커 컨테이너 ) 실습[하둡] (tistory.com)

 

하둡 클러스터 운영( 도커 컨테이너 ) 실습[하둡]

1. 하둡 (컨테이너)하둡은 대규모 데이터 처리를 위해 설계된 오픈 소스 소프트웨어 프레임워크입니다. 분산 저장 및 분산 처리를 지원하며, 대량의 데이터를 효율적으로 처리할 수 있는 기능을

sy02229.tistory.com

 

하둡 클러스터 운영( hive 컨테이너 ) 실습[hive] (tistory.com)

 

하둡 클러스터 운영( hive 컨테이너 ) 실습[hive]

1. hive (컨테이너)데이터 웨어하우스 기능을 제공하는 오픈 소스 데이터베이스 관리 시스템입니다. 주로 대용량의 데이터를 다루는 데 사용되며, Hadoop의 일부로 개발 1-1. hive 동작하이브는 Hadoop

sy02229.tistory.com

 

 

hadoop - 빅 데이터 처리를 위한 오픈소스 분산 프레임워크

1. HDFS : 하둡 분산 파일 시스템

- 대용량 데이터를 여러 노드에 저장 및 관리

NameNode
- 메타 데이터 관리하는 노드
- 파일 시스템 디렉토리 구조, 파일과 블록 매핑 정보
- 메타 데이터 관련 노드 이므로 (고 가용성 구축 필요)

DataNode
- 실제 데이터 블록을 저장하는 노드
- 데이터 읽기 및 쓰기 요청 처리
- 데이터 복제 및 분산 저장을 하며 내결함성 제공
내결함성 : 결함이 발생해도 시스템이 정상 동작 하는 능력

DFSZKFailoverController
- hdfs 고가용성 제공을 위한 구성요소
- 네임노드 고가용성을 지원하며, 주키퍼를 이용해 네임노드 장애 자동처리
(동작 구성)
- 두 개 이상 네임노드가 (active/standby) 상태
- 네임노드 장애 발생시, 주키퍼를 이용해 standby 상태 네임노드를 활성 상태로 전환!!

 

2. YARN : 하둡 리소스 관리 프레임워크

- 클러스터 자원을 관리하고 애플리케이션 실행을 조정

Resource manager
- 클러스터 전체 자원 할당을 관리하는 중앙 관리자
- 애플리케이션 실행을 위한 자원을 요청하고 할당

Node manager
- 각 노드에서 실행되며, 해당 노드 자원을 관리
- 자원 사용 정보를 리소스 매니저에 보고

Application master
- 애플리케이션 실행을 관리
- 필요 자원을 리소스 매니저에 요청
1) MapReduce ApplicationMaster
- 하둡 전통인 맵리듀스 작업을 실행하는 애플리케이션 마스터
2) Spark ApplicationMaster
- 스파크 애플리케이션을 실행하는 애플리케이션 마스터

 

3. MapReduce : 대규모 데이터를 처리하는 분산 컴퓨팅 프레임워크

- 데이터 병렬 처리를 위해 맵, 셔플, 리듀스 단계 구성

맵
- 입력 데이터를 분할해(여러 청크로 나눔), 각각의 부분을 병렬처리
- 입력 데이터는 {키,값} 쌍으로 변환
청크 : 대용량 데이터를 분할 처리하기 위한 단위

셔플
- 맵 단계서 생성된 중간 {키,값} 쌍을 정렬
- 동일 키 를 가진 값을 그룹화

리듀스
- 셔플 단계에서 그룹화된 {키,값} 쌍을 처리해 최종결과 생성

 

4. hadoop 컴포넌트

Hbase
- hdfs 위에 구축된 분산 NoSQL 데이터 베이스

Hive
- 데이터 웨어하우징 인프라
- sql 기반 데이터 웨어하우스
- HiveQL 사용해 대규모 데이터 처리 및 분석

Sqoop
- 관계형 데이터베이스와  하둡간 데이터 전송을 용이하게 하는 도구

Spark
- 인메모리 데이터 처리 프레임워크

Flume
- 대규모 데이터 수집, 집계, 이동을 위한 분산 서비스


**rdb, nosql 차이**
RDB : 데이터를 테이블 형식으로 정의, 관계 기반으로 데이터를 관리하는 시스템
Nosql : 비관계형 구조(문서, 키값), 스키마 리스(스키마 정의가 필요없어 데이터 모델 유연하게 변경 가능)

0. system_download.txt

[server_ip]|192.168.56.10|192.168.56.11|192.168.56.12
[zookeeper_ip]|192.168.56.10|192.168.56.11|192.168.56.12
[postgresql_ip]|192.168.56.10
[postgresql_port]|5432
[postgresql_data_directory]|/pgdb/pg_data

------------------------------------------------------------------------------------------------------
[hadoop_ip]|192.168.56.10|192.168.56.11|192.168.56.12
[need_dir]|/hadoop/hdfs_work|/hadoop/hdfs|/hadoop/data1|/hadoop/data2|/hadoop/jn|/hadoop/data|/data/sy0218|/data/download_tar
------------------------------------------------------------------------------------------------------

-----------------------[postgresql.conf-start]-----------------------
[data_director]|'/pgdb/pg_data'
-----------------------[postgresql.conf-end]-----------------------


-----------------------[zoo.cfg-start]-----------------------
[tickTime=]|2000
[initLimit=]|11
[syncLimit=]|5
[dataDir=]|/data/sy0218/apache-zookeeper-3.7.2-bin/data
[clientPort=]|2181
-----------------------[zoo.cfg-end]-----------------------


-----------------------[core-site.xml-start]-----------------------
[hadoop.tmp.dir]|file:///hadoop/hdfs_work/hadoop-root
[ha.zookeeper.quorum]|192.168.56.10:2181,192.168.56.11:2181,192.168.56.12:2181
-----------------------[core-site.xml-end]-----------------------

-----------------------[hdfs-site.xml-start]-----------------------
[dfs.namenode.name.dir]|file:///hadoop/hdfs/nn
[dfs.datanode.data.dir]|file:///hadoop/data1,file:///hadoop/data2
[dfs.journalnode.edits.dir]|/hadoop/jn
[dfs.namenode.rpc-address.my-hadoop-cluster.namenode1]|192.168.56.10:8020
[dfs.namenode.rpc-address.my-hadoop-cluster.namenode2]|192.168.56.11:8020
[dfs.namenode.http-address.my-hadoop-cluster.namenode1]|192.168.56.10:50070
[dfs.namenode.http-address.my-hadoop-cluster.namenode2]|192.168.56.11:50070
[dfs.namenode.shared.edits.dir]|qjournal://192.168.56.10:8485;192.168.56.11:8485;192.168.56.12:8485/my-hadoop-cluster
[dfs.name.dir]|/hadoop/data/name
[dfs.data.dir]|/hadoop/data/data
-----------------------[hdfs-site.xml-end]-----------------------

-----------------------[mapred-site.xml-start]-----------------------
[mapreduce.framework.name]|yarn
-----------------------[mapred-site.xml-end]-----------------------

-----------------------[yarn-site.xml-start]-----------------------
[yarn.resourcemanager.hostname.rm1]|192.168.56.10
[yarn.resourcemanager.hostname.rm2]|192.168.56.11
[yarn.resourcemanager.webapp.address.rm1]|192.168.56.10:8088
[yarn.resourcemanager.webapp.address.rm2]|192.168.56.11:8088
[yarn.resourcemanager.zk-address]|192.168.56.10:2181,192.168.56.11:2181,192.168.56.12:2181
[yarn.nodemanager.resource.memory-mb]|6000
-----------------------[yarn-site.xml-end]-----------------------

-----------------------[hadoop-env.sh-start]-----------------------
[export JAVA_HOME=]|/usr/lib/jvm/java-8-openjdk-amd64
[export HADOOP_HOME=]|/data/sy0218/hadoop-3.3.5
-----------------------[hadoop-env.sh-end]-----------------------

-----------------------[workers-start]-----------------------
192.168.56.10
192.168.56.11
192.168.56.12
-----------------------[workers-end]-----------------------

-----------------------[hive-site.xml-start]-----------------------
[javax.jdo.option.ConnectionURL]|jdbc:postgresql://192.168.56.10:5432/sy0218
[hive.metastore.db.type]|postgres
[javax.jdo.option.ConnectionDriverName]|org.postgresql.Driver
[javax.jdo.option.ConnectionUserName]|hive
[javax.jdo.option.ConnectionPassword]|!hive0218
[hive.metastore.warehouse.dir]|/user/hive/warehouse
-----------------------[hive-site.xml-end]-----------------------

 

 

 

1. entrypoint.sh : 컨테이너 실행시 동작 셋업

/data/hadoop_hive_docker/entrypoint.sh

#!/bin/bash

system_file="/data/system_download.txt"

for core_config_low in $(awk '/\[core-site.xml-start\]/{flag=1; next} /\[core-site.xml-end\]/{flag=0} flag' ${system_file});
do
        file_name=$(find /data/sy0218/*hadoop*/etc -type f -name *core-site.xml*)
        core_site_name=$(echo ${core_config_low} | awk -F '|' '{print $1}' | sed 's/[][]//g')
        core_site_value=$(echo ${core_config_low} | awk -F '|' '{print $2}')
        sed -i "/<name>${core_site_name}<\/name>/!b;n;c<value>${core_site_value}</value>" ${file_name}
done


for hdfs_site_config_low in $(awk '/\[hdfs-site.xml-start\]/{flag=1; next} /\[hdfs-site.xml-end\]/{flag=0} flag' ${system_file});
do
        file_name=$(find /data/sy0218/*hadoop*/etc -type f -name *hdfs-site.xml*)
        hdfs_site_name=$(echo ${hdfs_site_config_low} | awk -F '|' '{print $1}' | sed 's/[][]//g')
        hdfs_site_value=$(echo ${hdfs_site_config_low} | awk -F '|' '{print $2}')
        sed -i "/<name>${hdfs_site_name}<\/name>/!b;n;c<value>${hdfs_site_value}</value>" ${file_name}
done


for mapred_site_config_low in $(awk '/\[mapred-site.xml-start\]/{flag=1; next} /\[mapred-site.xml-end\]/{flag=0} flag' ${system_file});
do
        file_name=$(find /data/sy0218/*hadoop*/etc -type f -name *mapred-site.xml*)
        mapred_site_name=$(echo ${mapred_site_config_low} | awk -F '|' '{print $1}' | sed 's/[][]//g')
        mapred_site_value=$(echo ${mapred_site_config_low} | awk -F '|' '{print $2}')
        sed -i "/<name>${mapred_site_name}<\/name>/!b;n;c<value>${mapred_site_value}</value>" ${file_name}
done


for yarn_site_config_low in $(awk '/\[yarn-site.xml-start\]/{flag=1; next} /\[yarn-site.xml-end\]/{flag=0} flag' ${system_file});
do
        file_name=$(find /data/sy0218/*hadoop*/etc -type f -name *yarn-site.xml*)
        yarn_site_name=$(echo ${yarn_site_config_low} | awk -F '|' '{print $1}' | sed 's/[][]//g')
        yarn_site_value=$(echo ${yarn_site_config_low} | awk -F '|' '{print $2}')
        sed -i "/<name>${yarn_site_name}<\/name>/!b;n;c<value>${yarn_site_value}</value>" ${file_name}
done


hadoop_env_config=$(awk '/\[hadoop-env.sh-start\]/{flag=1; next} /\[hadoop-env.sh-end\]/{flag=0} flag' ${system_file})
while IFS= read -r hadoop_env_config_low;
do
        file_name=$(find /data/sy0218/*hadoop*/etc -type f -name *hadoop-env.sh*)
        hadoop_env_name=$(echo $hadoop_env_config_low | awk -F '|' '{print $1}' | sed 's/[][]//g')
        hadoop_env_value=$(echo $hadoop_env_config_low | awk -F '|' '{print $2}')
        sed -i "s|^${hadoop_env_name}.*$|${hadoop_env_name}${hadoop_env_value}|" ${file_name}
done <<< $hadoop_env_config

file_name=$(find /data/sy0218/*hadoop*/etc -type f -name *workers*)
truncate -s 0 $file_name
for workers_low in $(awk '/\[workers-start\]/{flag=1; next} /\[workers-end\]/{flag=0} flag' ${system_file});
do
        echo $workers_low >> $file_name
done


for hive_site_config_low in $(awk '/\[hive-site.xml-start\]/{flag=1; next} /\[hive-site.xml-end\]/{flag=0} flag' ${system_file});
do
        file_name=$(find /data/sy0218/*apache-hive*/conf -type f -name *hive-site.xml*)
        hive_site_name=$(echo ${hive_site_config_low} | awk -F '|' '{print $1}' | sed 's/[][]//g')
        hive_site_value=$(echo ${hive_site_config_low} | awk -F '|' '{print $2}')
        sed -i "/<name>${hive_site_name}<\/name>/!b;n;c<value>${hive_site_value}</value>" ${file_name}
done

tail -f /dev/null

 
 

1-2. dockerfile 및 필요 설정 샘플파일

# Apache Hive 3.1.3
wget https://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
# Hadoop 3.3.5
wget https://archive.apache.org/dist/hadoop/core/hadoop-3.3.5/hadoop-3.3.5.tar.gz
# PostgreSQL JDBC Driver 42.2.11
wget https://jdbc.postgresql.org/download/postgresql-42.2.11.jar
--------------------------------------------------------
도커 build시 필요 파일
apache-hive-3.1.3-bin.tar.gz
core-site.xml
dockerfile
entrypoint.sh
fair-scheduler.xml
hadoop-3.3.5.tar.gz
hadoop-config.sh
hadoop-env.sh
hdfs-site.xml
hive-site.xml
mapred-site.xml
postgresql-42.2.11.jar
workers
yarn-site.xml

----------------------dockerfile----------------------
# 베이스 이미지
FROM openjdk:8

# bash 및 필요 패키지 설치
RUN apt-get update && apt-get install -y bash wget tar

# 환경 변수 설정
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 \
    HADOOP_HOME=/data/sy0218/hadoop-3.3.5 \
    HADOOP_COMMON_HOME=/data/sy0218/hadoop-3.3.5 \
    HADOOP_MAPRED_HOME=/data/sy0218/hadoop-3.3.5 \
    HADOOP_HDFS_HOME=/data/sy0218/hadoop-3.3.5 \
    HADOOP_YARN_HOME=/data/sy0218/hadoop-3.3.5 \
    HADOOP_CONF_DIR=/data/sy0218/hadoop-3.3.5/etc/hadoop \
    HADOOP_LOG_DIR=/logs/hadoop \
    HADOOP_PID_DIR=/var/run/hadoop/hdfs \
    HADOOP_COMMON_LIB_NATIVE_DIR=/data/sy0218/hadoop-3.3.5/lib/native \
    HADOOP_OPTS="-Djava.library.path=/data/sy0218/hadoop-3.3.5/lib/native" \
    HIVE_HOME=/data/sy0218/apache-hive-3.1.3-bin \
    HIVE_AUX_JARS_PATH=/data/sy0218/apache-hive-3.1.3-bin/aux

ENV PATH=$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$HIVE_HOME/bin:$HIVE_AUX_JARS_PATH/bin:$PATH

# /usr/lib/jvm 디렉토리 생성 및 JDK 복사
RUN mkdir -p /usr/lib/jvm && cp -r /usr/local/openjdk-8 /usr/lib/jvm/java-8-openjdk-amd64

# 하둡 설치 및 설정 파일 복사
RUN mkdir -p /data/sy0218
RUN mkdir -p /data/download_tar
RUN mkdir -p /hadoop/data1
RUN mkdir -p /hadoop/data2
RUN mkdir -p /hadoop/hdfs
RUN mkdir -p /hadoop/hdfs_work
RUN mkdir -p /hadoop/jn
RUN mkdir -p /hadoop/data

# 하둡 tar파일 download_tar 디렉토리 복사
COPY hadoop-3.3.5.tar.gz /data/download_tar/hadoop-3.3.5.tar.gz
COPY apache-hive-3.1.3-bin.tar.gz /data/download_tar/apache-hive-3.1.3-bin.tar.gz
# 하둡 tar파일 원하는 경로에 풀기
RUN tar xzvf /data/download_tar/hadoop-3.3.5.tar.gz -C /data/sy0218/

# 하둡 설정 파일
COPY core-site.xml /data/sy0218/hadoop-3.3.5/etc/hadoop/
COPY hdfs-site.xml /data/sy0218/hadoop-3.3.5/etc/hadoop/
COPY mapred-site.xml /data/sy0218/hadoop-3.3.5/etc/hadoop/
COPY yarn-site.xml /data/sy0218/hadoop-3.3.5/etc/hadoop/
COPY workers /data/sy0218/hadoop-3.3.5/etc/hadoop/
COPY hadoop-env.sh /data/sy0218/hadoop-3.3.5/etc/hadoop/
COPY hadoop-config.sh /data/sy0218/hadoop-3.3.5/libexec/
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

# Hive tar파일 원하는 경로에 풀기
RUN tar xzvf /data/download_tar/apache-hive-3.1.3-bin.tar.gz -C /data/sy0218/

# 설정파일 및 JAR파일 원하는경로 COPY
COPY postgresql-42.2.11.jar /data/sy0218/apache-hive-3.1.3-bin/lib/
COPY hive-site.xml /data/sy0218/apache-hive-3.1.3-bin/conf/

# 컨테이너 내에서 실행할 기본 명령어 설정
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

 
 

2. hadoop_hive 도커 run 예시

docker run -d \
--name hadoop_hive \
--network host \
-v /root/.ssh:/root/.ssh \
-v /hadoop:/hadoop \
-v /var/run/hadoop/hdfs:/var/run/hadoop/hdfs \
-v /data/work/system_download.txt:/data/system_download.txt \
hadoop_hive:3.3.5

2-1. hadoop_hive_docker_pull.sh : 이미지 도커 레지스트리에 pulㅣ

/data/docker_sh/hadoop_hive_docker_pull.sh

#!/usr/bin/bash

# 인자 개수 확인
if [ "$#" -ne 3 ]; then
        echo "Usage: $0 <docker_registry> <docker_images_name> <tag>"
        exit 1
fi

zoo_server_file="/data/work/system_download.txt"
zoo_array=($(cat ${zoo_server_file} | grep hadoop_ip | awk -F '|' '{for(i=2; i<=NF; i++) print $i}'))
len_zoo_array=${#zoo_array[@]}

docker_registry=$1
docker_images_name=$2
docker_images_tag=$3

for ((i=0; i<len_zoo_array; i++));
do
        current_ip=${zoo_array[$i]}
        echo "하둡-hive 이미지 레지스트리 >>> pull >>> 서버:$current_ip"
        ssh ${current_ip} "docker pull ${docker_registry}/${docker_images_name}:${docker_images_tag}"
done

 

 

2-2. hadoop_hive_docker_run.sh : 각 서버 hadoop_hive 도커 컨테이너 run

/data/docker_sh/hadoop_hive_docker_run.sh

#!/usr/bin/bash

# 인자 개수 확인
if [ "$#" -ne 4 ]; then
        echo "Usage: $0 <docker_registry> <docker_images_name> <tag> <docker_run_name>"
        exit 1
fi

system_file="/data/work/system_download.txt"
ip_array=($(grep hadoop_ip ${system_file} | awk -F '|' '{for(i=2; i<=NF; i++) print $i}'))
len_ip_array=${#ip_array[@]}

hadoop_need_dir=($(grep need_dir ${system_file} | awk -F '|' '{for(i=2; i<=NF; i++) print $i}'))
len_need_dir=${#hadoop_need_dir[@]}

docker_registry=$1
docker_images_name=$2
docker_images_tag=$3
docker_run_name=$4

for ((i=0; i<len_ip_array; i++)); do
        current_ip=${ip_array[$i]}

        for ((j=0; j<len_need_dir; j++)); do
                current_dir=${hadoop_need_dir[$j]}
                echo "${current_ip} 서버 필요 디렉토리 삭제 후 생성 $current_dir"
                ssh ${current_ip} "rm -rf ${current_dir}"
                ssh ${current_ip} "mkdir -p ${current_dir}"
                done

        echo "hadoop_hive 컨테이너 시작서버:$current_ip"
        ssh ${current_ip} "docker run -d --name ${docker_run_name} --network host -v /root/.ssh:/root/.ssh -v /hadoop:/hadoop -v /var/run/hadoop/hdfs:/var/run/hadoop/hdfs -v /data/work/system_download.txt:/data/system_download.txt ${docker_registry}/${docker_images_name}:${docker_images_tag}"
done

 
컨테이너 run 확인

 
 

2-3. hadoop_hive 컨테이너  하둡 실행 파일 local 복사

/data/docker_sh/hadoop_hive_cp_to_local.sh

#!/usr/bin/bash

# 인자 개수 확인
if [ "$#" -ne 1 ]; then
        echo "Usage: $0 <container_name>"
        exit 1
fi

container_name=$1
system_file="/data/work/system_download.txt"
ip_array=($(cat ${system_file} | grep hadoop_ip | awk -F '|' '{for(i=2; i<=NF; i++) print $i}'))
len_ip_array=${#ip_array[@]}

for ((i=0; i<len_ip_array; i++));
do
        current_ip=${ip_array[$i]}
        echo "docker cp 작업중인 주소: ${current_ip}"
        ssh ${current_ip} "docker cp ${container_name}:/data/sy0218/ /data/"
done

 
 

3. 리팩토링 (/data/work/component_proc_sh/component_proc.py)  - 객체지향 프로그래밍

/data/work/component_proc_sh/component_proc.py

#!/usr/bin/python3

import subprocess
import sys
from datetime import datetime

# DockerManager 클래스 정의
class DockerManager:
    # 생성자 메서드 : 클래스의 인스턴스가 생성될 때 자동으로 호출, 클래스의 인스턴스 변수들을 초기화!!
    # self : 인스턴스 메서드를 호출하거나 변수에 접근하는 특별한 매개변수
    def __init__(self, docker_build_dir, docker_registry, docker_images_name, docker_images_tag, docker_run_name):
        self.docker_build_dir = docker_build_dir
        self.docker_registry = docker_registry
        self.docker_images_name = docker_images_name
        self.docker_images_tag = docker_images_tag
        self.docker_run_name = docker_run_name

    def log(self, message):
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Time_Stamp : {message}")

    def system_download(self):
        self.log("각 서버 최신화 system_download.txt 배포 Start....")
        subprocess.run(['/data/work/scp_system_download_txt.sh'], check=True)
        self.log("각 서버 최신화 system_download.txt 배포 End....")
        print("")

    def docker_build(self):
        self.log("docker build Start....")
        subprocess.run([
            'docker', 'build', '-t',
            f"{self.docker_registry}/{self.docker_images_name}:{self.docker_images_tag}",
            self.docker_build_dir], check=True)
        self.log("docker build End....")
        print("")

    def docker_push(self):
        self.log("docker registry Push Start....")
        subprocess.run([
            'docker', 'push',
            f"{self.docker_registry}/{self.docker_images_name}:{self.docker_images_tag}"], check=True)
        self.log("docker registry Push End....")
        print("")

    def docker_registry_check(self):
        self.log("docker registry Check Start....")
        subprocess.run([
            'curl', '-X', 'GET',
            f"http://{self.docker_registry}/v2/zookeeper/tags/list"], check=True)
        self.log("docker registry Check End....")
        print("")

    def docker_pull(self):
        self.log("docker Pull Start")
        if self.docker_run_name == 'zookeeper':
            subprocess.run([
                '/data/docker_sh/zookeeper_docker_pull.sh',
                self.docker_registry,
                self.docker_images_name,
                self.docker_images_tag], check=True)
        elif self.docker_run_name == 'postsql':
            subprocess.run([
                '/data/docker_sh/postgresql_docker_pull.sh',
                self.docker_registry,
                self.docker_images_name,
                self.docker_images_tag], check=True)
        elif self.docker_run_name == 'hadoop_hive':
            subprocess.run([
                '/data/docker_sh/hadoop_hive_docker_pull.sh',
                self.docker_registry,
                self.docker_images_name,
                self.docker_images_tag], check=True)
        self.log("docker Pull End")
        print("")

    def docker_run(self):
        self.log("docker Run Start....")
        if self.docker_run_name == 'zookeeper':
            subprocess.run([
                '/data/docker_sh/zookeeper_docker_run.sh',
                self.docker_registry,
                self.docker_images_name,
                self.docker_images_tag,
                self.docker_run_name], check=True)
        elif self.docker_run_name == 'postsql':
            subprocess.run([
                '/data/docker_sh/postgresql_docker_run.sh',
                self.docker_registry,
                self.docker_images_name,
                self.docker_images_tag,
                self.docker_run_name], check=True)
        elif self.docker_run_name == 'hadoop_hive':
            subprocess.run([
                '/data/docker_sh/hadoop_hive_docker_run.sh',
                self.docker_registry,
                self.docker_images_name,
                self.docker_images_tag,
                self.docker_run_name], check=True)
        self.log("docker Run End....")
        print("")

    def copy_container_to_local(self):
        self.log("Copy container_to_local Start....")
        if self.docker_run_name == 'hadoop_hive':
            subprocess.run([
                '/data/docker_sh/hadoop_hive_cp_to_local.sh',
                self.docker_run_name], check=True)
        self.log("Copy container_to_local End....")

    def run(self):
        self.log("docker auto Start....")
        if self.docker_run_name == 'hadoop_hive':
            self.system_download()
            self.docker_build()
            self.docker_push()
            self.docker_registry_check()
            self.docker_pull()
            self.docker_run()
            self.copy_container_to_local()
        else:
            self.system_download()
            self.docker_build()
            self.docker_push()
            self.docker_registry_check()
            self.docker_pull()
            self.docker_run()
        self.log("docker auto End....")

    def test(self):
        self.copy_container_to_local()

if __name__ == "__main__":
    args = sys.argv[1:]
    # 인자가 5개가 아니면 종료
    if len(args) != 5:
        print("사용법: script.py <docker_build_dir> <docker_registry> <docker_images_name> <tag> <docker_run_name>")
        sys.exit(1)
    # 각 인자를 변수로 저장
    docker_build_dir, docker_registry, docker_images_name, docker_images_tag, docker_run_name = args

    # 컨테이너 run 파이프라인 실행
    manager = DockerManager(docker_build_dir, docker_registry, docker_images_name, docker_images_tag, docker_run_name)
    manager.run()
    #manager.test()

 

실행 명령

./component_proc.py /data/hadoop_hive_docker 192.168.56.10:5000 hadoop_hive 3.3.5 hadoop_hive

 

4. 하둡 실행

4-1. hdfs zkfc -formatZK(master1) : HDFS(ZooKeeper Failover Controller)를 포맷하는 데 사용
- ZKFC의 상태를 초기화하고 주키퍼에 새로운 ZKFC 데이터를 포맷

4-2. start-dfs.sh(master1) : 하둡 분산 파일 시스템(HDFS)의 구성 요소를 시작하는 스크립트
/data/sy0218/hadoop-3.3.5/sbin/start-dfs.sh

4-3. hdfs namenode -format(master1)  : HDFS 네임노드를 포맷

4-4. stop-dfs.sh(master1)  : 하둡 분산 파일 시스템(HDFS)의 구성 요소를 종료하는 스크립트
/data/sy0218/hadoop-3.3.5/sbin/stop-dfs.sh
/data/sy0218/hadoop-3.3.5/sbin/stop-all.sh

4-5. start-all.sh(master1)  : 하둡(Hadoop) 클러스터의 여러 구성 요소를 시작
/data/sy0218/hadoop-3.3.5/sbin/start-all.sh

4-6. hdfs namenode -bootstrapStandby(master2) : Hadoop 클러스터에서 하나의 네임노드를 부트스트래핑하여 스탠바이 네임노드로 설정
/data/sy0218/hadoop-3.3.5/sbin/stop-all.sh(master1)
/data/sy0218/hadoop-3.3.5/sbin/start-all.sh(master1)

hdfs haadmin -getServiceState namenode1(master1)
hdfs haadmin -getServiceState namenode2(master1)

 
 

5. hive 기동

1. Apache Hive의 메타스토어 데이터베이스를 초기화
/data/sy0218/apache-hive-3.1.3-bin/bin/schematool -initSchema -dbType postgres


2. HiveServer2를 백그라운드에서 실행하며 로그를 지정된 파일에 기록
mkdir -p /hive/log
nohup hive --service hiveserver2 >> /hive/log/hiveserver2.log 2>&1 &

 
 

6. 하둡_hive 동작 확인

jps 확인

 
hive