Banana Pi Cluster für Hadoop – Teil 3 Hadoop

Banana Pi Cluster für Hadoop - Teil 3 Hadoop
Mein Banana Pi Cluster

In diesem Artikel beschreibe ich wie man Hadoop auf dem Banana Pi Cluster für Hadoop installiert und einrichtet. Danach wird erklärt wie man erste Tests auf dem Banana Pi Cluster mit Hadoop durchführen kann. Voraussetzung für die folgenden Schritte ist, dass der Cluster aufgebaut und im Netz erreichbar ist. Die Knoten sind hier mit bpi0-bpi4 benannt. Damit sich Hadoop mit allen Knoten verbinden kann richtet man zuerst einen ssh Zugriff zwischen den Knoten ein. Außerdem hat das den Vorteil, dass man Administrationsaufgaben ohne sich jedesmal an jedem Knoten anzumelden durchführen kann. Die folgenden Installations- und Einrichtungsschritte sind jeweils auf allen Knoten durchzuführen. Ausnahme ist das Starten und stoppen von Hadoop, das nur auf dem Master auszuführen ist. Hadopp startet/stoppt dann selbständig alle Knoten. Als Grundlage habe ich den ausgzeichneten Artikel von Bram Vandewalle verwendet, der eine solche Anleitung für den Raspberry Pi geschrieben hat.

Banana Pi Cluster – SSH Zugriff einrichten

Im ersten Schritt legen wir eine Gruppe und einen User für Hadoop auf jedem der Knoten an.

sudo addgroup hadoop
sudo adduser --ingroup hadoop hduser
sudo adduser hduser sudo

Jetzt wechseln wir auf dem Master (bpi0) zu diesem User, weil wir die nachfolgenden Schritte alle unter dem Hadoop User durchführen.

su hduser

Anschließend werden die SSH Schlüssel generiert:

cd ~
mkdir .ssh
ssh-keygen -t rsa -P ""
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys

Und dann verteilen wir diese Schlüssel auf die anderen Banana Pi’s.

cat ./.ssh/id_rsa.pub | ssh hduser@bpi1 'cat >> ./.ssh/authorized_keys'
cat ./.ssh/id_rsa.pub | ssh hduser@bpi2 'cat >> ./.ssh/authorized_keys'
cat ./.ssh/id_rsa.pub | ssh hduser@bpi3 'cat >> ./.ssh/authorized_keys'
cat ./.ssh/id_rsa.pub | ssh hduser@bpi4 'cat >> ./.ssh/authorized_keys'

Bei jedem dieser Kommandos wird nach dem Passwort gefragt. Danach sollte es möglich sein sich einfach als hduser auf dem Master per

ssh hduser@bpi1 - bpi4

auf den Knoten anzumelden ohne das nach einem Passwort gefragt wird.

Banana Pi Cluster – Oracle Java 7 installieren

Um Hadoop zu verwenden benötigt man auf jedem Knoten eine Java 7 Installation. Da der Banana Pi nicht die richtige Version in seinen Repos hatte, musste ich Java halbautomatisch installieren.

Zunächst fügt man die rictigen Repositories hinzu (als root), dann installieren man die Pakete:

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EA14886
apt-get update
apt-get install oracle-java7-installer
apt-get install oracle-java7-set-default

Die Version kann man durch Aufruf von

java -version

überprüfen.

Banana Pi Cluster – Installation von Hadoop

Um Hadoop zu installieren geht man wie folgt vor:

wget ftp://apache.belnet.be/mirrors/ftp.apache.org/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz
sudo mkdir /opt
cd ~
sudo tar -xvzf hadoop-2.7.1.tar.gz -C /opt/
cd /opt
sudo chown -R hduser:hadoop hadoop-2.7.1/

und ändert dann die Umgebungsvariablen in dem man an die Datei ~/.bashrc folgende Zeilen anfügt:

#
# This is for Hadoop
#
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:jre/bin/java::")
export HADOOP_HOME=/opt/hadoop-2.7.1
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_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

Um die Variablen einzulesen gibt man einmal

source ~/.bashrc

ein.

Wenn alles geklappt hat, kann man jetzt durch Eingabe von

hadoop version

erfolgreich überprüfen, das Hadoop installiert ist und erhält eine Ausgabe wie:

Hadoop 2.7.1
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 15ecc87ccf4a0228f35af08fc56de536e6ce657a
Compiled by jenkins on 2015-06-29T06:04Z
Compiled with protoc 2.5.0
From source with checksum fc0a1a23fc1868e4d5ee7fa2b28a58a
This command was run using /opt/hadoop-2.7.1/share/hadoop/common/hadoop-common-2.7.1.jar

Banana Pi Cluster – Hadoop Konfigurieren

Alle Dateien zur Konfiguration von Hadoop sind im Verzeichnis  /opt/hadoop-2.7.1/etc/hadoop/abgelegt.

In der Datei hadoop_env.sh sucht man die Zeile für JAVA_HOME und ersetzt sie mit:

# The java implementation to use.
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/jre
#${JAVA_HOME}

Damit findet Hadoop auch unsere Java Installation.

Die weiteren Dateien zur Einrichtung von Hadoop sind alle in XML abgelegt. Die vielfältigen Möglichkeiten Hadoop einzustellen, kann ich hier nicht beschreiben. Daher beschränke ich mich auf die für unseren kleinen Cluster notwendigen Teile und die notwendigen Auszüge, die entsprechend zu übernehmen sind.

core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://bpi0:8020/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hdfs/tmp</value>
</property>
</configuration>
hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
mapred-site.xml:
<configuration> 
<property>
<name>mapred.job.tracker</name>
<value>bpi0:8021</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>1</value>
</property>
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>1</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>256</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx210m</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>256</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx210m</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>256</value>
</property>
</configuration>
yarn-site.xml:
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn<;/value>
</property>
<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.resourcemanager.resource-tracker.address</name>
<value>bpi0:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>bpi0:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address.address</name>
<value>bpi0:8040</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>768</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>128</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>768</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>4</value>
</property>
</configuration>

Banana Pi Cluster – Vorbereiten des Hadoop Dateisystems (HDFS)

Um HDFS zu verwenden muss ein entsprechendes Verzeichnis anglegt werden und dieses formatiert werden:

sudo mkdir -p /hdfs/tmp
sudo chown hduser:hadoop /hdfs/tmp
chmod 750 /hdfs/tmp
hdfs namenode -format

Banana Pi Cluster – Starten/Stoppen von Hadoop

Endlich ist es soweit, wir können den Hadoop Cluster starten.

cd $HADOOP_HOME/sbin &amp;amp;&amp;amp; start-dfs.sh &amp;amp;&amp;amp; start-yarn.sh

Um zu überprüfen, ob der Start erfolgreich war, kann man mit dem Kommando jps anzeigen welche Prozesse gestartet wurden.

Ausgabe Masternode:
2523 ResourceManager
2595 Jps
2179 NameNode
2349 SecondaryNameNode
Ausgabe Datanode:
2285 Jps
2052 DataNode
2162 NodeManager

Um Hadoop anzuhalten verwendet man folgende Aufrufe:

stop-yarn.sh &amp;amp;&amp;amp; stop-dfs.sh

Der Hadoop Cluster läuft. :-)

Ergebnisse aus meinen Performancemessungen und wie ich die Tests durchgeführt habe, werde ich in einem eigenen Artikel veröffentlichen. Im Anschluß kommen jetzt noch einige Tipps und Optimierungen, die nicht zwingend nötig sind, jedoch vielleicht hilfreich für diejenigen, die an den gleichen Stellen Probleme gehabt haben.

Verwenden der nativen Hadoop Bibliothek für den Raspberry Pi’s ARMv7 Prozessor

Beim Ausführen der Hadoop Programme erschien bei mir immer folgende Warnung:

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

Das liegt daran, das das normale Hadoop-Paket nur mit 32-bit x86 Bibliotheken ausgeliefert wird. Der Banana Pi hat aber einen ARMv7 Prozessor und daher können diese Bibliotheken nicht verwendet werden. Die Lösung ist es die Bibliotheken auf dem Banana Pi selbst zu übersetzen.

Den Großteil der Lösung fand ich dann in dem Artikel: „Building the native Hadoop library for Raspberry Pi’s ARMv7 processor„, der sehr schön beschreibt wie man auf dem Raspberry Pi vorgehen muss.

Damit alle klappt müssen vorher noch einige Pakete installiert werden:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install maven build-essential g++ autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev libfuse-dev libsnappy-dev libsnappy-java libbz2-dev subversion

Weiterhin benötigt Hadoop 2.7.1 die Bibliothek protbuf 2.5.0 (und zwar genau diese Version)

wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
tar -xvzf protobuf-2.5.0.tar.gz -C /tmp
cd /tmp/protobuf-2.5.0
./configure --prefix=/usr
make
make check
sudo make install

Nach diesen Vorbereitungen fehlen nur noch wenige Schritte, bis Hadoop übersetzt werden kann.

cd ~
wget ftp://apache.belnet.be/mirrors/ftp.apache.org/hadoop/common/hadoop-2.7.1/hadoop-2.7.1-src.tar.gz
tar -xvzf hadoop-2.7.1-src.tar.gz
rm -rf hadoop-2.7.1-src.tar.gz

Der ARM Prozessor hat eigene in der Hardware verdrahtete Routinene um Gleitkommazahlen zu verareibeiten. Dieser Patch: https://issues.apache.org/jira/browse/HADOOP-9320 hilft dabei, das die Hadoop Sourcen so angepasst werden, das eine Übersetzeung auf dem Banana Pi möglich wird.

Zum Einspielen des Patches dienen folgene Kommandos:

cd hadoop-common-project/hadoop-common/src
wget https://issues.apache.org/jira/secure/attachment/12570212/HADOOP-9320.patch
patch &amp;lt; HADOOP-9320.patch

Jetzt ist es soweit Hadoop kann übersetzt werden. Das kann dauern…

cd ../../..
mvn package -Pdist,native -DskipTests -Dtar

Da der Banana Pi nur ein Gigabyte Speicher hat kann es sein, das der Build-Vorgang mit Out-of-memory Problemen abbricht oder vom lowmemorykiller einfach beendet wird.
Man erkennt das daran das entweder beim Übersetzen mit

mvn package -e -Pdist,native -DskipTests -Dtar

die Meldung Out-of-memory kommt oder im Syslog (kann man mit dmesg anzeigen lassen) etwas steht wie:

lowmemorykiller: Killing 'java' (3093), adj 0,
to free 552088kB on behalf of 'javadoc' (3720) because
cache 6048kB is below limit 6144kB for oom_score_adj 0
Free memory is -2512kB above reserved

Das -e zeigt dabei alle Fehlermeldungen und Warnungen beim Übersetzen an. Beheben kann man das indem man als root in /etc/sysctl.conf ganz unten die Zeile

vm.overcommit_memory=1

anfügt und für Maven folgende Optionen setzt:

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'

Weiterhin habe ich bei der Übersetzung die Dokumentation mit javadoc abgeschaltet (das benötigt richtig viel Speicher) durch Eingabe von

mvn -e package -Pdist,native -DskipTests -Dtar -Dmaven.javadoc.skip=true

So hat es dann bei mir funktioniert und nach ca. 90 Minuten war Hadoop übersetzt.
Sollte das auch nicht klappen, kann man versuchen die einzelnen Unterverzeichnisse einzeln zu übersetzen. Dazu wechselt man in das jeweiligt Unterverzeichnis und startet den Build Prozess wie zuvor beschrieben.

Abschließend kopiert man die selbst auf dem ARMv7 Prozessor übersetzten Bibliotheken in das Hadoop-Verzeichnis:

cd /opt/hadoop-2.7.1/lib/native/
mkdir native.orig
cp * native.orig
cp /home/hduser/hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1/lib/native/* .

Jetzt sollte die Warnung beim Ausführen von Hadoop Programmen nicht mehr auftreten.

Banana Pi Cluster – Tipps und Tricks

Anzeige von Informationen über die Datanodes und die Verteilung der Daten:

hadoop dfsadmin -report

Detaillierte Informationen über die Verteilung der Datenblöcke erhält man mit:

hadoop fsck <hdfs_file_path> -files -blocks -locations

Um die ständig blitzende Heartbeat LED (grün) auszuschalten:

echo none > /sys/class/leds/green:ph24:led1/trigger
Teile diesen Beitrag

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

:bye: 
:good: 
:negative: 
:scratch: 
:wacko: 
:yahoo: 
B-) 
mehr...
 


Diese Seite verwendet Cookies. Mit der Nutzung von tuxlog erklärst Du Dich mit der Verwendung von Cookies einverstanden. Detaillierte Informationen über die Verwendung von Cookies auf dieser Website findest Du in der Datenschutzerklärung.

Nach oben scrollen