2017-10-16 7 views
0

J'ai précédemment construit des environnements pyspark en utilisant conda pour regrouper toutes les dépendances et les envoyer à tous les nœuds à l'exécution. Voilà comment je crée l'environnement:Zipping Conda Environment Breaks Le backend d'Audioread (Python/Pyspark)

`conda/bin/conda create -p conda_env --copy -y python=2 \ 
numpy scipy ffmpeg gcc libsndfile gstreamer pygobject audioread librosa` 

`zip -r conda_env.zip conda_env` 

Ensuite, l'approvisionnement conda_env et en cours d'exécution shell pyspark je peux exécuter avec succès:

`import librosa 
y, sr = librosa.load("test.m4a")` 

Remarque sans l'environnement provient ce résultat de script dans une erreur ffmpeg/GStreamer sont pas installé sur mon localement. L'envoi d'un script au cluster génère une erreur librosa.load qui renvoie à audioread indiquant que le backend (gstreamer ou ffmpeg) ne peut plus être trouvé dans l'environnement d'archivage compressé. Le stacktrace est ci-dessous:

Soumettre:

`PYSPARK_PYTHON=./NODE/conda_env/bin/python spark-submit --verbose \ 
     --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./NODE/conda_env/bin/python \ 
     --conf spark.yarn.appMasterEnv.PYTHON_EGG_CACHE=/tmp \ 
     --conf spark.executorEnv.PYTHON_EGG_CACHE=/tmp \ 
     --conf spark.yarn.executor.memoryOverhead=1024 \ 
     --conf spark.hadoop.validateOutputSpecs=false \ 
     --conf spark.driver.cores=5 \ 
     --conf spark.driver.maxResultSize=0 \ 
     --master yarn --deploy-mode cluster --queue production \ 
     --num-executors 20 --executor-cores 5 --executor-memory 40G \ 
     --driver-memory 20G --archives conda_env.zip#NODE \ 
     --jars /data/environments/sqljdbc41.jar \ 
     script.py` 

Trace:

`Caused by: org.apache.spark.api.python.PythonException: Traceback (most recent call last): 
    File "/mnt/yarn/usercache/user/appcache/application_1506634200253_39889/container_1506634200253_39889_01_000003/pyspark.zip/pyspark/worker.py", line 172, in main 
    process() 
    File "/mnt/yarn/usercache/user/appcache/application_1506634200253_39889/container_1506634200253_39889_01_000003/pyspark.zip/pyspark/worker.py", line 167, in process 
    serializer.dump_stream(func(split_index, iterator), outfile) 
    File "/mnt/yarn/usercache/user/appcache/application_1506634200253_39889/container_1506634200253_39889_01_000003/pyspark.zip/pyspark/serializers.py", line 263, in dump_stream 
    vs = list(itertools.islice(iterator, batch)) 
    File "script.py", line 245, in <lambda> 
    File "script.py", line 119, in download_audio 
    File "/mnt/yarn/usercache/user/appcache/application_1506634200253_39889/container_1506634200253_39889_01_000003/NODE/conda_env/lib/python2.7/site-packages/librosa/core/audio.py", line 107, in load 
    with audioread.audio_open(os.path.realpath(path)) as input_file: 
    File "/mnt/yarn/usercache/user/appcache/application_1506634200253_39889/container_1506634200253_39889_01_000003/NODE/conda_env/lib/python2.7/site-packages/audioread/__init__.py", line 114, in audio_open 
    raise NoBackendError() 
NoBackendError` 

Ma question est: Comment puis-je emballer cette archive afin que librosa (audioread vraiment) est en mesure de trouver le backend et charger les fichiers .m4a?

Répondre

0

C'était un problème de chemin, les exécuteurs ne pouvaient pas trouver FFMPEG bien qu'il ait été empaqueté dans l'environnement de conda. Ce hack le corrige.

path = os.getenv("PATH") 
if "./NODE/conda_env/bin" not in path: 
    path += os.pathsep + "./NODE/conda_env/bin" 
    os.environ["PATH"] = path 
y, _ = librosa.load(audiofn, self.conf.sr)