Image

HDFS - Mini File System distribuito con Hadoop Apache

Hadoop è un progetto Apache per il calcolo e archiviazione distribuita, ispirato in MapReduce e GoogleFS

Apache Hadoop - Costruendo un mini File System distribuito

Hadoop è un progetto Apache per il calcolo e archiviazione distribuita, ispirato in MapReduce e GoogleFS ed è composto da quattro moduli:

  • Hadoop Common - Contiene le librerie e i file comuni necessari per tutti i moduli Hadoop.
  • Hadoop Distributed File System (HDFS) - File system distribuito che archivia i dati nei nodi che compongono il cluster consentendo una grande larghezza di banda in tutto l'insieme dello stesso.
  • Hadoop Yarn - È una piattaforma di gestione e pianificazione delle risorse disponibili nel cluster ottimizzando tanto il calcolo come l'immagazzinamento di grandi quantità di dati.
  • Hadoop MapReduce - MapReduce è un framework software brevettato e introdotto da Google per supportare la computazione distribuita su grandi quantità di dati in cluster di computer.

Prerequisiti necessari per l'installazione.

Per l'installazione di Hadoop in modalità distribuita è necessario disporre di almeno tre macchine reali o virtuali con queste caratteristiche:

  • 2 GB di Memoria Ram
  • 20 GB di Hard Disk
  • 2 schede di rete
  • ISO del S.O. CentOS7 x86_64 (ISO 4GB) (ISO 650MB)
  • Accesso a Internet para scaricare i pacchetti necessari
  • Accesso con l'utente root
  • Un utente hadoop
  • Virtualbox

Configurazione della scheda di rete

Ora configureremo le schede di rete per poter stabilire le connessioni a Internet e agli altri nodi del cluster hadoop, per questo andiamo nel menu "Applicazioni -> Sistema -> Impostazioni" nella finestra che verrà visualizzata fare clic su "Rete "mostrerà le schede che configureremo. Apportare le seguenti modifiche con molta attenzione poiché queste impostazioni verranno utilizzate per accedere a Internet e agli altri nodi nel cluster. Verificando l'indirizzo MAC nelle opzioni delle schede in VirtualBox assegneremo gli indirizzi IPv4 come segue:

  • La scheda che verrà associata all'indirizzo MAC della "scheda bridge" di VirtualBox deve avere il DHCP automatico abilitato
  • La scheda che verrà associata all'indirizzo MAC della scheda "rete interna" di VirtualBox avrà IPv4 192.168.100.2 con Netmask 255.255.255.0 e Gateway 0.0.0.0;

Installazione del Sistema Operativo CentOS 7

Eseguiamo Virtualbox e creeremo tre VM con la configurazione hardware specificata nei prerequisiti, prestando particolare attenzione alle schede di rete che andremmo a creare essendo che la prima scheda di rete della Vm sarà "Bridge" e la seconda sarà "Rete interna" e una volta terminata la configurazione delle schede di rete passeremo a installare il sistema operativo CentOS 7. Nel nostro tutorial è stata scelta la distro con interfaccia grafica ma potremmo usara la versione minimale che occuperà meno spazio e meno memoria ram. Non appena sará visualizzata la schermata di installazione, creeremo l'utente "root" con una password semplice e un utente "hadoop" con una password semplice. Al termine dell'installazione riavviamo la VM con il Sistema Operativo che abbiamo appena installato e una volta che sarà mostrat schermata di accesso faremmo il login con l'utente "hadoop".

Attribuzione del nome dell'hostname

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

Disattivazione di SELINUX

Disattiveremo il sistema SELINUX per l'installazione di Hadoop, facendo clic sul menu "Applicazioni -> Preferiti -> Terminale" e una volta aperto digirare il comando:

sudo gedit /etc/selinux/config

quando verà richiesta la password, inseriremo la password che è abbiamo creato per l'utente "root". L'editor di testo verrà aperto con il file di configurazione di SELINUX e in esso cambieremo la linea in basso sostituendo "enforcing" per "disabled" come dall'esempio successivo:

SELINUX=enforcing
SELINUX=disabled

salviamo il file cliccando sul pulsante "Salva" e escire dall'editor di testo, fatto ciò avremo bisogno di abilitare le modifiche nel nostro CentOS 7 eseguendo, sempre nel terminale, il comando:

sudo setenforce 0

Disattivazione del servizio di Firewall

Disattiveremo il servizio Firewall in modo che non ci siano problemi di porte bloccate. Lo faremo digitando i seguenti comandi nel nostro terminale:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

Installazione di OpenJava JDK

Per utilizzare Hadoop è essenziale installare Java JDK e utilizzeremo la versione disponibile nella nostra versione di CentOS 7. Per iniziare, dobbiamo sincronizzare i repository del Sistema Operativo digitando i seguenti comandi nel terminale:

sudo yum clean all && yum repolist

verrà richiesta la password e useremo quella scelta per l'utente "root".
Aggiornati i repository installeremo il pacchetto OpenJava JDK digitando:

sudo yum install java-1.8.0-openjdk

Clonazione della VM per creare altre due VM che saranno i nodi

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 pulsante destro sulla VM che abbiamo appena finito di preparare.

Dopo la clonazione rinominiamo ogni macchina dando i nomi "slave1" e "slave2", quindi modificheremo le schede di rete di ognuna cancellando solamente le schede di rete "Bridge" e mantenendo solo la scheda "Rete interna", infine avvia tutte e tre le VM facendo clic su due volte sul loro nome e accedi con l'utente "hadoop" in tutte tre.

Aggiornamento delle configurazioni di rete nelle VM Slave1 e Slave2

Apriremo il menu "Applicazioni -> Sistema -> Impostazioni" e cliccheremo sull'icona "Rete" per modificare gli indirizzi IPv4 delle schede di entrambi gli slave. Vedremo che già avranno un indirizzo IP configurato, questo perchè sono state clonate dalla VM principale e pertanto dovremmo sostituire solamente lúltima parte dellIPv4 di ciascuna scheda e il "nome host" seguendo la seguente configurazione:

  • slave1 :
    • IPv4 192.168.100.3
    • netmask 255.255.255.0
    • Hostname "hadoop-slave1"
  • slave2 :
    • IPv4 192.168.100.4
    • netmask 255.255.255.0
    • Hostname "hadoop-slave2"

Alla fine delle nostre modifiche dovremmo ottenere la seguente configurazione di tutte le tre VM come nell'esempio in basso:

  • Nodo Master sheda di rete interna:
    • IPv4 192.168.100.2
    • netmask 255.255.255.0
    • Hostname "hadoop-master"
  • Nodo Master sheda di rete esterna:
    • IPv4 DHCP Automático
  • Nodo slave1:
    • IPv4 192.168.100.3
    • netmask 255.255.255.0
    • Hostname "hadoop-slave1"
  • Nodo slave2:
    • IPv4 192.168.100.4
    • netmask 255.255.255.0
    • Hostname "hadoop-slave2"

Configurazione del file "hosts" di tutte le VM

NB.: LE MODIFICHE IN BASSO DEVONO ESSERE EFFETTUATE NELLE TRE VM.

Accedi nell terminale con l'utente "root" per avere il permesso di modifica del file "hosts" dove inseriremo gli IP di tutti i nodi come da esempio in basso:

sudo gedit /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

Effettuata la procedura sopra testeremo la connessione tra le VM usando il comando ping

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

Configurazione delle variabili d'ambiente per Java JDK e il PATH di Hadoop

Nelle tre macchine andremmo a modificare il file "~/.bashrc"

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

e alla fine del file inseriremo le seguenti linee:

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 comandi sottostanti nelle tre VM:

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

Configurazione di SSH con autenticazione delle chiavi RSA pubbliche

NB.: LE MODIFICHE QUI SOTTO DEVONO ESSERE EFFETTUATE SOLO SULLA VM MASTER

Crea 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 andremmo a duplicare la linea della chiave pubblica, che è già presente nel file "authorized_keys", per fare ciò sarà necessario modificare il file digitando il seguente comando nel terminale:

gedit ~/.ssh/authorized_keys

Con il file aperto all'interno dell'editor di testo selezioneremo tutto il contenuto e incolleremo lo stesso contenuto alla fine della linea esistente, possiamo anche utilizzare la combinazione di "CTRL+a" più "CTRL+c" e "CTRL+v" per ottenere tre linee identiche. Per completare sarà necessario modificare solamente la parte finale di ogni linea cambiando il nome dell'hostname inserendo il nome dell'hostname di ogni VM come da esempio sotto:

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

NB.: fai attenzione a cambiare solo l'ultima parte della linea in cui si trova il nome host.

Adesso sarà necessario copiare le chiavi pubbliche all'interno di ciascun nodo, incluso "localhost", di ogni VM che formerà il cluster Nb.: questi comandi saranno inseriti 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:~/

Modificare i permessi su tutti gli host nel cluster
NB.: sempre dall'host "hadoop-master", inserisci i seguenti comandi:

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"

Ora testeremo gli accessi tramite ssh con chiavi condivise su tutte le macchine.

NB. Digitare questi 4 comandi in tutti e tre i nodi

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

Download di Apache Hadoop

Fare il download di Apache Hadoop usando il link in basso:
https://archive.apache.org/dist/hadoop/core/hadoop-2.9.1/hadoop-2.9.1.tar.gz

Preparazione di Hadoop

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

cd ~/Downloads/
tar xzvf hadoop-2.9.1.tar.gz
sudo su
mv hadoop-2.9.1 /hadoop
chown -R hadoop:hadoop /hadoop
exit

Modificare il file "core-site.xml"

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

inserendo tra le tags

<configuration>

</configuration>

le seguenti configurazioni:

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

Passeremo a modificare il file "hdfs-site.xml"

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

inserendo tra le tags

<configuration>

</configuration>

le seguenti configurazioni:

<property>
 <name>dfs.secondary.http.address</name>
        <value>hadoop-master:50090</value>
        <description>Secondary NameNode hostname</description>
</property>
<property>
        <name>dfs.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>

Creare una copia del file "mapred-site.xml.template" usando il nome "mapred-site.xml"

cp /hadoop/etc/hadoop/mapred-site.xml.template /hadoop/etc/hadoop/mapred-site.xml

Modificare il file "mapred-site.xml" nella seguente forma:

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

inserendo tra le tags

<configuration>

</configuration>

le seguenti configurazioni:

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

Modifichiamo il file "yarn-site.xml"

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

inserendo tra le tags

<configuration>

</configuration>

le seguenti configurazioni:

<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>hadoop-master:8025</value>
</property>
<property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>hadoop-master:8030</value>
</property>
<property>
        <name>yarn.resourcemanager.address</name>
        <value>hadoop-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>

Editare il file "hadoop-env.sh" modificando le variabili di ambiente nella parte finale del file come da esempio sotto:

NB.: queste impostazioni già sono esistenti nel file "hadoop-env.sh" e pertanto devono essere soltanto cambiate.

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

Modificare il file "masters" per la definizione del nodo primario del cluster.

gedit /hadoop/etc/hadoop/masters

Aggiungendo il nome in basso:

hadoop-master

Ora è il turno del file "slaves" per la definizione dei nodi secondari del cluster.

gedit /hadoop/etc/hadoop/slaves

Rimuovere tutto il contenuto del file e aggiungeremo i nomi in basso:

hadoop-slave1
hadoop-slave2

Creare una directory per poter contenere tutti i file di LOGS;

mkdir -p /hadoop/logs

Creare una directory per memorizzare i file temporanei di hadoop;

mkdir -p /hadoop/tmp

Crea le directory per contenere "namenode" e "datanode".

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

Copia della cartella "hadoop" già configurata in tutti i nodi disponibili.

Copia la cartella già configurata di "hadoop" dal nodo "hadoop-master" in tutti i nodi disponibili del cluster;

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

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

Modifica del proprietario sul nodo "hadoop-slave1":

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

Modifica del proprietario sul nodo "hadoop-slave2":

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

Preparare il file system HDFS per ricevere i dati

Formattare e avviare il cluster HDFS per poter ospitare tutti i nostri dati. NB:. I seguenti comandi verranno sempre eseguiti sul nodo "hadoop-master"

hdfs namenode -format

Avvia il servizio Hadoop per inserire i primi file:

start-dfs.sh

Verificare che il cluster sia stato in grado di avviarsi senza errori:

hdfs dfsadmin -report

se tutto funziona bene, questo comando restituirà la capacità e i nodi attivi.

Eseguire il servizio "Yarn"

start-yarn.sh

Per monitorare se il cluster di hadoop è in esecuzione, possiamo indirizzare il nostro browser web al seguente indirizzo:

http://192.168.100.2:50070

Mentre per monitorare il manager delle risorse YARN dovremmo indirizzare il nostro browser web al seguente indirizzo:

http://192.168.100.2:2088

Iniziamo a conoscere come funziona HDFS

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

hdfs dfs -mkdir -p /user/hadoop

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

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

Per verificare se la cartella è stata creata correttamente, digiteremo il comando:

hdfs dfs -ls /user/hadoop

Ora creiamo un file di testo da un comando che genera molti messaggi in uscita immettendo il comando seguente:

dmesg > ~/test.txt

Copieremo il file "test.txt" nella cartella "libri" creata in precedenza

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

Per elencare i file contenuti nella cartella hadoop scriveremo:

hdfs dfs -ls /user/hadoop/libri

Ora leggeremo il contenuto del file di test che è in HDFS

hdfs dfs -cat livros/test.txt

Con questo passo copieremo il file "test.txt" che è in HDFS nella cartella /tmp del nostro sistema operativo che ospita hadoop.

hdfs dfs -get livros/test.txt /tmp

Vediamo se questo è realmente accaduto digitando il comando:

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

Per mostrare l'aiuto dei comandi contenuti in HDFS, è possibile utilizzare i seguenti comandi:

hdfs dfs -help

Per interrompere il servizio hadoop è necessario digitare i comandi:

stop-yarn.sh 
stop-all.sh 

E infine sarà necessario spegnere tutte le VM e 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'

Referenze on-line di questa materia.

È possibile accedere alle seguenti risorse su questo argomento.
Anche se forniti con la speranza che siano utili, si prega di notare che non possiamo garantire l'accuratezza o la funzionalità dei contenuti ospitati esternamente.