ImportError: no hay un módulo llamado numpy en spark workers

Lanzamiento de pyspark en modo cliente. bin/pyspark --master yarn-client --num-executors 60 El número de importación en el shell va bien pero falla en los kmeans. De alguna manera los ejecutores no tienen numpy instalado es mi sentimiento. No encontré ninguna buena solución en ningún lugar para que los trabajadores se enteraran de los problemas. Intenté configurar PYSPARK_PYTHON pero tampoco funcionó.

 import numpy features = numpy.load(open("combined_features.npz")) features = features['arr_0'] features.shape features_rdd = sc.parallelize(features, 5000) from pyspark.mllib.clustering import KMeans, KMeansModel from numpy import array from math import sqrt clusters = KMeans.train(features_rdd, 2, maxIterations=10, runs=10, initializationMode="random") 

Rastro de stack

  org.apache.spark.api.python.PythonException: Traceback (most recent call last): File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.zip/pyspark/worker.py", line 98, in main command = pickleSer._read_with_length(infile) File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.zip/pyspark/serializers.py", line 164, in _read_with_length return self.loads(obj) File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.zip/pyspark/serializers.py", line 422, in loads return pickle.loads(obj) File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.zip/pyspark/mllib/__init__.py", line 25, in  ImportError: No module named numpy at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:166) at org.apache.spark.api.python.PythonRunner$$anon$1.(PythonRDD.scala:207) at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:125) at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297) at org.apache.spark.rdd.RDD.iterator(RDD.scala:264) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297) at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:69) at org.apache.spark.rdd.RDD.iterator(RDD.scala:262) at org.apache.spark.rdd.ZippedPartitionsRDD2.compute(ZippedPartitionsRDD.scala:99) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297) at org.apache.spark.rdd.RDD.iterator(RDD.scala:264) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297) at org.apache.spark.rdd.RDD.iterator(RDD.scala:264) at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) at org.apache.spark.scheduler.Task.run(Task.scala:88) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) enter code here 

Para usar el modo de cliente Spark in Yarn, deberá instalar las dependencias en las máquinas en las que Yarn inicia los ejecutores. Esa es la única manera segura de hacer que esto funcione.

Usar el modo de agrupación de Spark with Yarn es una historia diferente. Puedes distribuir las dependencias de python con spark-submit.

 spark-submit --master yarn-cluster my_script.py --py-files my_dependency.zip 

Sin embargo, la situación con numpy se complica por lo mismo que lo hace tan rápido: el hecho de que hace el trabajo pesado en C. Debido a la forma en que está instalado, no podrá distribuir numpy de esta manera.

numpy no está instalado en las máquinas de trabajo (virtuales). Si usa anaconda, es muy conveniente cargar esas dependencias de python al implementar la aplicación en modo clúster. (Por lo tanto, no es necesario instalar números ni otros módulos en cada máquina, en su lugar deben instalarse en su anaconda). Primero, comprima su anaconda y coloque el archivo zip en el clúster, y luego puede enviar un trabajo usando el siguiente script.

  spark-submit \ --master yarn \ --deploy-mode cluster \ --archives hdfs://host/path/to/anaconda.zip#python-env --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=pthon-env/anaconda/bin/python app_main.py 

Yarn copiará anaconda.zip de la ruta hdfs a cada trabajador y usará ese pthon-env / anaconda / bin / python para ejecutar tareas.

Consulte Ejecutar PySpark con Virtualenv puede proporcionar más información.

Tuve un problema similar, pero no creo que necesites configurar PYSPARK_PYTHON en lugar de eso, simplemente instala Numpy en la máquina del trabajador (apt-get o yum). El error también le indicará en qué máquina faltó la importación.

 sudo pip install numpy 

parece que se vuelve a instalar numpy con “sudo”, y se pudo encontrar este módulo.

Tuve el mismo problema. Intenta instalar numpy en pip3 si estás usando Python3

pip3 install numpy

Debe tener en cuenta que debe tener instalado Numpy en todos y cada uno de los trabajadores, e incluso en el propio maestro (según la ubicación de su componente)

También asegúrate de iniciar el comando pip install numpy desde una cuenta raíz (sudo no es suficiente) después de forzar umask a 022 ( umask 022 ) para que coloque en cascada los derechos de Spark (o Zeppelin) User

Es tan simple como dice el error: “ImportError: No hay un módulo llamado numpy”.

instala pip y luego numpy

  1. Instalar pip

     yum install python-pip 
  2. instalar numpy

     pip install numpy 
  3. actualizar pip (este paso podría no ser necesario).

     pip install --upgrade pip