Hadoop Un tutoriel pour ceux qui veulent se lancer mais qui ont du mal à écrire en Java.
Étant donné que Hadoop est écrit en Java, Mapper / Reducer est également essentiellement écrit en Java, mais Hadoop a une fonction appelée Hadoop Streaming, qui permet aux données d'être transmises via l'entrée / sortie Unix standard. .. J'ai écrit Mapper / Reducer en Python en utilisant ceci. Bien sûr, si vous utilisez Hadoop Streaming, vous pouvez écrire dans des langages autres que Python.
Cette fois, j'ai construit un environnement pseudo-distribué sur Ubuntu.
Ubuntu12.04 + Haadoop2.4.1
Installez si vous n'avez pas Java
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
Télécharger Hadoop
$ 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 #.Il est bon de l'écrire en zshrc
Modifiez les 4 fichiers suivants
$ 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"
...
Ajouter si vous n'avez pas la clé
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
Enfin, initialisez namenode et démarrez Hadoop
$ hdfs namenode -format
$ sbin/start-dfs.sh
Cette fois, écrivez WordCount qui est un exemple de code de Hadoop en Python.
Préparez d'abord le fichier d'entrée
$ 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 génère quelque chose comme ce qui suit
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)
Le réducteur compte chaque mot produit par Mapper et produit quelque chose comme ce qui suit
a 1
b 2
c 3
Enfin, exécutez le mappeur / réducteur ci-dessus sur Hadoop
D'abord. Téléchargez le fichier jar pour Hadoop Streaming
$ wget http://repo1.maven.org/maven2/org/apache/hadoop/hadoop-streaming/2.4.1/hadoop-streaming-2.4.1.jar
Créez un répertoire sur HDFS et placez-y le fichier d'entrée (Veillez à ne pas gâcher les fichiers locaux et les fichiers HDFS)
$ hdfs dfs -mkdir /user
$ hdfs dfs -mkdir /user/vagrant
$ hdfs dfs -put inputs/input.txt /user/vagrant
Une fois exécuté, le résultat est stocké dans le répertoire de sortie spécifié
$ 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