이번 챕터에서는 CentOS base docker 이미지 생성을 할 예정
Docker는 설치 되었다는 가정에서 시작
만약 Docker 관련 강의를 듣고싶다면 Youtube 이성미강사님의 따배도 강의를 추천한다.
링크 : Youtube 따배도 강의
docker search centos
docker run -dit --name nn1 centos:7 /bin/bash
Q :여기서 -d 뿐만 아니라 -it 로 실행한 이유?
: -it centos 이미지에는 기본 COMMAND 가 있고, container 가 실행될 때 이 COMMAND 가 실행된다. centos의 경우에는 /bin/bash 이다. 이 bash 가 실행되기 위해서는 "터미널"이 필요하다. 그래서 --it 옵션을 통해서 interactive 한 pseudo tty를 할당하는 것이다.이렇게 안 하면 run을 해서 container가 생성되어도 바로 stop 상태가 된다.
이후에 다시 docker start 해도 같은 결과를 낳는다. 그러니 꼭 이 옵션은 지정한다.그리고 꼭 위와 같은 경우가 아니더라도, 이후에 container에 bash로 접속하기 위해서는 이 설정을 켜줘야 한다. bash는 결국 terminal 이 있어야 동작하는 프로그램이라는 것을 잊지 말자.
[참조] https://velog.io/@dailylifecoding/docker-install-centos-and-run-basic
docker exec -it nn1 /bin/bash
# 현재 갖고있는 패키지 최신화
yum update -y
# 필요 라이브러리 설치
yum install vim wget unzip ssh openssh-* sudo net-tools -y
: Apache 계열의 프레임워크는 JVM 계열에서 작동하므로 Java설치가 필수적이다.
# 자바 1.8버전 설치
yum install java-1.8.0-openjdk-devel -y
# 자바 설치 버전 확인
javac -version
# 자바 설치경로 찾기
readlink -f /usr/bin/java
# 환경변수 편집
vim /etc/profile
# 작성내용
### JAVA ENV
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre/bin/java
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
# 환경변수 적용
source /etc/profile
# 적용 확인
# echo $JAVA_HOME
# echo $PATH
# echo $CLASSPATH
아파치 hadoop release 확인
주소 : https://hadoop.apache.org/releases.html
release 버전 확인 후 원하는 버전의 binary url을 wget으로 다운로드 후 압축해제
# 설치파일 관리용 디렉토리 생성
mkdir /install_dir && cd /install_dir
# Hadoop 3.2.2 설치
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz
# Hadoop 3.2.2 압축 해제
tar -zxvf hadoop-3.2.4.tar.gz -C /usr/local
# Hadoop 디렉토리 이름 변경
mv /usr/local/hadoop-3.2.4 /usr/local/hadoop
# 환경설정 파일 수정
vim /etc/profile
PATH 뒤에 ":/usr/local/hadoop/bin" 추가
PATH 뒤에 ":/usr/local/hadoop/sbin" 추가
HADOOP_HOME="/usr/local/hadoop"
# 추가 후 변동사항 적용
source /etc/profile
# 개인 변수선언
vim ~/.bash_profile
맨 밑에 아래 내용 추가 후 저장
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
# 변동사항 적용
source ~/.bash_profile
# hdfs-site 수정
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
# 아래 내용으로 수정 후 저장
<configuration>
<!-- configuration hadoop -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/data/nameNode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/data/dataNode</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/data/dfs/journalnode</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>my-hadoop-cluster</value>
</property>
<property>
<name>dfs.ha.namenodes.my-hadoop-cluster</name>
<value>namenode1,namenode2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode1</name>
<value>nn1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode2</name>
<value>nn2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.my-hadoop-cluster.namenode1</name>
<value>0.0.0.0:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.my-hadoop-cluster.namenode2</name>
<value>0.0.0.0:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://nn1:8485;nn2:8485;dn1:8485/my-hadoop-cluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.my-hadoop-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/ubuntu/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/data/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/data/data</value>
</property>
</configuration>
- hdfs-site.xml 속성
dfs.replication
: HDFS 파일 블록 복제 개수 지정한다.dfs.namenode.name.dir
: NameNode에서 관리할 데이터 디렉토리 경로 지정한다.dfs.datanode.data.dir
: DataNode에서 관리할 데이터 디렉토리 경로 지정한다.dfs.journalnode.edits.dir
: JournalNode는 NameNode의 동기화 상태를 유지한다. 특정 시점에 구성된 fsimage snapshot 이후로 발생된 변경 사항을 editlog라 하며, 해당 데이터의 저장 위치를 설정한다.dfs.nameservices
: Hadoop 클러스터의 네임서비스 이름을 지정한다.dfs.ha.namenodes.my-hadoop-cluster
: Hadoop 클러스터 네임서비스의 NameNode 이름을 지정한다.( “,”콤마로 구분하여 기재한다.)dfs.namenode.rpc-address.my-hadoop-cluster.namenode1
: 클러스터 네임서비스에 포함되는 NameNode 끼리 RPC 통신을 위해 NameNode의 통신 주소를 지정한다.(여기서는 8020포트 사용)dfs.namenode.rpc-address.my-hadoop-cluster.namenode2
: 클러스터 네임서비스에 포함되는 NameNode 끼리 RPC 통신을 위해 NameNode의 통신 주소를 지정한다.(여기서는 8020포트 사용)dfs.namenode.http-address.my-hadoop-cluster.namenode1
: NameNode1(nn1)의 WEB UI 접속 주소를 지정한다. 서버에서 도커로 포트포워딩을 받기 위해 localhost로 세팅함(여기서는 50070포트 사용)dfs.namenode.http-address.my-hadoop-cluster.namenode2
: NameNode2(nn2)의 WEB UI 접속 주소를 지정한다. 서버에서 도커로 포트포워딩을 받기 위해 localhost로 세팅함(여기서는 50070포트 사용)dfs.namenode.shared.edits.dir
: NameNoderk editlog를 쓰고/읽을 JournalNode URL 이다. Zookeeper가 설치된 서버와 동일하게 JournalNode를 설정하면 된다.
(예 : qjournal://nn1:8485;nn2:8485;dn1:8485/my-hadoop-cluster)dfs.client.failover.proxy.provider.my-hadoop-cluster
: HDFS 클라이언트가 Active NameNode에 접근할 때 사용하는 Java class 를 지정한다.dfs.ha.fencing.methods
: Favilover 상황에서 기존 Active NameNode를 차단할 때 사용하는 방법을 기재한다.
(예 : sshfence 그러나 여기서는 shell(/bin/true)를 이용한다.)dfs.ha.fencing.ssh.private-key-files
: ha.fencing.method를 sshfence로 지정하였을 경우, ssh를 경유하여 기존 Active NameNode를 죽이는데. 이 때, passpharase를 통과하기 위해 SSH Private Key File을 지정해야한다.dfs.ha.automatic-failover.enabled
: 장애 복구를 자동으로 할 지에 대한 여부를 지정한다.
# core-site.xml 수정
vim $HADOOP_HOME/etc/hadoop/core-site.xml
# 아래 내용으로 수정 후 저장
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://nn1:9000</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://my-hadoop-cluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>nn1:2181,nn2:2181,dn1:2181</value>
</property>
</configuration>
- core-site.xml 파일 속성
fs.default.name
: HDFS의 기본 통신 주소를 지정한다.fs.defaultFS
: HDFS 기본 파일시스템 디렉토리를 지정한다.ha.zookeeper.quorum
: Zookeeper가 설치되어 동작할 서버의 주소를 기재한다.(여기서 포트는 2181)
: yarn-site.xml에서는 리소스매니저 Web-ui 주소, 노드매니저에서 중간단계 파일 및 로그를 저장할 경로를 정의해줍니다.
# yarn-site.xml 수정
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
# 아래 내용으로 수정 후 저장
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>nn1</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>0.0.0.0:8088</value>
</property>
</configuration>
: MapReduce 어플리케이션 설정 파일이다.
# mapred-site.xml 수정
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
# 아래 내용으로 수정 후 저장
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
# Hadoop hadoop-env.sh 파일 설정
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
# 아래 내용 수정 후 저장
#Java
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
#Hadoop
export HADOOP_HOME=/usr/local/hadoop
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"
export HDFS_ZKFC_USER="root"
export HDFS_JOURNALNODE_USER="root"
: Hadoop의 worker로 동작할 서버 호스트 이름을 설정한다.
# Hadoop workers 편집
vim $HADOOP_HOME/etc/hadoop/workers
# 아래 내용 수정 후 저장
# localhost << 주석 처리 또는 제거
dn1
dn2
dn3
: Hadoop의 master로 동작할 서버 호스트 이름을 설정한다.
# Hadoop masters 편집
vim $HADOOP_HOME/etc/hadoop/masters
# 아래 내용 수정 후 저장
nn1
nn2