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''))