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

Dettagli su come utilizzare Docker per configurare un cluster distribuito Hadoop

Costruire e部署Hadoop cluster distribuito utilizzando Docker

Ho cercato a lungo online senza trovare documenti su come costruire un cluster distribuito hadoop utilizzando docker, non c'è altro da fare che scriverne uno myself.

1: Preparazione dell'ambiente:

1: Prima di tutto, avere un sistema operativo CentOS7, che può essere installato in un virtual machine.

2: Installare docker in CentOS7, la versione di docker è 1.8.2

I passaggi di installazione sono i seguenti:

<1> Installare la versione specifica di docker 

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

<2> Durante l'installazione potrebbero verificarsi degli errori, è necessario rimuovere questa dipendenza

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

Avvia docker

service docker start

Verifica del risultato dell'installazione:

 

<3> Dopo l'avvio, eseguire docker info mostrerà due righe di avviso come segue

È necessario disabilitare il firewall e riavviare il sistema

systemctl stop firewalld
systemctl disable firewalld
# Attenzione: dopo aver eseguito i comandi sopra elencati, è necessario riavviare il sistema
reboot -h (riavvio del sistema)

<4> L'esecuzione del container potrebbe generare un errore

È necessario disabilitare selinux

Soluzione:

1: setenforce 0 (efficace immediatamente, senza bisogno di riavviare il sistema operativo)

2: modificare il file /etc/selinux/config e impostare SELINUX=disabled, quindi riavviare il sistema per farlo生效

Si consiglia di eseguire entrambi i passaggi, in modo da garantire che selinux sia spento anche dopo il riavvio del sistema

3: è necessario costruire un'immagine di base hadoop, utilizzando il file dockerfile per costruire.

Prima di tutto, costruire un'immagine con funzione ssh, che facilita l'uso futuro. (Ma questo può influenzare la sicurezza del container)

Attenzione: la password dell'utente root in questa immagine è root

Mkdir centos-ssh-root 
Cd centos-ssh-root 
Vi Dockerfile
# 选择一个已有的os镜像作为基础 
FROM centos 
# Autore dell'immagine 
MAINTAINER crxy 
# Installa i pacchetti openssh-server e sudo e imposta il parametro UsePAM di sshd su no 
RUN yum install -y openssh-server sudo 
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config 
# Installa openssh-clients
RUN yum install -y openssh-clients
# Aggiungi l'utente di test root con la password root e aggiungi questo utente a sudoers 
RUN echo "root:root" | chpasswd 
RUN echo "root  ALL=(ALL)    ALL" >> /etc/sudoers 
# Queste due righe sono particolarmente speciali, devono essere presenti su CentOS 6, altrimenti il servizio sshd creato nel container non può accedere 
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key 
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key 
# Avvia il servizio sshd e esponi la porta 22 
RUN mkdir /var/run/sshd 
EXPOSE 22 
CMD ["/usr/sbin/sshd", "-D"]

Comando di costruzione:

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

Ricerca l'immagine appena costruita

 

4: Costruire un'immagine con JDK basata su questa immagine
Attenzione: JDK utilizza la versione 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

Comando di costruzione:

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

Ricerca dell'immagine di costruzione di successo

 

5: Costruisci un'immagine con Hadoop basata su questo'immagine JDK

Attenzione: Hadoop utilizza la versione 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

Comando di costruzione:

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

Ricerca dell'immagine di costruzione di successo

2: Costruzione di un cluster distribuito Hadoop

1: Pianificazione del cluster

Preparati a costruire un cluster con tre nodi, uno principale e due secondari

Node principale: hadoop0 ip: 192.168.2.10

Node secondario 1: hadoop1 ip: 192.168.2.11

Node secondario 2: hadoop2 ip: 192.168.2.12

Ma poiché l'IP cambia dopo il riavvio del container Docker, dobbiamo impostare un IP fisso per Docker. Utilizza pipework per impostare un IP fisso per il container Docker

2: Avvia tre container, rispettivamente come hadoop0, hadoop1, hadoop2

Esegui i seguenti comandi sul host host per impostare il nome dell'host e il nome del container del contenitore e aprire i porti 50070 e 8088 in hadoop0

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查看刚才启动的三个容器

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

验证一下,分别ping三个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
在hadoop1上执行以下操作
cd ~
cd .ssh
ssh-keygen -t rsa(按回车键继续)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop1
在hadoop2上执行以下操作
cd ~
cd .ssh
ssh-keygen -t rsa(按回车键继续)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop2

3:在hadoop0上修改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) Modificare il nome del file: 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) Formattazione

Entrare nella directory /usr/local/hadoop

1. Eseguire il comando di formattazione

bin/hdfs namenode -format

Attenzione: verrà visualizzato un errore durante l'esecuzione perché mancante il comando which, installarlo.

Eseguire il comando seguente per installare

yum install -y which

Vedere il comando seguente per indicare che la formattazione è stata eseguita con successo.

L'operazione di formattazione non può essere eseguita più volte. Se è necessario eseguire la formattazione più volte, utilizzare il parametro -force.

(7) Avviare il pseudo-distribuito hadoop

comando:

sbin/start-all.sh

Nel processo di avvio per la prima volta è necessario inserire yes per confermare.

Usare jps per verificare se il processo è stato avviato correttamente? È possibile vedere i seguenti processi che indicano che l'avvio pseudo-distribuito è stato eseguito con successo

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

(8) ferma il hadoop pseudo-distribuito

comando:

sbin/stop-all.sh

(9) specifica l'indirizzo del nodemanager, modifica il file yarn-site.xml

<property>
  <description>Il nome dell'host dell'RM.</description>
  <name>yarn.resourcemanager.hostname</name>
  <value>hadoop0</value>
 </property>

(10) modifica un file di configurazione di hadoop in hadoop0, etc/hadoop/slaves

elimina tutto il contenuto originale e modifica come segue

hadoop1
hadoop2

(11) esegui il comando nel hadoop0

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

(12) avvia il servizio di cluster distribuito hadoop

esegui sbin/start-all.sh

attenzione: si riceverà un errore durante l'esecuzione, poiché i due nodi secondari mancano del comando which, l'installazione è sufficiente

esegui i seguenti comandi sui due nodi secondari

yum install -y which

avvia il cluster (se il cluster è già in funzione, è necessario fermarlo prima)

sbin/start-all.sh

(13) verifica se il cluster è in funzione

prima di tutto, controlla i processi:

Hadoop0 deve avere questi processi

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

Hadoop1 deve avere questi processi

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

Hadoop2 deve avere questi processi

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

usa un programma per verificare i servizi del cluster

crea un file locale

vi a.txt
ciao a te
ciao a me

carica a.txt su hdfs

hdfs dfs -put a.txt /

Eseguire il programma wordcount

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

Visualizzare il risultato dell'esecuzione del programma

 

Questo significa che il cluster è funzionante.

Accedere ai servizi del cluster tramite il browser
Poiché durante l'avvio del container hadoop0, 50070 e 8088 sono stati mappati ai porti corrispondenti del host

adb9eba7142b        crxy/centos-ssh-root-jdk-hadoop   "/usr/sbin/sshd -D"   Circa un'ora fa   In esecuzione circa un'ora    0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp   hadoop0

Quindi è possibile accedere ai servizi del cluster nel container tramite il host
L'indirizzo IP del host è: 192.168.1.144

http://192.168.1.144:50070/

http://192.168.1.144:8088/

Terza: riavvio dei nodi del cluster

Fermare i tre container e eseguire i seguenti comandi sul host

docker stop hadoop0
docker stop hadoop1
docker stop hadoop2

Dopo aver fermato i container, l'indirizzo IP fisso precedentemente impostato verrà perso. Quando si utilizzano di nuovo questi container, è necessario impostare nuovamente l'indirizzo IP fisso
Prima di tutto, riavviare i tre container che erano stati fermati

docker start hadoop0
docker start hadoop1
docker start hadoop2

Eseguire i seguenti comandi sul host per assegnare un IP fisso al container

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

Deve essere configurata di nuovo la mappatura del nome host e dell'indirizzo IP nel container, è fastidioso scriverlo manualmente ogni volta

Scrivere uno script, 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

Add execution permission

chmod +x runhosts.sh 

Copy this script to all nodes and execute this script separately

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

Command to execute the script

./runhosts.sh

Check if the /etc/hosts file has been added successfully

Note: Some docker versions will not automatically generate the following mappings in the hosts file, so we manually set a fixed ip for the container here, and set the mapping relationship between the hostname and 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

Start the hadoop cluster

sbin/start-all.sh

That's all for this article, I hope it will be helpful to everyone's learning, and I also hope everyone will support and cheer for the tutorial.

Declaration: The content of this article is from the network, the copyright belongs to the original author, the content is contributed and uploaded by Internet users spontaneously, this website does not own the copyright, has not been manually edited, nor does it assume relevant legal liability. If you find any content suspected of copyright infringement, please send an email to: notice#oldtoolbag.com (replace # with @ when sending an email) for reporting, and provide relevant evidence. Once confirmed, this site will immediately delete the content suspected of infringement.

Ti potrebbe interessare