ho un lavoro MapReduce definito main.py
, che importa il modulo lib
da lib.py
. Io uso Hadoop streaming di presentare questo lavoro al cluster Hadoop come segue:Come importare un modulo personalizzato in un lavoro MapReduce?
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -files lib.py,main.py
-mapper "./main.py map" -reducer "./main.py reduce"
-input input -output output
Nella mia comprensione, questo dovrebbe mettere sia main.py
e lib.py
nella cartella della cache distribuita su ogni macchina di calcolo e quindi rendere modulo lib
disponibili a main
. Ma non succede: dal log vedo che i file sono copiati nella stessa directory,, ma main
non possono importare lib
, lanciando ImportError
.
Perché ciò accade e come posso risolverlo?
UPD. Aggiunta la directory corrente al percorso non ha funzionato:
import sys
sys.path.append(os.path.realpath(__file__))
import lib
# ImportError
però, il caricamento del modulo ha fatto manualmente il trucco:
import imp
lib = imp.load_source('lib', 'lib.py')
Ma non è quello che voglio. Quindi perché l'interprete Python vede altri file .py
nella stessa directory, ma non li può importare? Si noti che ho già provato ad aggiungere un file vuoto __init__.py
alla stessa directory senza effetto.
Avete controllato 'sys.path' in' main.py' per assicurarvi che la directory di lavoro sia inclusa? – lmjohns3
@ lmjohns3: sì, la directory di lavoro si trova sul classpath. BTW, non è automaticamente incluso per lo script in esecuzione? (solo curioso) – ffriend
Credo che sia vero per gli script Python che vengono avviati sulla riga di comando, ma lo streaming Hadoop potrebbe avviare un interprete Python in un altro modo (non proprio sicuro). Ad ogni modo, continuo a pensare che questo possa sembrare un problema di percorso. Vedi http://www.litfuel.net/plush/?postid=195 per una possibilità di distribuire i tuoi moduli in un modo diverso. In alternativa, prova a scrivere i tuoi comandi in uno script di shell e passando quello per gli argomenti della riga di comando '-mapper' e' -reducer'. – lmjohns3