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

Explicación detallada de cómo usar docker para construir un clúster distribuido hadoop

Construir y desplegar un clúster distribuido de Hadoop utilizando Docker

Busqué mucho tiempo en línea y no encontré documentos sobre cómo construir un clúster distribuido de Hadoop utilizando Docker, no tengo más remedio que escribir uno yo mismo.

Primero: Preparación del entorno:

1:Primero debe haber un CentOS7Sistema operativo, que puede instalarse en una máquina virtual.

2:Primero debe haber un CentOS7Instalar docker en: en CentOS, el sistema operativo, puede instalarse en una máquina virtual.1.8.2

Los pasos de instalación son los siguientes:

<1> Instalar una versión específica de docker 

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

<2> Puede producirse un error durante la instalación, es necesario eliminar esta dependencia

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

Iniciar docker

service docker start

Verificación del resultado de la instalación:

 

<3> Después de iniciar, al ejecutar docker info se verán las siguientes dos líneas de advertencia

Es necesario desactivar el cortafuegos y reiniciar el sistema

systemctl stop firewalld
systemctl disable firewalld
#Atención: después de ejecutar el comando anterior, es necesario reiniciar el sistema
reboot -h (reinicio del sistema)

<4> Al ejecutar el contenedor puede producirse un error

Es necesario desactivar SELinux

Solución:

1:setenforce 0 (efectivo inmediatamente, sin necesidad de reiniciar el sistema operativo)

2:modificación/etc/selinux/En el archivo de configuración, SELINUX debe estar configurado como disabled, luego reiniciar el sistema para que surta efecto.

Se recomienda ejecutar ambos pasos, para asegurar que SELinux también esté en estado apagado después de que el sistema se reinicie.

3Es necesario construir primero una imagen básica de Hadoop, utilizando el archivo Dockerfile para la construcción.

Primero, construya una imagen con funcionalidad ssh para facilitar su uso posterior. (Pero esto puede afectar la seguridad del contenedor.)

注意:这个镜像中的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 
# 下面这两句比较特殊,在centos6上必须要有,否则创建出来的容器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” .

consulta la imagen construida con éxito

 

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” .

consulta la imagen construida con éxito

dos: construir la集群 distribuida hadoop

1:plan de la集群

preparar para construir una集群 con tres nodos, uno principal y dos desde

nodo principal: hadoop0 ip:192.168.2.10

nodo desde1:hadoop1 ip:192.168.2.11

nodo desde2:hadoop2 ip:192.168.2.12

pero después de que el contenedor docker se reinicie, la IP cambiará, por lo que necesitamos configurar IP fija para docker. Usar pipework para configurar IP fija para el contenedor docker

2:iniciar tres contenedores, respectivamente como hadoop0 hadoop1 hadoop2

ejecutar el siguiente comando en el host de host, configurar el nombre de host y el nombre del contenedor del contenedor y abrir el puerto en hadoop050070 y8088

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

usar docker ps para ver los tres contenedores recién iniciados

3:asignar IP fija a estos tres contenedores

1:descargar la dirección de descarga de pipeworkhttps://github.com/jpetazzo/pipework.git

2:cargar el paquete zip descargado al servidor de host, descomprimir, cambiar el nombre

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

3:instalar bridge-utils

yum -y install bridge-utils

4:crear la red

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

5:asignar IP fija a los contenedores

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

verificar, ping a tres IP, si puede pingear significa que no hay problemas

4:configurar la集群 hadoop

primero conectarse a hadoop0, usar el comando

docker exec -it hadoop0 /bin/bash

los siguientes pasos son el proceso de configuración de la集群 hadoop

1:configurar el mapeo de nombre de host y IP, modificar tres contenedores: vi /etc/hosts

agregar la siguiente configuración

192.168.2.10  hadoop0
192.168.2.11  hadoop1
192.168.2.12  hadoop2

2:configurar el inicio de sesión SSH sin contraseña

realizar las siguientes operaciones en hadoop0

cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa( presione Enter repetidamente )
ssh-copy-id -i localhost
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2
en hadoop1realizar las siguientes operaciones
cd ~
cd .ssh
ssh-keygen -t rsa( presione Enter repetidamente )
ssh-copy-id -i localhost
ssh-copy-id -i hadoop1
en hadoop2realizar las siguientes operaciones
cd ~
cd .ssh
ssh-keygen -t rsa( presione Enter repetidamente )
ssh-copy-id -i localhost
ssh-copy-id -i hadoop2

3:en la máquina hadoop0 modificar el archivo de configuración de hadoop

ingresar a/usr/local/hadoop/etc/directorio hadoop

modificar los archivos de configuración core en el directorio-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)cambiar el nombre del archivo: 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)formatear

ingresar a/usr/local/en el directorio hadoop

1y ejecutar el comando de formateo

bin/hdfs namenode -format

Atención: Se producirá un error durante la ejecución porque falta el comando 'which'. Instale el paquete.

Ejecute el siguiente comando para instalar

yum install -y which

Ver el siguiente comando indica que el formateo se realizó con éxito.

La operación de formateo no se puede ejecutar repetidamente. Si es absolutamente necesario repetir el formateo, utilice los parámetros-puede usar 'force'.

(7)iniciar la distribución pseudonómica de hadoop

comando:

sbin/start-all.sh

Durante el primer inicio, se debe ingresar 'yes' para confirmar.

Usar jps para verificar si los procesos se iniciaron correctamente. Ver los siguientes procesos indica que la distribución pseudonómica se inició con éxito

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

(8)detener la distribución pseudonómica de hadoop

comando:

sbin/stop-all.sh

(9)especificar la dirección del nodemanager, modificar el archivo yarn-site.xml

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

(10)Modificar un archivo de configuración de hadoop en hadoop0/hadoop/slaves

Eliminar todo el contenido original, modificarlo como sigue

hadoop1
hadoop2

(11)Ejecute el comando en hadoop0

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

(12)Iniciar el servicio de clúster distribuido de hadoop

Ejecute sbin/start-all.sh

Nota: Se producirá un error durante la ejecución, ya que los dos nodos esclavos carecen del comando which, instálelo

Ejecute los siguientes comandos en los dos nodos esclavos para instalar

yum install -y which

Luego inicie el clúster (si el clúster ya está en ejecución, debe detenerlo primero)

sbin/start-all.sh

(13)Verificar si el clúster funciona correctamente

Primero verifique los procesos:

Se deben tener estos procesos en Hadoop0

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

Hadoop1Se deben tener estos procesos

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

Hadoop2Se deben tener estos procesos

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

Usar el programa para verificar el servicio del clúster

Crear un archivo local

vi a.txt
hello you
hello me

Subir a.txt a hdfs

hdfs dfs -put a.txt /

Ejecutar el programa wordcount

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

Verificar el resultado de la ejecución del programa

 

Esto indica que el clúster funciona correctamente.

Acceder al servicio del clúster a través del navegador
Debido a que al iniciar el contenedor hadoop0,50070 y8088se mapea al puerto correspondiente del anfitrión

adb9eba7142b  crxy/centos-ssh-root-jdk-hadoop "/usr/sbin/sshd -D" Hace aproximadamente una hora Subido hace aproximadamente una hora 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp hadoop0

Por lo tanto, se puede acceder directamente al servicio del clúster en el contenedor desde el anfitrión
La dirección IP del anfitrión es:192.168.1.144

http://192.168.1.144:50070/

http://192.168.1.144:8088/

Tres: reiniciar los nodos del clúster

Detener tres contenedores, ejecutar el siguiente comando en el anfitrión

docker stop hadoop0
docker stop hadoop1
docker stop hadoop2

Después de detener los contenedores, la ip fija configurada anteriormente también se eliminará. Al usar estos contenedores nuevamente, es necesario configurar la ip fija nuevamente.
Primero, reactive los tres contenedores que se detuvieron anteriormente

docker start hadoop0
docker start hadoop1
docker start hadoop2

Ejecute el siguiente comando en el anfitrión para establecer ip fija para el contenedor nuevamente

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

También es necesario configurar nuevamente la relación de mapeo entre el nombre de host y la ip en el contenedor, es complicado escribirlo manualmente cada vez

Escribir un 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

Agregar permisos de ejecución,

chmod +x runhosts.sh 

Copie este script a todos los nodos y ejecute este script respectivamente

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

Comando para ejecutar el script

./runhosts.sh

Revisar/etc/¿Se ha añadido con éxito en el archivo hosts?

Nota: En algunas versiones de docker, no se generan automáticamente los siguientes mapeos en el archivo hosts, por lo que aquí configuramos manualmente la ip fija del contenedor y establecemos la relación de mapeo entre el nombre de host y la 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

Iniciar el clúster Hadoop

sbin/start-all.sh

Esto es todo el contenido del artículo, espero que ayude a su aprendizaje y que todos apoyen a Tutorial de Gritar.

Declaración: El contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y se carga por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente y no asume la responsabilidad de las responsabilidades legales. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @ para denunciar, y proporcione la evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.)

Te gustará