Implementare Apache Hadoop in Microsoft Azure

Dopo aver affrontato Apache Hadoop nella sua descrizione generale, in questo articolo ci occuperemo di come implementare il semplice framework Apache Hadoop senza l’uso di applicativi in grado di gestire il data processing. È importate specificare che Apache Hadoop, è un framework in grado di gestire solo HDFS e il processo di MapReduce:

Come si nota nell’immagine, per poter interfacciare eventuali applicativi di vario genere è necessario installare in maniera parallela software come Pig, Hive, HBase etc.

Hadoop per il suo funzionamento deve essere installato su OS che sia Windows o Linux: in questa sperimentazione verrà installato su Ubuntu 16.04 LTS SERVER a 64 bit; per comodità il sistema Operativo Server, verrà installato su Microsoft Azure, in grado di creare macchine virtuali per ogni scopo, scalabili ed in grado di erogare prestazioni elevate.

Seguendo le immagini, tramite il menu verticale occorre cliccare su “Macchine Virtuali“, all’interno cercare “Ubuntu Server 16.04 LTS” ed infine “Crea“.

Dopo aver cliccato sul tasto “Crea“, compare la finestra dove poter creare la nostra macchina virtuale e settarla a dovere, scegliendo anche le caratteristiche fisiche della macchina stessa.

Al termine del provisioning, è possibile entrare all’interno del pannello amministrativo della macchina virtuale, dove in home page si osservano le informazioni principali, tra cui alcuni pulsanti in grado di riavviare o arrestare la macchina.

Al termine dell’installazione, si è verificato che tutti i servizi e processi fossero partiti in regola per poi iniziare la configurazione del sistema per accogliere Apache Hadoop.

Per poter collegarsi è necessario utilizzare il protocollo SSH, digitando IP e porta sul quale collegarsi nell’applicativo “Putty”.

Dopo essersi loggati, di seguito vengono riportati tutti i comandi per poter preparare il sistema ad accogliere Hadoop 2.7.1 e poterlo eseguire correttamente.

Prima di procedere all’installazione e configurazione di Hadoop, è necessario verificare che siano presenti, su Ubuntu Server, alcuni packages necessari:

Oracle JDK 1.8

  • sudo apt-get purge openjdk*
  • sudo apt-get install software-properties-common
  • sudo add-apt-repository ppa:webupd8team/java
  • sudo apt-get update
  • sudo apt-get install oracle-java8-installer

La versione di Apache Hadoop che andremo ad installare risulta essere compatibile con Java 7/8. Gli stessi sviluppatori consigliano per Hadoop 2.7.1 la versione Java 8 Oracle.

Maven

  • Sudo apt-get -y install maven

Maven è un software opensource, sviluppato da Apache, che aiuta ad organizzare in modo efficiente programmi eseguibili Java.

Grazie a Maven è possibile avere una standardizzazione della struttura di un progetto compilazione, test ed esporti automatici, gestione e download automatico delle librerie necessarie al progetto e creazione automatica di un semplice sito di gestione del progetto.

Librerie Native

  • sudo apt-get -y install build-essential autoconf automake libtool
  • sudo apt-get -y install cmake zlib1g-dev pkg-config libssl-dev

ProtocoBuffer 2.5.0

  • sudo apt-get -y install libprotobuf-dev protobuf-compiler

Bzip2

  • sudo apt-get install bzip2 libbz2-dev

Jansson

  • sudo apt-get install libjansson-dev

Linux FUSE

  • sudo apt-get install fuse libfuse-dev

Ultimo package, corrisponde al Filesystem in userspace. Anch’esso risulta essere un progetto open source, il quale installa un modulo per architetture linux, che permette agli utenti non root di creare un proprio file system senza dover scrivere codice a livello kernel. Fuse risulta essere molto utile per creare e scrivere filesystem virtuali semplicemente collegandosi alla partizione desiderata.

Terminata l’installazione di questi package, possiamo iniziare il download di Hadoop 2.7.1 tramite repository ufficiali:

Terminata l’estrazione dell’archivio possiamo compilare tramite maven

  • mvn package -Pdist -DskipTests -Dtar

Altri due elementi come SSH e Rsync che saranno indispensabili per collegarsi al nodo:

  • sudo apt-get install ssh
  • sudo apt-get install rsync

Organizziamo il SO in modo da creare un gruppo di lavoro Hadoop e utente hduser:

  • sudo addgroup hadoop
  • sudo adduser --ingroup hadoop hduser
  • sudo adduser hduser sudo
  • sudo su hduser

Hadoop applica SSH, adoperando un canale criptato protetto per comunicare con gli altri nodi per gestire i demoni HDFS e MapReduce. Per verificare l’accesso tramite SSH è opportuno copiare la chiave RSA generata in modo da autenticare il nodo.

  • ssh-keygen -t rsa -P ""
  • cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

Al termine verifichiamo che è possibile accedere tramite SSH in questo modo:

  • ssh localhost

A questo punto deve essere recuperato il file generato dalla compilazione maven:

  • sudo cp hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1.tar.gz /home/hduser/
  • sudo tar -zxf hadoop-2.7.1.tar.gz

Spostiamo la cartella creata in /usr/local/hadoop

  • sudo mkdir /usr/local/hadoop
  • sudo mv /home/hduser/hadoop-2.7.1/* /usr/local/hadoop/
  • sudo chown hduser:hadoop -R /usr/local/hadoop
  • sudo mkdir -p /usr/local/hadoop_tmp/hdfs/namenode
  • sudo mkdir -p /usr/local/hadoop_tmp/hdfs/datanode
  • sudo chown hduser:hadoop -R /usr/local/hadoop_tmp/

Avendo fissato ed installato Hadoop nel sistema locale, adesso è possibile passare alla configurazione sul quale si sviluppa Hadoop.

I file che andremo a modificare per la configurazione in Pseudo-distribuited sono:

  • ~/.bashrc
  • /usr/local/hadoop/etc/hadoop/hadoop-env.sh
  • /usr/local/hadoop/etc/hadoop/core-site.xml
  • /usr/local/hadoop/etc/hadoop/hdfs-site.xml
  • /usr/local/hadoop/etc/hadoop/yarn-site.xml
  • /usr/local/hadoop/etc/hadoop/mapred-site.xml

~/.Bashrc

All’intero di questo file sono presenti tutte le variabili ambientali del sistema operativo linux in esecuzione. È possibile, editando questo file, modificare la Shell Linux. Le nostre modifiche saranno utili per indicare al sistema operativo il corretto percorso di Apache Hadoop e della JVM di Java.

  • Su -l hduser
  • Sudo nano ~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

export HADOOP_HOME=/usr/local/hadoop

export PATH=$PATH:$HADOOP_HOME/bin

export PATH=$PATH:$HADOOP_HOME/sbin

export HADOOP_MAPRED_HOME=$HADOOP_HOME

export HADOOP_COMMON_HOME=$HADOOP_HOME

export HADOOP_HDFS_HOME=$HADOOP_HOME

export YARN_HOME=$HADOOP_HOME

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native

Hadoop-Env.Sh

Questo file contiene alcune impostazioni sulle variabili di ambiente utilizzate da Hadoop. È possibile utilizzare questi per influire su alcuni aspetti del comportamento del demone Hadoop, come ad esempio i file di log in cui vengono archiviati, la quantità massima di memoria utilizzata, ecc

  • sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh

In questo file andiamo a specificare il path della JVM presente nel sistema

JAVA_HOME=/usr/lib/jvm/java-8-oracle

Core-Site.Xml

In questo file XML comunichiamo ad Hadoop dove il Namenode si trova nel cluster.

  • sudo nano /usr/local/hadoop/etc/hadoop/core-site.xml

<configuration>

<property>

<name>fs.default.name</name>

<value>hdfs://localhost:9000</value>

</property>

</configuration>

Yarn-Site.Xml

  • sudo nano /usr/local/hadoop/etc/hadoop/yarn-site.xml

<configuration>

<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>

</configuration>

Hdfs-Site.Xml

Contiene i settaggi di configurazione per il demone HDFS; il Namenode, eventuale Secondary NameNode e il DataNode. Qui possiamo configurare eventuali politiche di replica e permessi di scrittura e lettura del HDFS.

  • sudo nano /usr/local/hadoop/etc/hadoop/hdfs-site.xml

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

<name>dfs.namenode.name.dir</name>

<value>file:/usr/local/hadoop_tmp/hdfs/namenode</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>file:/usr/local/hadoop_tmp/hdfs/datanode</value>

</property>

</configuration>

Mapred-Site.Xml

Questo file contiene le configurazioni per i demoni MapReduce insieme al Jobtracker e task-trackers.

  • sudo nano /usr/local/hadoop/etc/hadoop/hdfs-site.xml

<property>

<name>mapreduce.framework.name</name>

<value>yarn </value>

</property>

Terminata la configurazione Pseudo Distribuita è possibile passare alla formattazione del nodo (namenode) andando a generare il filesystem:

  • hdfs namenode -format

Tramite questo comando, vengono cancellati tutti i dati precedenti nel filesystem HDFS e generato uno nuovo.

Avvio dei Demoni

Dopo aver eseguito tutti i passaggi analizzati fino ad ora, possiamo avviare Hadoop in questo modo:

  • start-dfs.sh
  • start-yarn.sh

Per poter verificare se i due demoni sono attivi basta digitare:

  • Jps

5424 DataNode

5621 SecondaryNameNode

5820 ResourceManager

6031 Jps

5295 NameNode

5951 NodeManager

Per stoppare i demoni sarà necessario digitare:

  • stop-dfs.sh
  • stop-yarn.sh

Portali di Management

Apache Hadoop possiede un’interfaccia grafica che è possibile raggiungere tramite Browser andando ad interrogare queste pagine web:

  • Name Node status: http://localhost:50070/dfshealth.jsp
  • Job Tracker status: http://localhost:50030/jobtracker.jsp
  • Task Tracker status: http://localhost:50060/tasktracker.jsp
  • Data Block Scanner Report: http://localhost:50075/blockScannerReport