Construcción de un entorno distribuido de hadoop y mapreduce basado en tecnología docker
1. Instalar Doker
1. Confirme el entorno del host
-
(si no lo está ya) instale la herramienta lsb-release
apt install lsb-release
-
Ver versión
lsb_release -a
2. Preparar el entorno de instalación
-
sistema de actualización
sudo apt update
sudo apt upgrade
-
Descargar rizo:
sudo apt install curl
3. Instalar ventana acoplable
-
Instalar docker a través de la herramienta curl
curl -fssl https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
-
Confirmar la instalación de la ventana acoplable
sudo docker version
-
(Opcional) Instale docker-compose, la última versión es 1.29.2
Puede visitar https://github.com/docker/compose/releases/ primero para confirmar el número de versión
sudo curl -l "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
-
Agregar cdn de imagen docker doméstico
sudo vi /etc/docker/daemon.json
{ "registry-mirrors":["https://kfp63jaj.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com","http://hub-mirror.c.163.com"] }
-
Vuelva a cargar la ventana acoplable para que cdn surta efecto:
sudo systemctl daemon-reload
sudo systemctl restart docker
Reinicie la ventana acoplable pero encuentre problemas (como se muestra arriba)
Para mayor comodidad, primero instalo un vim (realmente no puedo usar vi)
Así que eliminé la ventana acoplable y la reinstalé y el problema se resolvió.
-
Pruebe si la ventana acoplable puede tomar la imagen y ejecutarla normalmente
-
Ejecute el caso de prueba hello-world
sudo docker run hello-world
-
-
Ver el registro de ejecución de la imagen hello-world
sudo docker ps -a
2. Creación de hadoop y mapreduce basados en tecnología docker
1. Preparar el entorno del contenedor
-
Tome la imagen de ubuntu 18.04 como base para construir el entorno Hadoop
sudo docker pull ubuntu:18.04
-
Compruebe si la imagen se capturó con éxito
sudo docker images
-
Inicie un contenedor con esa imagen de ubuntu
Conectar <host-share-path> con <container-share-path>
sudo docker run -it -v ~/hadoop/build:/home/hadoop/build ubuntu
Parece que el espejo no se puede encontrar en los primeros cdn, luego se informa un error y luego se encuentra el espejo en los siguientes cdn
Después de que se inicie el contenedor, ingresará automáticamente a la consola del contenedor.
-
Instale el software requerido en la consola del contenedor
apt-get update
apt-get upgrade
-
Necesita instalar net-tools (herramientas de administración de red), vim (editor de texto de línea de comando) y ssh (protocolo de inicio de sesión remoto)
apt-get install net-tools vim openssh-server
2. Configurar el servidor ssh
-
Hacer que el servidor ssh se inicie automáticamente
vim ~/.bashrc
Presione o al final del archivo para ingresar al modo de edición y agregue:
/etc/init.d/ssh start
Presiona esc para regresar al modo comando, ingresa: wq para guardar y salir
-
Hacer que los cambios surtan efecto inmediatamente
source ~/.bashrc
-
Configurar el acceso sin contraseña para ssh
ssh-keygen -t rsa
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
3. Instalar jdk8
(Nota: hadoop3.x actualmente solo es compatible con jdk7,8)
-
instalar jdk8
apt-get install openjdk-8-jdk
-
hero jdk en variables de entorno, edite el archivo de configuración de la línea de comandos de bash
vim ~/.bashrc
Al final del archivo agregar:
export java_home=/usr/lib/jvm/java-8-openjdk-amd64/ export path=$path:$java_home/bin
-
Hacer que la configuración de jdk surta efecto inmediatamente
source ~/.bashrc
-
Prueba jdk funcionando correctamente
java -version
4. Guarda la imagen
-
(Opcional) Para iniciar sesión en Docker, debe registrar una cuenta en el sitio web de Docker con anticipación. La ventaja es que puede enviar su propia imagen a Internet.
sudo docker login
-
id del contenedor de consultas
sudo docker ps -a
-
Guardar el contenedor actual como una imagen
sudo docker commit <container id> <image name>
-
Cuando hay demasiados contenedores, puede eliminar el contenedor con el siguiente comando
docker rm -f <containerid>
5. Instalar Hadoop
-
Descargue el tarball binario de Hadoop en la consola host
La versión de Hadoop utilizada en este artículo es 3.2.1, la última versión: 3.3.2
Se pueden descargar otras versiones desde el sitio web oficial de apache hadoop: https://hadoop.apache.org/releases.html
cd /<host-share-path>
<host-share-path> hace referencia a la ruta anterior al crear el contenedor: ~/hadoop/build
wget https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
(La descarga aquí es solo una página web, es inútil, por lo que aún tiene que descargar el paquete comprimido de hadoop usted mismo, ¡comprenda!)
-
Descomprima hadoop en la consola del contenedor
Si no le gusta el nombre del contenedor o no es fácil de escribir, puede cambiarle el nombre
docker rename <原名> <新名>
abre el contenedor
docker exec -it <容器名或容器id> /bin/bash
Si el contenedor no se inicia, primero debe iniciar el contenedor
docker start <容器名或容器id>
cd /<container-share-path>
<container -share-path> hace referencia a la ruta anterior cuando se creó el contenedor: /home/hadoop/build
tar -zxvf hadoop-3.3.2.tar.gz -c /usr/local
(Tenga en cuenta que cuando usé hadoop-3.2.3.tar.gz, tuve problemas con la descompresión, así que reemplacé hadoop-3.3.2.tar.gz)
-
La instalación está completa, verifique la versión de Hadoop
-
Configurar variables de entorno
export hadoop_home=/usr/local/hadoop-3.3.2 export hadoop_yarn_home=$hadoop_home
-
prueba
cd /usr/local/hadoop-3.3.2
./bin/hadoop version
-
-
especificar la ubicación jdk para hadoop
-
Modificar el archivo de configuración
Ejecutar en el directorio de instalación de hadoop
vim etc/hadoop/hadoop-env.sh
Encuentre la ubicación de configuración java_home comentada y cámbiela a la ubicación jdk que acaba de configurar
export java_home=/usr/lib/jvm/java-8-openjdk-amd64/
-
-
configuración en línea de hadoop
-
Configurar el archivo core-site.xml
Ejecutar en el directorio de instalación de hadoop
vim etc/hadoop/core-site.xml
participar
<configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop-3.2.1/tmp</value> <description>abase for other temporary directories.</description> </property> <!-- 配置文件系统的uri,代码中可以通过该地址访问文件系统,使用 hdfsoperator.hdfs_uri 调用 --> <property> <name>fs.defaultfs</name> <value>hdfs://master:9000</value> </property> </configuration>
-
Cooperar con el archivo hdfs-site.xml
Ejecutar en el directorio de instalación de hadoop
vim etc/hadoop/hdfs-site.xml
participar
<configuration> <!-- 配置保存fsimage位置 --> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop-3.2.1/namenode_dir</value> </property> <!-- 配置保存数据文件的位置 --> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop-3.2.1/datanode_dir</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> </configuration>
-
configuración de mapreduce
La descripción de la definición de este archivo de configuración se refiere a:
https://hadoop.apache.org/docs/r<hadoop版本号>/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
-
Configurar mapred-sitio.xml
Ejecutar en el directorio de instalación de hadoop
vim etc/hadoop/mapred-site.xml
participar
<configuration> <!-- mapreduce框架的名字 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 设定hadoop的位置给yarn和mapreduce程序 --> <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>
-
Configurar el archivo yarn-site.xml
Ejecutar en el directorio de instalación de hadoop
vim etc/hadoop/yarn-site.xml
participar
<configuration> <!-- site specific yarn configuration properties --> <!-- 辅助服务,数据混洗 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 设定资源管理服务器的host名称,这个名称(master)将在下个小节中设定--> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> </configuration>
-
-
Configuración de permisos de inicio de servicio
-
Configure los archivos start-dfs.sh y stop-dfs.sh
Ejecutar en el directorio de instalación de hadoop
vim sbin/start-dfs.sh
y
vim sbin/stop-dfs.sh
añadir al principio del archivo
HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
-
Configure los archivos start-yarn.sh y stop-yarn.sh
Ejecutar en el directorio de instalación de hadoop
vim sbin/start-yarn.sh
y
vim sbin/stop-yarn.sh
añadir al principio del archivo
YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root
-
La configuración está completa, guarde la imagen
-
volver al anfitrión
exit
-
Ver contenedores
docker ps
-
cargar contenedor
docker commit <container id> <image name>
-
-
-
Inicie hadoop y configure la red
-
Abra tres consolas host e inicie tres contenedores: un maestro y dos esclavos:
-
Maestro
Asignación de puertos abiertos: 8088 => 8080
sudo docker run -p 8088:8080 -it -h master –-name master <image name>
-
trabajador01
sudo docker run -it -h worker01 –-name worker01 <image name>
-
trabajador02
sudo docker run -it -h worker02 –-name worker02 <image name>
-
Abra /etc/hosts de los tres contenedores respectivamente y complete la información de asignación de las direcciones IP y los nombres de host de cada uno (los tres contenedores deben configurarse de esta manera)
vim /etc/hosts
(También puede usar el siguiente comando para consultar la ip cuando sea necesario: ifconfig<if y config no tienen espacios entre ellos, de lo contrario es otro comando>)
Agregar información (este archivo debe ajustarse cada vez que se inicia el contenedor)
<master的实际ip> master <worker01的实际ip> worker01 <worker02的实际ip> worker02
El contenido del archivo de hosts de los tres hosts es el mismo
-
Comprobar si la configuración es válida
ssh master
ssh worker01
ssh worker02
-
-
Configurar el nombre de host del contenedor de trabajo en el contenedor maestro
cd /usr/local/hadoop-3.3.2
vim etc/hadoop/workers
eliminar localhost, unirse
worker01 worker02
configuración de red completa
-
iniciar hadoop
-
En el host maestro, inicie hadoop
cd /usr/local/hadoop-3.3.2
./bin/hdfs namenode -format
./sbin/start-all.sh
-
Crear un directorio para almacenar archivos en hdfs
Supongamos que el directorio que se creará es: /home/hadoop/input
./bin/hdfs dfs -mkdir -p /home/hadoop/input
./bin/hdfs dfs -put ./etc/hadoop/*.xml /home/hadoop/input
-
Comprobar si la replicación de la distribución es normal
./bin/hdfs dfs -ls /home/hadoop/input
-
-
Ejecute el programa de muestra que viene con mapreduce
-
ejecuta el programa
-
Crear un nuevo directorio /home/hadoop/wordcount
./bin/hdfs dfs -mkdir /home/hadoop/wordcount
-
Cree un nuevo archivo de entrada hello.txt y colóquelo en el directorio /home/hadoop/wordcount/
-
ejecutar programa
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.2.jar wordcount /home/hadoop/wordcount /home/hadoop/wordcount/output
-
-
-
Después de ejecutar, verifique la salida
(Debido a que la tarea original proporcionada por mi servidor en la nube no se puede ejecutar, la reemplacé con la tarea de recuento de palabras)
./bin/hdfs dfs -ls /home/hadoop/wordcount/output
./bin/hdfs dfs -cat /home/hadoop/wordcount/output/*
3. Preguntas y respuestas
P1: Cómo sacar el nodo de nombre del modo seguro.
R1: Antes de cerrar el contenedor, si no se ejecuta el comando stop-all.sh, el nodo de nombre entrará en modo seguro. El comando para salir del modo seguro es el siguiente
./bin/hadoop dfsadmin -safemode leave
P2: Cómo eliminar contenedores en lotes.
A2:
sudo docker container prune
P3: El error connect to host <docker node> puerto 22: conexión rechazada aparece cuando se inicia el servicio hadoop.
A3: El servidor ssh no se inicia, use el siguiente comando para iniciar el servidor ssh
/etc/init.d/ssh start