Hadoop Ein Tutorial für diejenigen, die anfangen möchten, aber es satt haben, in Java zu schreiben.
Da Hadoop in Java geschrieben ist, ist Mapper / Reducer grundsätzlich auch in Java geschrieben. Hadoop verfügt jedoch über eine Funktion namens Hadoop Streaming, mit der Daten über die Standard-Unix-Ein- / Ausgabe übertragen werden können. .. Ich habe Mapper / Reducer in Python damit geschrieben. Wenn Sie Hadoop Streaming verwenden, können Sie natürlich auch in anderen Sprachen als Python schreiben.
Dieses Mal habe ich eine pseudoverteilte Umgebung unter Ubuntu erstellt.
Ubuntu12.04 + Haadoop2.4.1
Installieren Sie, wenn Sie kein Java haben
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
Laden Sie Hadoop herunter
$ wget http://mirror.nexcess.net/apache/hadoop/common/hadoop-2.4.1/hadoop-2.4.1.tar.gz
$ tar zxvf hadoop-2.4.1.tar.gz
$ mv hadoop-2.4.1.tar.gz hadoop
$ rm hadoop-2.4.1.tar.gz
$ sudo mv hadoop /usr/local
$ cd /usr/local/hadoop
$ export PATH=$PATH:/usr/local/hadoop/bin #.Es ist gut, es in zshrc zu schreiben
Bearbeiten Sie die folgenden 4 Dateien
$ vim etc/hadoop/core-site.xml
core-site.xml
...
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
$ vim etc/hadoop/hdfs-site.xml
hdfs-site.xml
...
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
$ mv etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
$ vim etc/hadoop/mapred-site.xml
mapred-site.xml
...
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
$ vim etc/hadoop/hadoop-env.xml
hadoop-env.xml
...
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HADOOP_INSTALL=/usr/local/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_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
...
Hinzufügen, wenn Sie den Schlüssel nicht haben
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
Initialisieren Sie abschließend den Namensknoten und starten Sie Hadoop
$ hdfs namenode -format
$ sbin/start-dfs.sh
Schreiben Sie dieses Mal WordCount, einen Beispielcode für Hadoop in Python.
Bereiten Sie zuerst die Eingabedatei vor
$ mkdir inputs
$ echo "a b b c c c" > inputs/input.txt
Mapper
$ vim mapper.py
mapper.py
#!/usr/bin/env python
import sys
for l in sys.stdin:
for word in l.strip().split(): print '{0}\t1'.format(word)
Mapper gibt ungefähr Folgendes aus
a 1
b 1
b 1
c 1
c 1
c 1
Reducer
$ vim reducer.py
reducer.py
#!/usr/bin/env python
from collections import defaultdict
from operator import itemgetter
import sys
wordcount_dict = defaultdict(int)
for l in sys.stdin:
word, count = line.strip().split('\t')
wordcount_dict[word] += int(count)
for word, count in sorted(wordcount_dict.items(), key=itemgetter(0)):
print '{0}\t{1}'.format(word, count)
Der Reduzierer zählt jedes von Mapper ausgegebene Wort und gibt etwa Folgendes aus
a 1
b 2
c 3
Führen Sie abschließend den obigen Mapper / Reducer auf Hadoop aus
Zuerst. Laden Sie die JAR-Datei für Hadoop Streaming herunter
$ wget http://repo1.maven.org/maven2/org/apache/hadoop/hadoop-streaming/2.4.1/hadoop-streaming-2.4.1.jar
Erstellen Sie ein Verzeichnis in HDFS und legen Sie die Eingabedatei darauf ab (Achten Sie darauf, lokale Dateien und HDFS-Dateien nicht durcheinander zu bringen.)
$ hdfs dfs -mkdir /user
$ hdfs dfs -mkdir /user/vagrant
$ hdfs dfs -put inputs/input.txt /user/vagrant
Bei der Ausführung wird das Ergebnis im angegebenen Ausgabeverzeichnis gespeichert
$ hadoop jar hadoop-streaming-2.4.1.jar -mapper mapper.py -reducer reducer.py -input /user/vagrant/input.txt -output outputs
$ hdfs dfs -cat /user/vagrant/outputs/part-00000
a 1
b 2
c 3
Recommended Posts