Image

Apache Hadoop in CentOS 8

Costruendo un Mini File System distribuito usando Hadoop e CentOS 8

Apache Hadoop in CentOS 8 - Costruendo un Mini File System distribuito

Hadoop è un progetto Apache per il calcolo distribuito, ispirato in MapReduce e GoogleFS ecomprende quattro moduli:

  • Hadoop Common - Contiene le librerie comuni e i file necessari per tutti i moduli Hadoop.
  • Hadoop Distributed File System (HDFS) - File system distribuito che memorizza i dati sulle macchine all'interno del cluster, su richiesta, permettendo una larghezza di banda molto grande in tutto il cluster.
  • Hadoop Yarn - Questa è una piattaforma responsabile per la gestione delle risorse del cluster, così come della pianificazione delle stesse.
  • Hadoop MapReduce - Modello di programmazione per l'elaborazione su larga scala.

Prerequisiti necessari
Per installare Hadoop in modalità distribuita è necessario avere almeno tre macchine reali o virtuali con queste caratteristiche:

  • 2 GB di Memoria Ram
  • 20 GB di HD
  • 2 schede di rete
  • ISO del S.O. CentOS 8 x86_64 minimal (ISO 1.6GB)
  • Accesso a Internet per scaricare i pacchetti necessari
  • Accesso root
  • Un utente Hadoop
  • Virtualbox

Configurazione delle schede di rete
Ora configureremo le schede di rete per poter stabilire le connessioni con internet e con gli altri nodi del cluster hadoop per questo accediamo al menu "Applicazioni -> Sistema -> Impostazioni" nella finestra che si aprirà clicchiamo sull'icona "Rete" verranno visualizzate le schede che configureremo. Fate le seguenti modifiche con molta attenzione perché queste impostazioni saranno utilizzate per accedere a Internet e agli altri nodi del cluster. Controllando l'indirizzo MAC sulle opzioni delle schede di VirtualBox, assegneremo gli indirizzi IPv4 dei seguenti host:

  • Una scheda che sarà collegata al MAC Addres della scheda "bridge" di VirtualBox avrà il DHCP Automatico attivato.
  • La scheda che sarà collegata al MAC Address della scheda "rede interna" di VirtualBox avrà:
    • IP 192.168.100.2
    • Netmask 255.255.255.0
    • Gateway 0.0.0.0;

Installazione del S.O. CentOS 8
Lanciate Virtualbox e create tre VM con la configurazione hardware che è stata specificata nei prerequisiti, faremo particolare attenzione alle schede di rete che creeremo dove la prima sarà "Bridge" e la seconda sarà "Rete Interna", poi installate CentOS 8 O.S., quando verrà visualizzata la schermata di installazione creeremo l'utente "root" con una password semplice e un utente "hadoop" anche questo con una password semplice. Alla fine dell'installazione, eseguite il boot della VM e appena apparirà la schermata di login entrate con l'utente "hadoop"

Assegnazione nome dell'hostname
Ora inseriremo l'hostname della nostra VM, per fare questo dobbiamo cliccare sul menu "Applicazioni -> Sistema -> Impostazioni" e nella finestra che si aprirà clicchiamo sull'icona "Dettagli" e nel campo "Nome dispositivo" digitiamo il nome: "hadoop-master" e chiudiamo la finestra delle impostazioni.

Disattivazione di SELINUX
Disabiliteremo il sistema SELINUX per l'installazione di Hadoop, inizieremo cliccando sul menu "Applicazioni -> Preferiti -> Terminale" e una volta aperto digiteremo il comando:

sudo vi /etc/selinux/config

e quando ci verrà chiesta la password inseriremo la password che è stata creata per l'utente "root".
L'editor di testo sarà aperto con il file di configurazione di SELINUX, in esso cambieremo la linea:

SELINUX=enforcing

che diventerà:

SELINUX=disabled

terminare salvando il file cliccando sul pulsante "Salva", poi dovremo abilitare le modifiche nel nostro CentOS 8 eseguendo, sempre nel terminale, il comando

sudo setenforce 0

Disattivazione del firewall
Disabiliteremo il servizio Firewall in modo che non ci siano problemi con le porte bloccate. Lo faremo digitando i seguenti comandi nel nostro terminale:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

Installazione di OpenJava JDK V.1.8.0
Per utilizzare Hadoop è essenziale installare Java JDK e useremo la versione che è disponibile nella nostra versione di CentOS 8. Per iniziare abbiamo bisogno di sincronizzare i repository del S.O. digitando i seguenti comandi nel terminale:

sudo yum clean all && yum repolist

verrà chiesta la password e noi useremo quella scelta per l'utente "root".

Aggiornati i repository installeremo il pacchetto Java JDK digitando:

sudo yum install java-1.8.0-openjdk

Spegnere la macchina virtuale che abbiamo appena terminato e procediamo alla clonazione della stessa per creare i due nodi che serviranno per formare il cluster Haddop.

Clonazione della VM
Ora spegneremo la VM per il processo di clonazione e creeremo le due VM che saranno configurate per essere i nodi che comporranno il mini cluster Hadoop questo processo è fatto da VirtualBox cliccando con il bottone destro sulla VM che abbiamo appena usato.
Dopo la clonazione rinominare ogni macchina con il suffisso "slave1" e "slave2", poi cambiare le schede di rete di ognuna di esse mantenendo solo le schede di rete interne, infine avviare le tre VM facendo doppio clic sul loro nome e fare il login in tutte le VM con l'utente "hadoop".

Aggiornamento della configurazione di rete sulle VM slave 1 e slave2
Per fare queste modifiche dobbiamo aprire un terminale ed eseguire il comando:

sudo nmtui

che è un'interfaccia testuale che permetterà la modifica delle configurazioni delle schede di rete e l'hostname dei nodi che rispettano la seguente configurazione:

  • slave1:

    • IPv4 192.168.100.3
    • netmask 255.255.255.0 oppure /24
    • Hostname "hadoop-slave1
  • slave2:

    • IPv4 192.168.100.4
    • netmask 255.255.255.0 oppure /24
    • Hostname "hadoop-slave2"

Alla fine delle nostre impostazioni dovremmo ottenere la seguente configurazione:

  • Nodo Master - Scheda di rete interna:

    • IPv4 192.168.100.2
    • netmask 255.255.255.0 oppure /24
    • Hostname "hadoop-master"
  • Nodo Master - Scheda di rete esterna:

    • IPv4 DHCP Automático
  • Nodo slave1:

    • IPv4 192.168.100.3
    • netmask 255.255.255.0 oppure /24
    • Hostname "hadoop-slave1"
  • Nodo slave2:

    • IPv4 192.168.100.4
    • netmask 255.255.255.0 oppure /24
    • Hostname "hadoop-slave2"

Configurazione del file "hosts" di tutte le VM
NB: LE MODIFICHE ELENCATE DEVONO ESSERE EFFETTUATE NELLE TRE VM.

Accedere attraverso il terminale come "root" per avere il permesso di modifica nel file "hosts" dove inseriremo gli IP di tutti i nodi:

sudo vi /etc/hosts
127.0.0.1   localhost
::1         localhost6.localdomain6 localhost6
192.168.100.2       hadoop-master
192.168.100.3       hadoop-slave1
192.168.100.4       hadoop-slave2

Fatta la procedura di cui sopra, ora testeremo la connessione usando il comando ping:

ping hadoop-master
ping hadoop-slave1
ping hadoop-slave2

Impostazione delle variabili d'ambiente per Java JDK e il PATH di Hadoop
Modificare il file "~/.bashrc" con il contenuto in basso in tutte e tre le macchine:

[hadoop@hadoop-master ~]$ vi ~/.bashrc
[hadoop@hadoop-slave1 ~]$ vi ~/.bashrc
[hadoop@hadoop-slave2 ~]$ vi ~/.bashrc

Alla fine del file aggiungete il seguente contenuto:

export HADOOP_HOME="/hadoop"
export HADOOP_INSTALL="/hadoop"
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
#export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
export HADOOP_CONF_DIR=$HADOOP_INSTALL/etc/hadoop
export LD_LIBRARY_PATH=/hadoop/lib/native/:$LD_LIBRARY_PATH
export HIVE_HOME="/hadoop/hive"
export PATH=$PATH:$HIVE_HOME/bin
export JAVA_HOME="/usr/lib/jvm/jre-openjdk"
export PATH=$PATH:$JAVA_HOME/bin

Per attivare le modifiche è necessario eseguire i seguenti comandi nelle tre VM

[hadoop@hadoop-master ~]$  . ~/.bashrc
[hadoop@hadoop-slave1 ~]$  . ~/.bashrc
[hadoop@hadoop-slave2 ~]$  . ~/.bashrc

Configurazione di SSH con autenticazione a chiave RSA
N.B.: LE MODIFICHE ELENCATE DI SEGUITO VANNO FATTE SOLO NELLA VM MASTER.

Create le chiavi pubbliche e private per l'utente "hadoop" usando i comandi:

ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Ora sarà necessario duplicare la linea della chiave pubblica che è già presente all'interno del file "authorized_keys" per fare questo editeremo il file digitando nel terminale il seguente comando:

vi ~/.ssh/authorized_keys

Con il file aperto nell'editor di testo selezioneremo tutto il contenuto e incolleremo per due volte lo stesso contenuto alla fine del file, possiamo anche usare la combinazione dei tasti "SHIFT+YYP" per ottenere tre righe identiche.
Una volta fatto questo, cambieremo il nome degli host alla fine di ogni linea come segue:

hadoop@hadoop-master
hadoop@hadoop-slave1
hadoop@hadoop-slave2

Fate attenzione a cambiare solo l'ultima parte della linea dove c'è il nome dell'host.

Continueremo copiando le chiavi pubbliche all'interno di ogni nodo includendo il "localhost" di ogni VM che formerà il cluster.
Questi comandi saranno digitati solo nell'host "hadoop-master".

scp -rp ~/.ssh/ hadoop@localhost:~/
scp -rp ~/.ssh/ hadoop@hadoop-master:~/
scp -rp ~/.ssh/ hadoop@hadoop-slave1:~/
scp -rp ~/.ssh/ hadoop@hadoop-slave2:~/

Cambiare i permessi su tutti gli host nel cluster
N.B.: Sempre dall'host "hadoop-master" digiteremo i comandi sottostanti:

ssh hadoop@localhost "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
ssh hadoop@hadoop-master "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
ssh hadoop@hadoop-slave1 "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
ssh hadoop@hadoop-slave2 "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

Ecco fatto. Ora proveremo l'accesso ssh con chiavi condivise su tutte le macchine.

N.B.: digitate questi 4 comandi in tutti i nodi.

ssh localhost          (per uscire digitare exit oppure ctrl+d)
ssh hadoop-master      (per uscire digitare exit oppure ctrl+d)
ssh hadoop-slave1      (per uscire digitare exit oppure ctrl+d)
ssh hadoop-slave2      (per uscire digitare exit oppure ctrl+d)

Fare il download di Apache Hadoop
Scarica Apache Hadoop attraverso il link sottostante:
https://archive.apache.org/dist/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz

oppure possiamo usare il comando qui sotto per salvare all'interno della cartella "/tmp"

wget https://archive.apache.org/dist/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz -P /tmp/

Preparazione di Hadoop
Accedendo alla macchina "hadoop-master" eseguire i seguenti comandi per decomprimere il file tar.gz di hadoop:

cd /tmp
tar xzvf hadoop-3.2.1.tar.gz
sudo su
mv hadoop-3.2.1 /hadoop
chown -R hadoop:hadoop /hadoop
exit

Modificare il file "core-site.xml"

vi /hadoop/etc/hadoop/core-site.xml

inserendo tra i tag

<configuration>

</configuration>

le seguenti impostazioni;

<property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000/</value>
</property>
<property>
  <!-- <name>dfs.permissions</name> old version-->
        <name>dfs.permissions.enabled</name>
        <value>false</value>
</property>
<property>
        <name>hadoop.tmp.dir</name>
        <value>/hadoop/tmp</value>
</property>

Ora modificheremo il file "hdfs-site.xml"

vi /hadoop/etc/hadoop/hdfs-site.xml

inserendo tra i tag

<configuration>

</configuration>

le seguenti impostazioni:

<property>
  <!--<name>dfs.secondary.http.address</name> old version-->
 <name>dfs.namenode.secondary.http-address</name>
        <value>master:50090</value>
        <description>Secondary NameNode hostname</description>
</property>
<property>
    <!--<name>dfs.data.dir</name> old version-->
        <name>dfs.datanode.data.dir</name>
        <value>/hadoop/hdfs/datanode</value>
        <final>true</final>
</property>
<property>
        <name>dfs.namenode.name.dir</name>
        <value>/hadoop/hdfs/namenode</value>
        <final>true</final>
</property>
<property>
        <name>dfs.blocksize</name>
        <value>67108864</value>
</property>
<property>
        <name>dfs.replication</name>
        <value>1</value>
</property>

Modifica il file "mapred-site.xml" come segue:

vi /hadoop/etc/hadoop/mapred-site.xml

inserendo tra i tag

<configuration>

</configuration>

le seguenti impostazioni:

<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
</property>

Modifica il file "yarn-site.xml

vi /hadoop/etc/hadoop/yarn-site.xml

inserendo tra i tag

<configuration>

</configuration>

le seguenti impostazioni:

<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>
<property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>256</value>
</property>
<property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>2048</value>
</property>
<property>
        <name>yarn.scheduler.maximum-allocation-vcores</name>
        <value>1</value>
</property>
<property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8025</value>
</property>
<property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
</property>
<property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8040</value>
</property>
<property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
</property>
<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>

Modificare il file "hadoop-env.sh" cambiando le variabili d'ambiente come segue alla fine del file.
N.B. queste impostazioni già esistenti nel file "hadoop-env.sh" devono essere cambiate solo in base alle linee sottostanti.

vi /hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME="/usr/lib/jvm/jre-openjdk"
export HADOOP_CONF_DIR="/hadoop/etc/hadoop"

Modificate il file "workers" eliminando tutto il contenuto e digitate gli hostname di tutti i nodi:

vi /hadoop/etc/hadoop/workers
hadoop-master
hadoop-slave1
hadoop-slave2

Create una directory per poter contenere tutti i file di log;

mkdir -p /hadoop/logs

creare una directory per memorizzare i file temporanei di Hadoop;

mkdir -p /hadoop/tmp

Create le directory per contenere il "namenode" e il "datanode".

mkdir -p /hadoop/hdfs/namenode
mkdir -p /hadoop/hdfs/datanode

Copia della cartella "hadoop" già configurata per tutti i nodi disponibili.
Copiare la cartella già configurata su tutti i nodi disponibili a partire dal nodo "hadoop-master";

sudo su
scp -r /hadoop hadoop-slave1:/
scp -r /hadoop hadoop-slave2:/
exit

In questo passo cambieremo il proprietario della cartella hadoop dei nodi ricordando che eseguiremo sempre i comandi nel nodo "hadoop-master".

Cambiare il proprietario nel nodo "hadoop-slave1":

ssh -t hadoop-slave1 'sudo chown -R hadoop:hadoop /hadoop'

Cambiare il proprietario nel nodo "hadoop-slave2":

ssh -t hadoop-slave2 'sudo chown -R hadoop:hadoop /hadoop'

Preparare l'HDFS a ricevere i dati
Formattare e avviare il cluster HDFS per ricevere tutti i nostri dati.

N.B.: I seguenti comandi saranno sempre eseguiti nel nodo "hadoop-master"

hdfs namenode -format

Avviare il servizio Hadoop per poter inserire i primi file

start-dfs.sh

Controllare che il cluster sia stato avviato senza errori

hdfs dfsadmin -report

se tutto ha funzionato correttamente, il comando restituirà la capacità e i nodi attivi.

Eseguire il servizio "Yarn"

start-yarn.sh

Per monitorare se il cluster hadop sta funzionando, possiamo puntare il nostro browser al seguente indirizzo:

http://192.168.100.2:9870

Mentre per monitorare Yarn Resource manager è necessario aprire il nostro browser nell'indirizzo seguente:

http://192.168.100.2:8088

Giocare con HDFS
Inizieremo creando una cartella all'interno del nostro File System distribuito usando il comando:

hdfs dfs -mkdir -p /user/hadoop

e poi creeremo una cartella all'interno del nostro utente hadoop che chiameremo "libri" usando questo comando:

hdfs dfs -mkdir -p /user/hadoop/libri

Per vedere se è stato creato correttamente digitate il comando:

hdfs dfs -ls /user/hadoop

Ora creiamo un file di testo da un comando che genera un mucchio di messaggi in uscita digitando il comando qui sotto:

dmesg > ~/test.txt

Copiamo il file "test.txt" dentro la cartella "libri" che è stata creata prima

hdfs dfs -put ~/test.txt /user/hadoop/libri

Per elencare i file contenuti nella cartella "libri"di hadoop digiteremo:

hdfs dfs -ls /user/hadoop/libri

Ora leggeremo il contenuto del file di test che si trova su HDFS

hdfs dfs -cat libri/test.txt

Con questo passo copieremo il file test.txt che si trova su HDFS nella cartella /tmp del nostro sistema operativo che ospita hadoop.

hdfs dfs -get libri/test.txt /tmp

Vediamo se questo è effettivamente accaduto digitando il comando:

ls -la /tmp/test.txt
cat /tmp/test.txt

Per mostrare l'help dei comandi que l'HDFS contiene, possiamo usare il seguente comando:

hdfs dfs -help

Per fermare il servizio di hadoop è necessario digitare il comando:

stop-all.sh

E infine per spegnere tutte le VM lo faremo sempre eseguendo i comandi dal nodo "hadoop-master"

ssh -t hadoop-slave2 'sudo shutdown -h now'
ssh -t hadoop-slave1 'sudo shutdown -h now'
ssh -t hadoop-master 'sudo shutdown -h now'

Informazioni inerenti a questa materia.
Potete consultare le seguenti risorse su questo argomento. Mentre sono forniti nella speranza che siano utili, si prega di notare che non possiamo garantire l'accuratezza o la funzionalità dei materiali ospitati esternamente.

https://hadoop.apache.org/docs/r3.2.1/
https://hadoop.apache.org/docs/r3.2.1/hadoop-yarn https://hadoop.apache.org/docs/r3.2.1/FileSystemShell.html https://hadoop.apache.org/docs/r3.2.1/core-default.xml
https://hadoop.apache.org/docs/r3.2.1/hdfs-default.xml
https://hadoop.apache.org/docs/r3.2.1/mapred-default.xml
https://hadoop.apache.org/docs/r3.2.1/yarn-default.xml