1. Introducción
En Hadoop 2.0, los datos de dos NameNodes se comparten en tiempo real. El nuevo HDFS utiliza un mecanismo para compartir, el clúster Quorum Journal Node (JournalNode) o el Sistema de archivos Nnetwork (NFS) para compartir. NFS está en el nivel del sistema operativo y JournalNode está en el nivel de hadoop. Utilizamos el clúster JournalNode para compartir datos (esta también es la práctica habitual). Como se muestra en la siguiente figura, es el diagrama de arquitectura de JournalNode.
Para la sincronización de datos, los dos NameNodes se comunican entre sí a través de un conjunto de procesos independientes llamados JournalNodes. Cuando hay cambios en el espacio de nombres NameNode en el estado activo, se notificará a la mayoría de los procesos de JournalNodes. El NameNode en el estado de espera tiene la capacidad de leer la información de cambio en los JN, y ha estado monitoreando los cambios en el registro de edición, y aplica los cambios a su propio espacio de nombres. El modo de espera puede garantizar que cuando el clúster falle, el estado del espacio de nombres esté completamente sincronizado.
Para los clústeres HA, es importante asegurarse de que solo un NameNode esté activo a la vez. De lo contrario, el estado de los datos de los dos NameNodes será diferente, y los datos pueden perderse o pueden producirse resultados incorrectos. Para garantizar esto, es necesario usar ZooKeeper. Primero, los dos NameNodes en el clúster HDFS se registran en ZooKeeper. Cuando el Active NameNode falla, ZooKeeper puede detectar esta situación y cambiará automáticamente el Standby NameNode al estado Activo.
Dos, arreglo
1. Prepara el medio ambiente
Configure un clúster de 5 servidores aquí, por supuesto, los tres más bajos también se pueden construir.
Versión de Zookeeper: 3.4.7
Versión de Hadoop: 2.7.1
1) Asignación de roles de host
La siguiente es la asignación de roles de cada servidor, que se puede ajustar de acuerdo con el número de sus propios servidores.
1> hadoop01
Zookeeper 、 NameNode 、 DFSZKFailoverController 、 ResourceManager。
2> hadoop02
Zookeeper 、 NameNode2 、 DFSZKFailoverController。
3> hadoop03
Zookeeper 、 DataNode 、 NodeManager 、 JournalNode。
4> hadoop04
Zookeeper 、 DataNode 、 NodeManager 、 JournalNode。
5> hadoop05
Zookeeper 、 DataNode 、 NodeManager 、 JournalNode。
2) Apaga el cortafuegos
El entorno de producción general no requiere el firewall que viene con el sistema. Si no hay un firewall externo, se puede activar, pero se debe permitir que el puerto de comunicación pase a través del firewall. Aquí, en aras de la simplicidad del experimento, el firewall se desactiva directamente.
service iptables status #查看防火墙状态
service iptables start #立即开启防火墙,但是重启后失效。
service iptables stop #立即关闭防火墙,但是重启后失效。
#重启后生效
chkconfig iptables on #开启防火墙,重启后生效。 chkconfig iptables off #关闭防火墙,重启后生效。
3) Configurar nombre de host
Modifique el archivo / etc / sysconfig / network
vim /etc/sysconfig/network
¡¡¡Tenga en cuenta que el nombre de host del clúster donde está instalado Hadoop no se puede subrayar !! De lo contrario, no se encontrará el host. ¡No se puede iniciar!
source /etc/sysconfig/network
Después de la modificación anterior, el nombre del host no cambiará inmediatamente y debe reiniciarse para que surta efecto. Entonces puede usar el siguiente comando para hacer cambios inmediatos:
hostname
4) Configurar hosts
Modificar el archivo / etc / hosts
vim /etc/hosts
Rellene lo siguiente
127.0.0.1 hadoop01
其他主机和ip对应信息。。。
Las dos operaciones anteriores son para lograr el desacoplamiento de la IP. Si completa toda la IP en múltiples servicios de marco, una vez que cambie la IP de su servidor, entonces cada marco de servicio debe modificar la IP. Nombre de host, luego, cuando cambia la dirección IP de su servidor, solo necesita modificar la relación de mapeo entre el nombre de host y la ip en el archivo de hosts.
5) Configurar inicio de sesión sin contraseña
Todos los hosts en el clúster deben iniciar sesión entre sí en secreto.
Generar clave:
ssh-keygen
Enviar la clave pública:
ssh-copy-id root@hadoop01
En este momento, la clave pública se guarda en el archivo /root/.ssh/authorized_keys del host remoto, y la información de host conocida se guarda en conocido_hosts. Cuando acceda nuevamente, no necesita ingresar la contraseña.
ssh hadoop01
Use este comando para conectarse de forma remota y verificar si puede conectarse sin contraseña.
Cabe señalar aquí que debe enviarse a la máquina.
6) Instalar jdk
1> descomprimir e instalar
Cargue y descomprima el paquete de instalación de jdk a través de fz, el comando es el siguiente:
tar -zxvf [jdk安装包位置]
2> Configurar variables de entorno
Modificar / etc / perfil.
Este archivo es una configuración de variable de entorno que se ejecutará cuando cada usuario inicie sesión. Este archivo se ejecuta cuando el usuario inicia sesión por primera vez. Y recopile la configuración del shell desde el archivo de configuración en el directorio /etc/profile.d.
vim /etc/profile
Agregue el siguiente contenido al final del archivo y guarde y salga.
export JAVA_HOME=/home/app/jdk1.7.0_45/
export PATH=$PATH:$JAVA_HOME/bin
3> Recargar
Vuelva a cargar el perfil para que la configuración surta efecto.
source /etc/profile
Una vez completada la configuración de la variable de entorno, pruebe si la variable de entorno surte efecto.
echo $JAVA_HOME
java -version
7) Construir clúster Zookeeper
Ver también: construcción del clúster ZooKepper .
2. Configurar hadoop
1) Descomprimir
Cargue el paquete de instalación en el servidor y descomprímalo.
tar -zxvf hadoop-2.7.1_64bit.tar.gz
2) Modificar configuración
Los siguientes archivos son todos los archivos que deben configurarse para Hadoop completamente distribuidos. Esta configuración sigue el grupo de 5 componentes del servidor descritos anteriormente.
1> hadoop-env.sh
En este archivo, cambie la variable de entorno java al mismo valor que la variable de entorno java en el archivo / etc / profile.
JAVA_HOME=/home/app/jdk1.7.0_45/
2> core-site.xml
La siguiente es la plantilla de configuración para este archivo.
<configuration>
<!-- 指定hdfs的nameservice为ns -->
<property> <name>fs.defaultFS</name> <value>hdfs://ns</value> </property> <!--指定hadoop数据临时存放目录--> <property> <name>hadoop.tmp.dir</name> <value>/root/work/hadoop-2.7.1/tmp</value> </property> <!--指定hdfs操作数据的缓冲区大小 可以不配--> <property> <name>io.file.buffer.size</name> <value>4096</value> </property> <!--指定zookeeper地址--> <property> <name>ha.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181,hadoop05:2181</value> </property> </configuration>
3> hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns</value> </property> <!-- ns下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns.nn1</name> <value>hadoop01:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns.nn1</name> <value>hadoop01:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns.nn2</name> <value>hadoop02:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns.nn2</name> <value>hadoop02:50070</value> </property> <!-- 指定NameNode的元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop03:8485;hadoop04:8485;hadoop05:8485/ns</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/root/work/hadoop-2.7.1/tmp/journal</value> </property> <!-- 开启NameNode故障时自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失败自动切换实现方式 --> <property> <name>dfs.client.failover.proxy.provider.ns</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔离机制 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- namenode存储位置 --> <property> <name>dfs.namenode.name.dir</name> <value>/root/work/hadoop-2.7.1/tmp/name</value> </property> <!-- dataode存储位置 --> <property> <name>dfs.datanode.data.dir</name> <value>/root/work/hadoop-2.7.1/tmp/data</value> </property> <!-- 副本数量根据自己的需求配置,这里配置2个 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 --> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
4> mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
5> yarn-site.xml
<configuration>
<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定resourcemanager地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop01</value> </property> </configuration>
6> esclavos
Aquí configuramos hadoop03, hadoop04 y hadoop05 como nodos para almacenar datos.
vim slaves
hadoop03
hadoop04
hadoop05
3) Variables de entorno
Archivo de configuración / etc / profile:
vim /etc/profile
Agregue el siguiente contenido al final:
export HADOOP_HOME=[hadoop的安装路径]
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
4) Otros servidores
Use el comando scp para copiar el archivo de configuración a otros servidores.
Cabe señalar aquí que si jdk, Zookeeper y otras configuraciones de otros servidores son las mismas que la configuración actual de este servidor, la copia directa no necesita ser modificada en el pasado.
Tres, empezar
Inicie hadoop completamente distribuido:
1. Inicie el clúster zk
./zkServer.sh start
2. Inicie el clúster jn
sbin/hadoop-daemons.sh start journalnode
1) Formato zkfc
Formatear el primer arranque
hdfs zkfc -formatZK
2) Formato hdfs
Formatear el primer arranque
hadoop namenode -format
3. Iniciar NameNode
En hadoop01:
hadoop-daemon.sh start namenode
En hadoop02:
hdfs namenode -bootstrapStandby #把NameNode的数据同步到hadoop02上
hadoop-daemon.sh start namenode #启动备用的namenode
4. Inicie DataNode
hadoop-daemons.sh start datanode
5. Iniciar hilo
start-yarn.sh
6. Inicie ZKFC
En hadoop01
hadoop-daemon.sh start zkfc
En hadoop02
hadoop-daemon.sh start zkfc
7. Después del inicio
Una vez completado el inicio, use el comando jps para ver cada servidor, el proceso es el siguiente:
hadoop01:
10877 QuorumPeerMain
11351 NameNode
11871 DFSZKFailoverController 11570 ResourceManager
hadoop02:
16019 QuorumPeerMain
16214 NameNode
16344 DFSZKFailoverController
hadoop03:
16548 QuorumPeerMain
16783 DataNode
16893 NodeManager 16701 JournalNode
hadoop04:
16565 QuorumPeerMain
16798 DataNode
16908 NodeManager 16716 JournalNode
hadoop05:
16562 QuorumPeerMain
16809 DataNode
16919 NodeManager 16727 JournalNode
En este punto, todo el clúster está construido y se puede usar normalmente.
Construcción de clúster completamente distribuida de Hadoop https://my.oschina.net/u/3754001/blog/1802135
Configuración del clúster de Hadoop http://hadoop.apache.org/docs/r1.0.4/cn/cluster_setup.html
Construcción de clúster distribuido de Hadoop https://www.cnblogs.com/skyturtle/p/9979413.html