Red de conocimiento informático - Programación de la red - Por favor, dígame cómo configurar ha en hadoop2.0.

Por favor, dígame cómo configurar ha en hadoop2.0.

1 Explicación detallada de la arquitectura Hadoop HA

1.1 Antecedentes de HDFS

El NameNode en el clúster HDFS tiene un único punto de falla (SPOF). Para un clúster con un solo NameNode, si ocurre un problema con la máquina del NameNode, todo el clúster no estará disponible hasta que se reinicie el NameNode.

La falta de disponibilidad del clúster HDFS incluye principalmente las dos situaciones siguientes: en primer lugar, el apagado de la máquina NameNode hará que el clúster no esté disponible y solo se podrá utilizar después de reiniciar el NameNode; en segundo lugar, el software o hardware del NameNode; El plan de actualización hará que el clúster no esté disponible en un corto período de tiempo. No disponible durante horas.

Para resolver los problemas anteriores, Hadoop proporciona una solución HDFS HA ​​de alta disponibilidad: HDFS generalmente consta de dos NameNodes, uno en estado activo y el otro en estado de espera. El NameNode activo proporciona servicios externos, como el manejo de solicitudes RPC de los clientes, mientras que el NameNode en espera no proporciona servicios externos, solo sincroniza el estado del NameNode activo para que pueda cambiar rápidamente en caso de falla.

1.2 Arquitectura HA HDFS

Un NameNode de clúster HA típico se configurará en dos máquinas independientes. En cualquier momento, un NameNode está activo y otro NameNode está en estado de copia de seguridad. El NameNode activo responderá a todos los clientes del clúster, mientras que el NameNode de respaldo solo actúa como una réplica para garantizar transferencias rápidas cuando sea necesario.

Para mantener sincronizados los nodos activos y en espera, ambos nodos mantienen nodos de registro utilizando un conjunto de procesos independientes llamados JNS. Cuando se actualiza un espacio de nombres en el nodo activo, envía un registro de cambios a una gran parte de JNS. El nodo en espera leerá estas ediciones de JNS y las observará en busca de cambios en el registro. El nodo en espera aplica los cambios de registro a su propio espacio de nombres. Cuando se produce una conmutación por error, el servidor en espera se asegurará de que todas las ediciones se puedan leer desde JNS antes de promocionarse al servidor activo. Es decir, el espacio de nombres mantenido por el servidor en espera debe ser exactamente el mismo que el del servidor activo antes de la conmutación por error. ocurre sincrónico.

Para admitir una conmutación por error rápida, es necesario que el nodo en espera guarde la ubicación más reciente de los bloques de datos en el clúster. Para lograr este objetivo, los DataNodes necesitan configurar las direcciones de ambos Namenodes, establecer enlaces de latido con ellos y enviarles ubicaciones de bloques.

Es muy importante que solo haya un NameNode activo en cualquier momento; de lo contrario, causará caos en la operación del clúster y luego los dos NameNodes tendrán dos estados de datos diferentes, lo que puede provocar la pérdida de datos. o estado anormal. Esta situación a menudo se denomina "cerebro dividido" (la comunicación de tres nodos está bloqueada, es decir, diferentes Datanodes en el clúster ven dos NameNodes activos). Para JNS, solo se permite que un NameNode sea el autor en cualquier momento durante una conmutación por error, el nodo en espera original asumirá todas las funciones del nodo activo y será responsable de escribir registros en JNS, evitando así que otros NameNodes se activen. nodos.

La solución HDFS HA ​​basada en QJM se muestra en la figura anterior y su flujo de procesamiento es el siguiente: una vez iniciado el clúster, un NameNode está en estado activo y proporciona servicios para procesar solicitudes. desde clientes y DataNode, y escribiendo editlog localmente y editlog compartido (QJM aquí). El otro NameNode está en espera. Carga fsimage al inicio y luego recupera periódicamente los registros de edición del registro de edición compartido para permanecer sincronizado con el estado del nodo activo.

Para lograr un servicio rápido en espera después de que Active cuelgue, DataNode necesita informar a dos NameNodes al mismo tiempo, para que Stadnby pueda guardar la información del bloque en DataNode, porque el trabajo que consume más tiempo al iniciar NameNode es procesar el informe de bloque. de todos los DataNodes. Para lograr una copia de seguridad en caliente, se agregan un controlador de fallas y Zookeeper, y el controlador de fallas se comunica con Zookeeper. A través del mecanismo de elección de Zookeeper, FailoverController convierte el NameNode en activo o en espera a través de RPC.

1.3 Elementos de configuración de alta disponibilidad HDFS

Máquina NameNode: dos máquinas físicas con la misma configuración, ejecutando nodos activos y nodos en espera respectivamente.

Máquina JouralNode: La máquina que ejecuta JouralNode. El demonio JouralNode es muy liviano y se puede implementar con otros procesos de Hadoop como NameNode, DataNode, ResourceManager, etc. , al menos tres de los cuales son impares. Si ejecuta n JNS, puede permitir que los procesos JNS (N-1)/2 fallen sin afectar el trabajo.

En un clúster HA, el Namenode de respaldo también realizará operaciones de punto de control en el espacio de nombres (heredando las características del NameNode de respaldo), por lo que no es necesario ejecutar SecondaryNameNode, CheckpointNode o BackupNode en el clúster HA.

1.4 Parámetros de configuración de alta disponibilidad de HDFS

Los siguientes parámetros deben configurarse en hdfs.xml:

Servicios de nombres DFS: el nombre lógico de hdf snn. , como myhdfs.

Dfs.ha.namenodes.myhdfs: Lista de nodos con el nombre lógico de servicio dado myhdfs, como nn1 y nn2.

DFS . NameNode . rpc-address . myhdfs nn1: La dirección RPC de nn 1 del servicio externo en mi HDFS.

DFS . NameNode .work-scripts/if CFG-eth 0

//Reiniciar servicio de red

#Reinicio de red de servicio

//Modificar nombre de host

# hostnamectl set-hostname nombre de host

//Ver nombre de host

# hostnamectl status

3.3 Establecer la asignación entre la dirección IP y el nombre de host

//Cambiar usuario raíz

$ su root

//Editar archivo de host

# vim /etc/hosts

172.16.20.81?hadoop-master1

172.16.20.82?hadoop-master2

172.16.20.83?hadoop-slave1

172.16.20.84?hadoop-slave2

172.16.20.85?hadoop-slave3

3.4 Apagar el firewall y Selinux

//Cambiar raíz Usuario

$ su root

//Detener el firewall

# systemctl stop firewall d.service

//Prohibir el inicio del firewall.

# systemctl desactivar firewall d.service

//Activar y desactivar Selinux

# vim /etc/selinux/config

SELINUX =Desactivar

//Después de reiniciar la máquina, el usuario root verifica el estado de Selinux.

# getenforce

3.5 Configurar el inicio de sesión SSH sin contraseña

//Generar un par de claves SSH en el nodo hadoop-master1.

$ ssh-keygen -t rsa

//Copie la clave pública en todas las máquinas de nodo del clúster.

$ ssh-copy-id Hadoop-master 1

$ ssh-copy-id hadoop-master2

$ ssh-copy-id Hadoop-slave 1

$ ssh-copy-id hadoop-slave2

$ ssh-copy-id hadoop-slave3

//Inicie sesión en cada nodo a través de ssh y pruebe sin contraseña Si el inicio de sesión fue exitoso.

$ ssh hadoop-master2

Nota: Realice la misma operación en otros nodos para garantizar que cualquier nodo del clúster pueda iniciar sesión en otros nodos a través de ssh sin contraseña.

3.6 Instalar JDK

//Desinstalar el openjdk que viene con el sistema.

$ suroot

# rpm-qa | grep java

# rpm-e-nodeps Java-1 . 0 . 75-2 . 5 . 4 2 . el7 _ 0 . 0 . 75-2 . 5 . 4 . el7 _ 0 . >

#Exit

//Extrae el paquete de instalación de jdk

$ tar-xvf jdk-7u79-linux-x64.tar.gz

/ / Eliminar el paquete de instalación

$ rmjdk-7u79-linux-x64.tar.gz

//Modificar las variables de entorno del usuario

$ cd ~

$ vim.bash_profile

exportar Java_HOME =/HOME/Hadoop/app/JDK 1 7 0 _ 79

exportar PATH = $PATH:$JAVA_HOME /bin.

//Haga que las variables de entorno modificadas surtan efecto

$ source.bash_profile

//Pruebe si jdk se instaló correctamente.

$versión java

4 Sincronización de la hora del clúster

Si la hora de los nodos del clúster no está sincronizada, puede causar tiempo de inactividad del nodo u otros problemas anormales, por lo que La sincronización de la hora del clúster generalmente se logra configurando un servidor NTP en el entorno de producción.

En este clúster, el servidor ntp está configurado en el nodo hadoop-master1. El método específico es el siguiente:

//Cambiar usuario raíz

$ su root

<. p>//Compruebe si ntp está instalado.

# rpm -qa | grep ntp

//Instalar ntp

# yum install -y ntp

//Configurar el servidor de hora

# vim /etc/ntp.conf

#Prohibir que todas las máquinas se conecten al servidor ntp

La restricción se ignora de forma predeterminada

#Allow LAN Todas las máquinas están conectadas al servidor ntp.

Restringir 172.16.20.0 para bloquear 255.255.255.0 sin modificaciones ni trampas

#Usar esta máquina como servidor de tiempo

Servidor 127.127.1.0

//Inicia el servidor ntp

#Service ntpd startup

//Configura el servidor ntp para que se inicie automáticamente.

# chkconfig ntpd opens

Otros nodos en el clúster ejecutan tareas programadas crontab y sincronizan la hora con el servidor ntp a la hora especificada todos los días. El método es el siguiente:

//Cambiar usuario root

$ su root

//Realizar una tarea programada y sincronizar la hora con el servidor a las 00: 00 todos los días y escribir en el registro.

# crontab -e

0 0 * * */usr/sbin/NTP fecha Hadoop-master 1 gt/home/hadoop/ntpd.log

//Ver tareas

# crontab -l

5 Instalación del clúster de Zookeeper

Zookeeper es un servicio de coordinación distribuido de código abierto con su líder único: el seguidor La estructura de clúster resuelve bien el problema del punto único distribuido. Actualmente se utiliza principalmente en escenarios como servicios de nombres unificados, gestión de configuración, servicios de bloqueo y gestión de clústeres. La función de gestión de clústeres de Zookeeper se utiliza principalmente para aplicaciones de big data.

Este clúster utiliza la versión zookeeper-3.4.5-cdh5.7.1. Primero instale Zookeeper en el nodo hadoop-slave1, de la siguiente manera:

//Cree un nuevo directorio

$ mkdir application/cdh

//Descomprima zookeeper Paquete de instalación

$ tar-xvf zookeeper-3.

//Eliminar el paquete de instalación.

p>

$ RM-RF zookeeper-3 .5-CD H5 7 .gz

//Configurar variables de entorno de usuario. >$vim.

bash_profile

Exportar ZOOKEEPER_HOME =/HOME/Hadoop/app/CDH/ZOOKEEPER-3.4.5-CDH5.7.1

Exportar ruta=$PATH:$ ZOOKEEPER_HOME/bin

//Hacer que las variables de entorno modificadas surtan efecto

$ source.bash_profile

//Modificar el archivo de configuración de zookeeper

$ CD app/CDH/ cuidador del zoológico-3 . 5-CD H5 7 1/conf/

$ cp zoo_sample.cfg zoo.cfg

$ vim cfg. >#Tiempo de latido del cliente (milisegundos)

Tiempo de emisión de tickets=2000

#Intervalo de latido máximo permitido

initLimit=10

#Sincronización límite de tiempo

syncLimit=5

#Directorio de almacenamiento de datos

dataDir =/home/Hadoop/app/CDH/zookeeper -3 4 . 5 7 . 1/data/log

#Número de puerto

Puerto del cliente=2181

#Configuración del puerto de servicio y nodo del clúster

servidor 1. = Hadoop-esclavo 1:2888:3888

servidor 2 = Hadoop-esclavo 2:2888:3888

servidor 3 = Hadoop-esclavo 3: 2888:3888

#La siguiente es la configuración optimizada

#De forma predeterminada, el número máximo de conexiones al servidor es 10 y 0 significa que no hay límite.

maxClientCnxns=0

#Número de instantáneas

autopurge.snapRetainCount=3

#Tiempo de limpieza de instantáneas, el valor predeterminado es 0 .

auto purga. intervalo de purga = 1

//Crea el directorio de almacenamiento de datos y el directorio de almacenamiento de registros del cuidador del zoológico.

$ cd..

$ mkdir -p data/log

// Cree un archivo myid en el directorio de datos y el contenido de entrada es 1.

$ echo "1 " > gt data/my id

//Modificar la ruta de salida del registro de zookeeper (tenga en cuenta que la versión CDH y los archivos de configuración de la versión nativa son diferentes)

$ vim libexec/zkEnv.sh

if [ "x${ZOO_LOG_DIR}" = "x" ]

Entonces

ZOO _ LOG _ DIR = " $ ZOOKEEPER _ HOME/logs "

El barco no corre con los gastos de carga

si [ "x${ZOO_LOG4J_PROP}" = "x" ]

Entonces

ZOO_LOG4J_PROP="INFO, ROLLINGFILE "

El barco no corre con los costos de carga

//Modificar la configuración del registro del cuidador del zoológico archivo.

$ vim conf/log4j.properties

zookeeper.root.logger=INFO,ROLLINGFILE

//Crear directorio de registro

$ mkdir log

Sincronice el directorio Zookeeper en el nodo hadoop-slave1 con los nodos hadoop-slave2 y hadoop-slave3, y modifique el archivo de datos de Zookeeper. Además, no olvide configurar las variables de entorno del usuario.

// Copie el directorio del cuidador del zoológico a otros nodos en hadoop-slave1.

$ cd ~

$ scp-r aplicación/CDH/zookeeper-3 . /CDH

$ scp-r aplicación/CDH/zookeeper-3 4 5-CD H5 7 . >// Modifique el archivo myid en el directorio de datos en hadoop-slave2.

$ echo "2 " >app/CDH/zookeeper-3 4 5-CD H5 1/data/myid

//Modificar los datos en hadoop-. Slave3 archivo myid en el directorio.

$ echo "3 " >app/CDH/zookeeper-3 4 5-CD H5 7 1/data/myid

Finalmente, después de instalar Zookeeper, inicie Zookeeper. cada nodo y verifique el estado del nodo. El método es el siguiente:

//Inicio

$ zkServer.sh inicio

//Ver estado

$ zkServer.sh estado

//Cerrar