Introduction à Hadoop et MapReduce avec Python

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

Construction de l'environnement Hadoop

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

Ecrire un mappeur / réducteur en Python

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

Exécution par Hadoop Streaming

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

Introduction à Hadoop et MapReduce avec Python
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
python avec pyenv et venv
Fonctionne avec Python et R
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
[Introduction à Python3 Jour 1] Programmation et Python
Scraping avec Node, Ruby et Python
Grattage avec Python, Selenium et Chromedriver
Grattage avec Python et belle soupe
Encodage et décodage JSON avec python
[GUI en Python] PyQt5-Glisser-déposer-
Lire et écrire NetCDF avec Python
J'ai joué avec PyQt5 et Python3
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
Coexistence de Python2 et 3 avec CircleCI (1.0)
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
Communiquez entre Elixir et Python avec gRPC
Construction de pipeline de données avec Python et Luigi
Calculer et afficher le poids standard avec python
Surveiller les pannes de Mojo avec Python et Skype
[Automation] Manipulez la souris et le clavier avec Python
Authentification sans mot de passe avec RDS et IAM (Python)
Installation de Python et gestion des packages avec pip
Introduction au remplissage d'image Python Remplissage d'image à l'aide d'ImageDataGenerator
POSTER diversement avec Python et recevoir avec Flask
Capturer des images avec Pupil, python et OpenCV
Fractal pour faire et jouer avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
Introduction facile de la reconnaissance vocale avec Python
[Introduction à Python] Utilisons foreach avec Python
Utilisez PIL ou Pillow avec Cygwin Python
Créer et décrypter du code César avec python
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Lire et écrire des fichiers JSON avec Python
Gérer les "années et mois" en Python
J'ai installé et utilisé Numba avec Python3.5
Analyse des tweets avec Python, Mecab et CaboCha
Lier Python et JavaScript avec le notebook Jupyter
Surveillance du trafic avec Kibana, ElasticSearch et Python
Modulation et démodulation FM avec Python Partie 2
Crypter avec Ruby (Rails) et décrypter avec Python
Téléchargez facilement des mp3 / mp4 avec python et youtube-dl!
Faites fonctionner des appareils électroménagers avec Python et IRKit
Nettoyer l'environnement python avec Pythonz et virtualenv
Pratiquer le web scraping avec Python et Selenium
Introduction facile de la série python3 et d'OpenCV3
Scraping Web facile avec Python et Ruby
Importer et exporter des images GeoTiff avec Python
J'utilise tox et Python 3.3 avec Travis-CI