English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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에 신고를 할 때는 #을 @으로 바꾸시고, 관련 증거를 제공해 주시면, 사실이 확인되면 이 사이트는 즉시 저작권 침해 내용을 삭제합니다.