Ir ao contido

馃Ь Instalaci贸n de Hadoop

Instalaci贸n de Apache Hadoop empregando ClusterShell

Requisitos previos

Estas probas foron feitas nunha contorna baixo Rocky Linux 8.5 v2 no CESGA, no seu OpenStack.

Grupo de seguridade

Teremos que abrir os seguintes portos (ollo, deber铆amolos abrir s贸 entre eles e para nos, posto que deixar abertos os portos 茅 un importante risco de seguridade):

Xerais:

  • SSH: 22 (TCP).

Apache Hadoop:

  • HADOOP_HDFS: 9000 (TCP)
  • HADDOP_MASTER_WEB: 9870 (TCP)
  • HADOOP_SECONDARY_NAMENODE_WEB 9868 (TCP)

Apache Spark:

  • SPARK_MAIN: 9001 (TCP)
  • INFO_MASTER_SPARK: 8080 (TCP)
  • INFO_WORKERS_SPARK: 8081 (TCP)
  • INFO_WORKERS_SPARK_WEB: 4040 (TCP)
  • OUTROS: 7707 (TCP)

Instalaci贸n de ClusterShell

Debemos instalar ClusterShell no nodo master ou no equipo onde fagamos a instalaci贸n.

Executemos os comandos dende o noso equipo local ou dende o nodo master, podemos incluir o nodo master para conectarnos contra el mesmo e executar tam茅n nel os comandos.

Instalaci贸n dende Rocky Linux ou distro baseada en Redhat

sudo yum --enablerepo=extras -y install epel-release

sudo yum install -y clustershell

Instalaci贸n dende Linux Mint ou distro baseada en Ubuntu/Debian

sudo apt-get install clustershell

Conexi贸n aos servidores por nome

Deberemos configurar o arquivo /etc/hosts cos nomes dos servidores:

    X.Y.Z.T1 hadoop1 hadoop1.local
    X.Y.Z.T2 hadoop2 hadoop2.local
    X.Y.Z.T3 hadoop3 hadoop3.local
    ...
    [X.Y.Z.Tn hadoopN hadoopN.local]

Cada un destes servidores debe ter como m铆nimo 4 GB de RAM (8 茅 o m铆nimo recomendable m谩is imos aplicar restricci贸ns na configuraci贸n).

Debemos ter creado un usuario chamado cesgaxuser, co que executaremos t贸dolos comandos. Este usuario existe por defecto nas m谩quinas virtuais novas creadas no OpenStack do CESGA.

Asemade, dende o nodo master (hadoop1) debemos poder conectar por SSH ao resto de nodos: hadoop2, hadoop3 ... hadoopN (ter copiada a parte p煤blica da chave SSH no .ssh/authorized_keys). Podemos xerar e meter unha chave nova no master (empregando ssh-keygen) ou ben copiar a chave que nos xenere o OpenStack (arquivo .pem coa chave RSA).

Se copiamos a chave RSA xerada polo OpenStack durante a creaci贸n da m谩quina, podemos copiala mediante scp:

Neste exemplo imaxinamos que este arquivo, gardado no directorio onde nos atopemos, ch谩mase: ficheiro-chave-ssh.pem

  • Copiamos o arquivo (ollo, hai que repetir o arquivo, unha vez para pasalo como chave a empregar e outra para copialo):

    scp -i ficheiro-chave-ssh.pem ficheiro-chave-ssh.pem cesgaxuser@hadoop1:/home/cesgaxuser/

Se nos devolve un erro coma este:

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    Permissions 0755 for 'ficheiro-chave-ssh.pem' are too open.
    It is required that your private key files are NOT accessible by others.
    This private key will be ignored.
    Load key "ficheiro-chave-ssh.pem": bad permissions

Deberemos dar permisos adecuados (s贸 podemos ler a chave nos):

chmod 0600 ficheiro-chave-ssh.pem

  • Conectamos co master:

    ssh -i ficheiro-chave-ssh.pem cesgaxuser@hadoop1

  • Dentro do master, forzaremos a creaci贸n da estrutura .ssh no directorio $HOME:

    ssh localhost

Preguntaranos se queremos conectar co servidor, xa que 茅 a primeira vez e non co帽ece a chave:

[cesgaxuser@hadoop1 ~]$ ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:5aeqrZspd4Wev7IrUFH/KS8OXORpa614OEWXRHUG+yE.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Contestamos yes e damos a enter para que se cree a estrutura .ssh.

Agora toca mover a chave privada ao directorio por defecto:

mv ficheiro-chave-ssh.pem .ssh/id_rsa

E dar os permisos adecuados:

chmod 0600 .ssh/id_rsa

Finalmente, xeraremos a parte p煤blica da nosa chave privada:

ssh-keygen -y -f .ssh/id_rsa > .ssh/id_rsa.pub

Copiaremos as chaves do nodo master ao resto de nodos por comodidade, de xeito que poderemos enviar un comando a t贸dolos nodos dende calquera. Esto pode supor un risco de seguridade, mais poderemos borrar se queremos a chave privada do resto de nodos. De t贸dolos xeitos, tendo en conta que a configuraci贸n 茅 a mesma en t贸dolos nodos e que est谩n conectados, que logre acceder a un, moi probablemente poida acceder a todos.

No .ssh/known_hosts de hadoop1, hadoop2 ... hadoopN precisamos os fingerprints de todos os servidores. Para facelo:

  • Descargamos os fingerprints dos servidores (con t贸dalas IPs e nomes):

    for servidor in $(cat /etc/hosts|grep hadoop); do ssh-keyscan -H $servidor; done >> /home/cesgaxuser/.ssh/known_hosts

Se mud谩semos a li帽a que lista os hosts por esta: $(cat /etc/hosts|grep hadoop|awk '{print $1}', poder铆amos asociar as chaves s贸 os enderezos IP.

  • Copiamos a configuraci贸n a t贸dolos nodos:

    clush -l cesgaxuser -bw hadoop[2-4] --copy /home/cesgaxuser/.ssh --dest /home/cesgaxuser/

Actualizaci贸n de paquetes

Antes de seguir, 茅 moi conveniente actualizar o sistema para evitar erros de seguridade. Deste xeito probamos que podemos conectar con t贸dolos nodos.

clush -l cesgaxuser -bw hadoop[1-4] sudo dnf update -y

(opcional, m谩is recomendable) E por comodidade, instalamos nano un editor moi simple e m谩is amigable que vi e tam茅n net-tools por se precisamos ver certas configuraci贸ns de rede para diagnosticar erros.

clush -l cesgaxuser -bw hadoop[1-4] sudo dnf install -y nano net-tools

Instalaci贸n de Java OpenJDK Correto de Amazon

En t贸dolos equipos debemos ter instalada a m谩quina virtual de Java OpenJDK versi贸n Corrreto de Amazon a trav茅s de repositorio.

Engadimos o respositorio:

clush -l cesgaxuser -bw hadoop[1-4] sudo curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo

Instalamos o paquete:

clush -l cesgaxuser -bw hadoop[1-4] sudo dnf install -y java-11-amazon-corretto-devel

Configuraci贸n do nodo master

Debemos conectarnos por SSH ao nodo master:

ssh cesgaxuser@hadoop1

Configuraci贸n de JAVA_HOME en t贸dolos servidores

Editaremos o arquivo /home/cesgaxuser/.bashrc para configurar as variables de contorna necesarias.

nano .bashrc

Metemos estas li帽as ao final:

    JAVA_HOME='/usr/lib/jvm/java-11-amazon-corretto/'
    export JAVA_HOME

Esto configura a variable de contorna JAVA_HOME. Non deber铆a ser necesario ao estar instalada a m谩quina dende un repositorio automatizado, pero 茅 unha boa pr谩ctica para que o resto de scripts non dean fallos ou avisos.

Pechamos a sesi贸n (Ctrl+D) e volvemos entrar (ou executamos . ./bashrc ou source .bashrc para recargar as variables de entorno).

Copiamos este arquivo ao resto de nodos, empregaremos clustershell para simplificar o proceso:

clush -l cesgaxuser -bw hadoop[2-4] --copy .bashrc --dest /home/cesgaxuser/

Descargando e instalando Apache Hadoop en t贸dolos nodos

No nodo master, descargamos Apache Hadoop da web oficial:

curl https://dlcdn.apache.org/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz --output hadoop-3.2.4.tar.gz

E copi谩molo ao resto de nodos:

clush -l cesgaxuser -bw hadoop[2-4] --copy hadoop-3.2.4.tar.gz --dest /home/cesgaxuser/

Descomprimimos en t贸dolos nodos:

clush -l cesgaxuser -bw hadoop[1-4] tar -xzf hadoop-3.2.4.tar.gz

Configurando as variables de contorna espec铆ficas de Apache Hadoop

Metemos no .bashrc ao final as seguintes novas variables da contorna:

    HADOOP_HOME='/home/cesgaxuser/hadoop-3.2.4'
    PATH=${PATH}:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
    export HADOOP_HOME
    export PATH

E copiamos o arquivo ao resto de nodos para aplicar a mesma configuraci贸n:

clush -l cesgaxuser -bw hadoop[2-3] --copy .bashrc --dest /home/cesgaxuser/

Pechamos a sesi贸n (Ctrl+D) e volvemos entrar (ou executamos . ./bashrc ou source .bashrc para recargar as variables de entorno).

Para comprobar se funciona a instalaci贸n b谩sica e as variables de contorna, podemos escribir o comando:

hdfs

E deber铆a devolvernos a axuda do comando.

Configurando Apache Hadoop

Editamos o arquivo de configuraci贸n: hadoop-3.2.4/etc/hadoop/core-site.xml

E o deixamos as铆:

    <configuration>
        <property>
            <name>fs.default.name</name>
            <value>hdfs://hadoop1:9000</value>
        </property>
    </configuration>

Editamos o arquivo hadoop-3.2.4/etc/hadoop/hdfs-site.xml:

E o deixamos as铆:

    <configuration>
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>/home/cesgaxuser/data/nameNode</value>
        </property>

        <property>
            <name>dfs.datanode.data.dir</name>
            <value>/home/cesgaxuser/data/dataNode</value>
        </property>

        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
    </configuration>

Agora precisamos crear os directorios que almacenar谩n os datos:

  • mkdir -p /home/cesgaxuser/data/nameNode
  • mkdir -p /home/cesgaxuser/data/dataNode

Editamos o arquivo: hadoop-3.2.4/etc/hadoop/mapred-site.xml

E deix谩molo as铆:

    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
        <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>

    <!-- L铆mite de uso de RAM (non po帽er se temos alomenos 8GB por servidor -->

    <property>
        <name>yarn.app.mapreduce.am.resource.mb</name>
        <value>512</value>
    </property>

    <property>
        <name>mapreduce.map.memory.mb</name>
        <value>256</value>
    </property>

    <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>256</value>
    </property>

    </configuration>

Editamos o arquivo: hadoop-3.2.4/etc/hadoop/yarn-site.xml e metemos a seguinte configuraci贸n (ollo de subtituir XXX.XXX.XXX.XXX pola IP do nodo master):

    <configuration>
        <property>
            <name>yarn.acl.enable</name>
            <value>0</value>
        </property>

        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>XXX.XXX.XXX.XXX</value>
        </property>

        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>

        <!-- L铆mite de uso de RAM (non po帽er se temos alomenos 8GB por servidor -->
        <property>
            <name>yarn.nodemanager.resource.memory-mb</name>
            <value>1536</value>
        </property>

        <property>
            <name>yarn.scheduler.maximum-allocation-mb</name>
            <value>1536</value>
        </property>

        <property>
            <name>yarn.scheduler.minimum-allocation-mb</name>
            <value>128</value>
        </property>

        <property>
            <name>yarn.nodemanager.vmem-check-enabled</name>
            <value>false</value>
        </property>

    </configuration>

E tam茅n metemos os nodos no arquivo: hadoop-3.2.4/etc/hadoop/workers:

    hadoop2
    hadoop3
    hadoop4

Con esto ter铆amos configurado yarn en hadoop1 (master).

Configuraci贸n do resto de nodos

Podemos copiar simplemente a configuraci贸n ao resto de nodos:

clush -l cesgaxuser -bw hadoop[2-3] --copy hadoop-3.2.4/etc/hadoop/workers hadoop-3.2.4/etc/hadoop/yarn-site.xml hadoop-3.2.4/etc/hadoop/mapred-site.xml hadoop-3.2.4/etc/hadoop/hdfs-site.xml hadoop-3.2.4/etc/hadoop/core-site.xml --dest /home/cesgaxuser/hadoop-3.2.4/etc/hadoop

Formatear o HDFS:

Dende hadoop1 (o nodo master) executamos:

hdfs namenode -format

E finalmente dende o master iniciamos todo o sistema (esto conecta por SSH aos nodos e executa os comandos necesarios para que se po帽an a traballar):

start-dfs.sh

Arrancando Apache Hadoop ao inicio con cron

Se queremos lanzar o proceso de Apache Hadoop dende cron (por exemplo para facer uso da opci贸n @reboot) deberemos cambiar por si acaso o arquivo: hadoop-3.2.4/etc/hadoop/hadoop-env.sh e mudar as seguintes variables, para non depender do .bashrc do usuario:

    export JAVA_HOME='/usr/lib/jvm/java-11-amazon-corretto/'
    export HADOOP_HOME='/home/cesgaxuser/hadoop-3.2.4'
    export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
    #HADOOP_OPTS=

Unha vez cambiemos o arquivo, copiar茅molo ao resto de nodos, por coherencia e por manter igual a configuraci贸n en t贸dolos sitios.

clush -l cesgaxuser -bw hadoop[2-3] --copy hadoop-3.2.4/etc/hadoop/hadoop-env.sh --dest /home/cesgaxuser/hadoop-3.2.4/etc/hadoop

Finalmente editaremos o cron do nodo master para indicarlle que arranque Hadoop cando iniciemos a m谩quina:

(importante: Se non queres empregar vi, establece a variable EDITOR=nano se o tes instalado)

crontab -e

E metemos no arquivo o seguinte contido:

    @reboot /home/cesgaxuser/hadoop-3.2.4/sbin/start-dfs.sh

Por 煤ltimo reiniciamos t贸dolos nodos:

clush -l cesgaxuser -bw hadoop[1-4] sudo reboot

Comprobando que funciona

Para obter informaci贸n do HDFS, podemos empregar o comando:

hdfs dfsadmin -report

Queda iniciar yarn.

Bibliograf铆a

Podes atopar m谩is informaci贸n:

漏 2023 - Jose S谩nchez

Se atopas erros, agradecerei que me env铆es un email/mensaxe co aviso ou as correcci贸ns.