wordcount python hadoop

wordcount - ¿Cómo puedo incluir un paquete de Python con el trabajo de transmisión de Hadoop?



hadoop streaming (4)

Comprimiría el paquete en .tar.gz o .zip y pasaría todo el tarball o archivo en una opción de -file a su comando hadoop. Lo hice en el pasado con Perl pero no con Python.

Dicho esto, creo que esto funcionaría para usted si utiliza el zipimport de Python en http://docs.python.org/library/zipimport.html , que le permite importar módulos directamente desde un zip.

Estoy intentando incluir un paquete de python (NLTK) con un trabajo de transmisión de Hadoop, pero no estoy seguro de cómo hacerlo sin incluir todos los archivos manualmente a través del argumento CLI, "-file".

Editar: Una solución sería instalar este paquete en todos los esclavos, pero actualmente no tengo esa opción.


Puedes usar zip lib así:

import sys sys.path.insert(0, ''nltkandyaml.mod'') import ntlk import yaml


Un ejemplo de carga del paquete python externo nltk
refiérase a la respuesta
Ejecutando extrnal python lib like (NLTK) con hadoop streaming
Seguí el siguiente enfoque y ejecuté el paquete nltk con la transmisión de hadoop con éxito.

Asunción, ya tienes tu paquete o (nltk en mi caso) en tu sistema

primero:

zip -r nltk.zip nltk mv ntlk.zip /place/it/anywhere/you/like/nltk.mod

¿Por qué cualquier lugar funcionará?
Resp .: como proporcionaremos la ruta a este archivo comprimido .mod a través de la línea de comandos, no necesitamos preocuparnos demasiado por ello.

segundo:
cambios en su mapeador o archivo .py

#Hadoop cannot unzip files by default thus you need to unzip it import zipimport importer = zipimport.zipimporter(''nltk.mod'') nltk = importer.load_module(''nltk'') #now import what ever you like from nltk from nltk import tree from nltk import load_parser from nltk.corpus import stopwords nltk.data.path += ["."]

tercero: argumento de línea de comando para ejecutar map-reduce

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar / -file /your/path/to/mapper/mapper.py / -mapper ''/usr/local/bin/python3.4 mapper.py'' / -file /your/path/to/reducer/reducer.py / -reducer ''/usr/local/bin/python3.4 reducer.py'' / -file /your/path/to/nltkzippedmodfile/nltk.mod / -input /your/path/to/HDFS/input/check.txt -output /your/path/to/HDFS/output/

Por lo tanto, el paso anterior resolvió mi problema y creo que debería resolver otros también.
aclamaciones,


Acabo de encontrar esta joya de solución: http://blog.cloudera.com/blog/2008/11/sending-files-to-remote-task-nodes-with-hadoop-mapreduce/

primero crea zip con las bibliotecas deseadas

zip -r nltkandyaml.zip nltk yaml mv ntlkandyaml.zip /path/to/where/your/mapper/will/be/nltkandyaml.mod

a continuación, incluya el argumento "-file" de la secuencia de Hadoop:

hadoop -file nltkandyaml.zip

finalmente, cargue las bibliotecas a través de python:

import zipimport importer = zipimport.zipimporter(''nltkandyaml.mod'') yaml = importer.load_module(''yaml'') nltk = importer.load_module(''nltk'')

Además, esta página resume cómo incluir un corpus: http://www.xcombinator.com/2009/11/18/how-to-use-cascading-with-hadoop-streaming/

descargar y descomprimir el corpus wordnet

cd wordnet zip -r ../wordnet-flat.zip *

en python:

wn = WordNetCorpusReader(nltk.data.find(''lib/wordnet-flat.zip''))