English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

docker를 사용하여 hadoop 분산 클러스터를 구축하는 방법 상세 설명

Docker를 사용하여 Hadoop 분산 클러스터를 배포하는 방법

docker를 사용하여 hadoop 분산 클러스터를 구축하는 문서를 오랫동안 찾지 못했습니다. 결국, 나는 자신이 쓰기로 결정했습니다.

1: 환경 준비:

1먼저 CentOS가 필요합니다.7운영 체제에서 설치할 수 있습니다.

2centos7centos에서 docker를 설치합니다. docker의 버전은1.8.2

설치 단계는 다음과 같습니다:

<1> 지정된 버전의 docker 설치 

yum install -y docker-1.8.2-10.el7.centos 

<2> 설치할 때 오류가 발생할 수 있습니다. 이 의존성을 제거해야 합니다

rpm -e lvm2-7:2.02.105-14.el7.x86_64

docker 시작

service docker start

설치 결과 확인:

 

<3> 실행 후 docker info를 실행하면 아래 두 줄 경고 메시지가 나타납니다

방화벽을 꺼고 시스템을 재시작해야 합니다

systemctl stop firewalld
systemctl disable firewalld
# 주의: 위 명령을 실행한 후 시스템을 재시작해야 합니다
reboot -h(시스템 재시작)

<4> 컨테이너를 실행할 때 오류가 발생할 수 있습니다

selinux를 꺼야 합니다

해결 방법:

1setenforce 0(즉시 적용, 시스템 재시작 없이)

2수정/etc/selinux/config 파일에서 SELINUX=disabled로 설정한 후 시스템을 재시작하여 적용됩니다

두 단계 모두 실행하는 것이 좋습니다. 이렇게 하면 시스템이 재시작된 후 selinux도 꺼진 상태가 됩니다.

3hadoop의 기본 이미지를 구축해야 합니다. dockerfile 파일을 사용하여 구축합니다.

먼저 ssh 기능을 가진 이미지를 빌드하여 후속 사용을 편리하게 합니다。(하지만 이렇게 하면 컨테이너의 보안에 영향을 미칠 수 있습니다)

주의: 이 이미지의 root 사용자의 비밀번호는 root입니다

Mkdir centos-ssh-root 
Cd centos-ssh-root 
Vi Dockerfile
# 기존 os 이미지를 기반으로 선택합니다 
FROM centos 
# 이미지의 작성자 
MAINTAINER crxy 
# openssh 설치-server와 sudo 소프트웨어 패키지를 설치하고 sshd의 UsePAM 파라미터를 no로 설정합니다 
RUN yum install -y openssh-server sudo 
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config 
# openssh 설치-clients
RUN yum install -y openssh-clients
# 테스트 사용자 root를 추가하고 비밀번호를 root로 설정하며 이 사용자를 sudoers에 추가합니다 
RUN echo "root:root" | chpasswd 
RUN echo "root  ALL=(ALL)    ALL" >> /etc/sudoers 
# 아래 두 문장은 특별합니다. CentOS에서6에 반드시 있어야 합니다. 그렇지 않으면 생성된 컨테이너 sshd는 로그인할 수 없습니다 
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key 
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key 
# sshd 서비스를 시작하고 노출합니다22포트 
RUN mkdir /var/run/sshd 
EXPOSE 22 
CMD ["/usr/sbin/sshd", "-D"]

빌드 명령어:

docker build -t=crxy/centos-ssh-root” .

최근 빌드된 이미지를 확인합니다

 

4:이 이미지를 기반으로 jdk를 포함한 이미지를 다시 빌드합니다
주의: jdk는 다음과 같이 사용됩니다1.7버전의

Mkdir centos-ssh-root-jdk 
Cd centos-ssh-root-jdk 
Cp ../jdk-7u75-Linux-x64.tar.gz . 
Vi Dockerfile
FROM crxy/centos-ssh-root
ADD jdk-7u75-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.7.0_75 /usr/local/jdk1.7
ENV JAVA_HOME /usr/local/jdk1.7
ENV PATH $JAVA_HOME/bin:$PATH

빌드 명령어:

docker build -t=crxy/centos-ssh-root-jdk” .

빌드에 성공한 이미지를 검색합니다

 

5:이 jdk 이미지를 기반으로 hadoop를 포함한 이미지를 다시 빌드합니다

주의: hadoop는 다음과 같이 사용됩니다2.4.1버전의。

Mkdir centos-ssh-root-jdk-hadoop 
Cd centos-ssh-root-jdk-hadoop 
Cp ../hadoop-2.4.1.tar.gz . 
Vi Dockerfile
FROM crxy/centos-ssh-root-jdk
ADD hadoop-2.4.1.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.4.1 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

빌드 명령어:

docker build -t=crxy/centos-ssh-root-jdk-hadoop” .

빌드에 성공한 이미지를 검색합니다

두 번째: hadoop 분산 클러스터를 구축합니다

1:클러스터 계획

준비하여 세 개의 노드를 가진 클러스터를 만듭니다. 하나의 메인 노드와 두 개의 서브 노드

메인 노드:hadoop0 ip:192.168.2.10

서브 노드1:hadoop1 ip:192.168.2.11

서브 노드2:hadoop2 ip:192.168.2.12

하지만 docker 컨테이너가 다시 시작될 때 IP가 변경됩니다. 따라서 docker에 고정 IP를 설정해야 합니다. pipework를 사용하여 docker 컨테이너에 고정 IP를 설정합니다

2:세 개의 컨테이너를 시작하여 각각 hadoop0 hadoop으로 사용합니다1 hadoop2

호스트 컴퓨터에서 다음 명령어를 실행하여 컨테이너에 호스트 이름과 컨테이너 이름을 설정하고 hadoop0에서 외부에서 공개적으로 포트를 열고50070 과8088

docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 crxy/centos-ssh-root-jdk-hadoop
docker run --name hadoop1 --hostname hadoop1 -d -P crxy/centos-ssh-root-jdk-hadoop
docker run --name hadoop2 --hostname hadoop2 -d -P crxy/centos-ssh-root-jdk-hadoop

docker ps를 사용하여 just now 시작한 세 개의 컨테이너를 확인합니다

3:이 세 개의 컨테이너에 고정 IP를 설정합니다

1:pipework 다운로드 주소https://github.com/jpetazzo/pipework.git

2:다운로드한 zip 파일을 호스트 서버에 업로드하고 압축해제하고 이름을 변경합니다

unzip pipework-master.zip
mv pipework-master pipework
cp -rp pipework/pipework /usr/local/bin/ 

3:bridge 설치-utils

yum -y install bridge-utils

4:네트워크를 생성합니다

brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0

5:컨테이너에 고정 IP를 설정합니다

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

검증하여, 세 개의 IP에 각각 ping을 해보면 문제가 없음을 확인할 수 있습니다

4:hadoop 클러스터를 설정합니다

먼저 hadoop0에 연결하여 명령어를 사용하여

docker exec -it hadoop0 /bin/bash

다음 단계는 hadoop 클러스터의 설정 과정입니다

1:호스트 이름과 IP의 매핑을 설정하여 세 개의 컨테이너를 수정합니다 vi /etc/hosts

다음 설정을 추가합니다

192.168.2.10  hadoop0
192.168.2.11  hadoop1
192.168.2.12  hadoop2

2:ssh 비밀번호 없이 로그인 설정

hadoop0에서 다음 작업을 수행합니다

cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa(계속 엔터키를 누르세요)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2
hadoop에서1위에서 다음 작업을 수행합니다
cd ~
cd .ssh
ssh-keygen -t rsa(계속 엔터키를 누르세요)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop1
hadoop에서2위에서 다음 작업을 수행합니다
cd ~
cd .ssh
ssh-keygen -t rsa(계속 엔터키를 누르세요)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop2

3hadoop0에서 hadoop 설정 파일을 수정합니다

들어가면/usr/local/hadoop/etc/hadoop 디렉토리

디렉토리 아래의 설정 파일 core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml

(1)hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.7

(2)core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs:<//hadoop0:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/tmp</value>
    </property>
     <property>
         <name>fs.trash.interval</name>
         <value>1440</value>
    </property>
</configuration>

(3)hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.permissions</name>
    <value>false</value>
  </property>
</configuration>

(4)yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property> 
        <name>yarn.log-aggregation-enable</name> 
        <value>true</value> 
    </property>
</configuration>

(5)파일 이름을 수정합니다:mv mapred-site.xml.template mapred-site.xml

vi mapred-site.xml

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

(6)형식화

들어가면/usr/local/hadoop 디렉토리에

1형식화 명령어를 실행하면

bin/hdfs namenode -format

주의: 실행할 때 오류가 발생하면 which 명령이 부족합니다. 설치하면 됩니다

아래 명령어를 통해 설치하세요

yum install -y which

아래 명령어를 통해 성공적으로 형식화되었음을 확인할 수 있습니다.

형식화 작업은 반복해서 수행할 수 없습니다. 반드시 반복형식화를 수행하려면 매개변수를 포함하여-force만 사용하면 됩니다.

(7)가상 분산 hadoop을 시작합니다

명령어:

sbin/시작-all.sh

처음 시작할 때는 yes를 입력하여 확인해야 합니다.

jps를 사용하여 프로세스가 정상적으로 시작되었는지 확인하세요. 아래 몇 가지 프로세스가 보이면 가상 분산이 성공적으로 시작되었습니다

[root@hadoop0 hadoop]# jps
3267 SecondaryNameNode
3003 NameNode
3664 Jps
3397 ResourceManager
3090 DataNode
3487 NodeManager

(8)가상 분산 hadoop을 중지합니다

명령어:

sbin/stop-all.sh

(9)지정nodemanager의 주소를 수정하는 파일yarn-site.xml

<property>
  <description>The hostname of the RM.</description>
  <name>yarn.resourcemanager.hostname</name>
  <value>hadoop0</value>
 </property>

(10)hadoop0의 hadoop 설정 파일 etc를 수정합니다/hadoop/slaves

기존의 모든 내용을 지우고 다음과 같이 수정합니다

hadoop1
hadoop2

(11)hadoop0에서 명령어를 실행합니다

 scp -rq /usr/local/hadoop  hadoop1:/usr/local
 scp -rq /usr/local/hadoop  hadoop2:/usr/local

(12)hadoop 분산 클러스터 서비스를 시작합니다

sbin/시작-all.sh

주의: 실행할 때 오류가 발생할 수 있습니다. 두 개의 슬레이브 노드가 which 명령어를 누락하고 있기 때문입니다. 설치만 하면 됩니다

두 개의 슬레이브 노드에서 다음 명령어를 실행하여 설치합니다

yum install -y which

클러스터를 다시 시작합니다(클러스터가 이미 시작되었다면 먼저 중지해야 합니다)

sbin/시작-all.sh

(13)클러스터가 정상적으로 작동하는지 확인

먼저 프로세스를 확인합니다:

Hadoop0에 이상의 프로세스가 필요합니다

[root@hadoop0 hadoop]# jps
4643 Jps
4073 NameNode
4216 SecondaryNameNode
4381 ResourceManager

Hadoop1이상의 프로세스가 필요합니다

[root@hadoop1 hadoop]# jps
715 NodeManager
849 Jps
645 DataNode

Hadoop2이상의 프로세스가 필요합니다

[root@hadoop2 hadoop]# jps
456 NodeManager
589 Jps
388 DataNode

프로그램을 사용하여 클러스터 서비스를 검증합니다

로컬 파일을 생성합니다

vi a.txt
hello you
hello me

a.txt를 hdfs에 업로드합니다

hdfs dfs -put a.txt /

wordcount 프로그램을 실행합니다

cd /usr/local/hadoop/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /a.txt /out

프로그램 실행 결과를 확인합니다

 

이렇게 되면 클러스터가 정상적으로 작동하는 것을 의미합니다

브라우저를 통해 클러스터의 서비스에 접근합니다
hadoop0 컨테이너를 시작할 때50070과8088호스트 머신의 해당 포트에 매핑되었습니다

adb9eba7142b        crxy/centos-ssh-root-jdk-hadoop   "/usr/sbin/sshd -D"   약一个小时 전   Up 약一个小时    0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp   hadoop0

따라서 여기서 직접 호스트 머신을 통해 컨테이너 내 hadoop 클러스터의 서비스에 접근할 수 있습니다
호스트 머신의 IP는 다음과 같습니다:192.168.1.144

http://192.168.1.144:50070/

http://192.168.1.144:8088/

3: 클러스터 노드 재시작

중지된 세 가지 컨테이너를 호스트 머신에서 실행하는 명령어

docker stop hadoop0
docker stop hadoop1
docker stop hadoop2

컨테이너가 멈춘 후에, 이전에 설정한 고정 IP도 사라집니다. 이러한 몇 가지 컨테이너를 다시 사용할 때는 고정 IP를 다시 설정해야 합니다
먼저 멈춘 세 가지 컨테이너를 다시 시작합니다

docker start hadoop0
docker start hadoop1
docker start hadoop2

호스트 머신에서 아래 명령어를 실행하여 컨테이너에 고정 IP를 다시 설정합니다

pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24

컨테이너에서 호스트 이름과 IP의 맵핑 관계를 다시 설정해야 하므로, 매번 수동으로 작성하는 것은 번거로워합니다

스크립트를 작성합니다, runhosts.sh

#!/bin/bash
echo 192.168.2.10    hadoop0 >> /etc/hosts
echo 192.168.2.11    hadoop1 >> /etc/hosts
echo 192.168.2.12    hadoop2 >> /etc/hosts

실행 권한 추가

chmod +x runhosts.sh 

이 스크립트를 모든 노드에 복사하고 각각 스크립트를 실행합니다

scp runhosts.sh hadoop1:~
scp runhosts.sh hadoop2:~

스크립트 실행 명령어

./runhosts.sh

조회/etc/hosts 파일에 추가되었는지 확인

주의: 일부 docker 버전에서는 hosts 파일에 자동으로 이러한 맵핑이 생성되지 않으므로, 여기서 수동으로 컨테이너에 고정 IP를 설정하고, 호스트 이름과 IP의 맵핑 관계를 설정해야 합니다.

172.17.0.25     hadoop0
172.17.0.25     hadoop0.bridge
172.17.0.26     hadoop1
172.17.0.26     hadoop1.bridge
172.17.0.27     hadoop2
172.17.0.27     hadoop2.bridge

hadoop 클러스터를 시작합니다

sbin/시작-all.sh

이것이 이 글의 모든 내용입니다. 많은 도움이 되었기를 바랍니다. 또한, 양해 부탁드립니다.

안내: 이 글의 내용은 인터넷에서 수집되었으며, 저작권자는 누구인지 알 수 없습니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공 편집도 없으며, 법적 책임도 부담하지 않습니다. 저작권 침해 내용이 발견되면, notice#w 이메일을 통해 알려 주시기 바랍니다.3codebox.com에 신고를 할 때는 #을 @으로 바꾸시고, 관련 증거를 제공해 주시면, 사실이 확인되면 이 사이트는 즉시 저작권 침해 내용을 삭제합니다.

추천해드립니다