ImportError: No module named numpy on spark workers
ImportError: No module named numpy on spark workers
正在客户端模式下启动 pyspark。 bin/pyspark --master yarn-client --num-executors 60
shell 上的 import numpy 运行良好,但在 kmeans 中失败。不知何故,执行者没有安装 numpy 是我的感觉。我没有在任何地方找到任何好的解决方案来让工人了解 numpy。我尝试设置 PYSPARK_PYTHON 但这也没有用。
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")
堆栈跟踪
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 <module>
ImportError: No module named numpy
at org.apache.spark.api.python.PythonRunner$$anon.read(PythonRDD.scala:166)
at org.apache.spark.api.python.PythonRunner$$anon.<init>(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
要在 Yarn 客户端模式下使用 Spark,您需要在 Yarn 启动执行程序的机器上安装任何依赖项。这是完成这项工作的唯一可靠方法。
在 Yarn 集群模式下使用 Spark 是另一回事。您可以使用 spark-submit 分发 python 依赖项。
spark-submit --master yarn-cluster my_script.py --py-files my_dependency.zip
但是,numpy 的情况由于使它如此之快的同一件事而变得复杂:事实上,它在 C 中完成了繁重的工作。由于它的安装方式,您将无法分发numpy 这种方式。
我遇到了类似的问题,但我认为您不需要设置 PYSPARK_PYTHON,而只需在工作计算机(apt-get 或 yum)上安装 numpy。该错误还会告诉您在哪台机器上缺少导入。
numpy 未安装在工作(虚拟)机器上。如果你使用anaconda,在集群模式下部署应用时上传这样的python个依赖是非常方便的。 (所以不需要在每台机器上安装 numpy 或其他模块,它们必须在你的 anaconda 中)。
首先,压缩你的 anaconda 并将 zip 文件放入集群,然后你可以使用以下脚本提交作业。
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 将从 hdfs 路径复制 anaconda.zip 到每个 worker,并使用那个 pthon-env/anaconda/bin/python 来执行任务。
参考 Running PySpark with Virtualenv 可能会提供更多信息。
我遇到了同样的问题。如果您使用 Python3
,请尝试在 pip3 上安装 numpy
pip3 install numpy
你必须知道你需要在每个 worker 上安装 numpy,甚至 master 本身(取决于你的组件放置)
还要确保在将 umask 强制为 022 (umask 022
) 后从 root 帐户启动 pip install numpy
命令(sudo 不够),以便将权限级联到 Spark(或 Zeppelin)User
为我解决了这个问题(在 mac
上)实际上是这个指南(它还解释了如何 运行 python 通过 Jupyter Notebooks
-
https://medium.com/@yajieli/installing-spark-pyspark-on-mac-and-fix-of-some-common-errors-355a9050f735
简而言之:
(假设您使用 brew install spark
安装了 spark)
- 使用 -
brew info apache-spark
找到 SPARK_PATH
- 将这些行添加到您的
~/.bash_profile
# Spark and Python
######
export SPARK_PATH=/usr/local/Cellar/apache-spark/2.4.1
export PYSPARK_DRIVER_PYTHON="jupyter"
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
#For python 3, You have to add the line below or you will get an error
export PYSPARK_PYTHON=python3
alias snotebook='$SPARK_PATH/bin/pyspark --master local[2]'
######
- 您只需调用以下命令即可打开
Jupyter Notebook
:
pyspark
请记住,您不需要设置 Spark Context
,只需调用:
sc = SparkContext.getOrCreate()
我的环境变量 PYSPARK_PYTHON
没有设置,所以我设置了 /etc/environment
文件并添加了 python 环境路径到变量。
PYSPARK_PYTHON=/home/venv/python3
之后就没有这个错误了
需要检查的几件事
- 在具有 sudo 权限的工作节点上安装所需的包,以便所有用户都可以使用它们
- 如果您在工作节点上有多个版本的 python,请确保为 Spark 使用的 python 安装软件包(通常由 PYSPARK_PYTHON 设置)。
- 最后,要传递自定义模块(.py 文件),请在使用 spark-submit 或 pyspark
启动会话时使用 --py-files
正在客户端模式下启动 pyspark。 bin/pyspark --master yarn-client --num-executors 60
shell 上的 import numpy 运行良好,但在 kmeans 中失败。不知何故,执行者没有安装 numpy 是我的感觉。我没有在任何地方找到任何好的解决方案来让工人了解 numpy。我尝试设置 PYSPARK_PYTHON 但这也没有用。
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")
堆栈跟踪
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 <module>
ImportError: No module named numpy
at org.apache.spark.api.python.PythonRunner$$anon.read(PythonRDD.scala:166)
at org.apache.spark.api.python.PythonRunner$$anon.<init>(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
要在 Yarn 客户端模式下使用 Spark,您需要在 Yarn 启动执行程序的机器上安装任何依赖项。这是完成这项工作的唯一可靠方法。
在 Yarn 集群模式下使用 Spark 是另一回事。您可以使用 spark-submit 分发 python 依赖项。
spark-submit --master yarn-cluster my_script.py --py-files my_dependency.zip
但是,numpy 的情况由于使它如此之快的同一件事而变得复杂:事实上,它在 C 中完成了繁重的工作。由于它的安装方式,您将无法分发numpy 这种方式。
我遇到了类似的问题,但我认为您不需要设置 PYSPARK_PYTHON,而只需在工作计算机(apt-get 或 yum)上安装 numpy。该错误还会告诉您在哪台机器上缺少导入。
numpy 未安装在工作(虚拟)机器上。如果你使用anaconda,在集群模式下部署应用时上传这样的python个依赖是非常方便的。 (所以不需要在每台机器上安装 numpy 或其他模块,它们必须在你的 anaconda 中)。 首先,压缩你的 anaconda 并将 zip 文件放入集群,然后你可以使用以下脚本提交作业。
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 将从 hdfs 路径复制 anaconda.zip 到每个 worker,并使用那个 pthon-env/anaconda/bin/python 来执行任务。
参考 Running PySpark with Virtualenv 可能会提供更多信息。
我遇到了同样的问题。如果您使用 Python3
,请尝试在 pip3 上安装 numpypip3 install numpy
你必须知道你需要在每个 worker 上安装 numpy,甚至 master 本身(取决于你的组件放置)
还要确保在将 umask 强制为 022 (umask 022
) 后从 root 帐户启动 pip install numpy
命令(sudo 不够),以便将权限级联到 Spark(或 Zeppelin)User
为我解决了这个问题(在 mac
上)实际上是这个指南(它还解释了如何 运行 python 通过 Jupyter Notebooks
-
https://medium.com/@yajieli/installing-spark-pyspark-on-mac-and-fix-of-some-common-errors-355a9050f735
简而言之:
(假设您使用 brew install spark
安装了 spark)
- 使用 -
brew info apache-spark
找到 - 将这些行添加到您的
~/.bash_profile
SPARK_PATH
# Spark and Python
######
export SPARK_PATH=/usr/local/Cellar/apache-spark/2.4.1
export PYSPARK_DRIVER_PYTHON="jupyter"
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
#For python 3, You have to add the line below or you will get an error
export PYSPARK_PYTHON=python3
alias snotebook='$SPARK_PATH/bin/pyspark --master local[2]'
######
- 您只需调用以下命令即可打开
Jupyter Notebook
:pyspark
请记住,您不需要设置 Spark Context
,只需调用:
sc = SparkContext.getOrCreate()
我的环境变量 PYSPARK_PYTHON
没有设置,所以我设置了 /etc/environment
文件并添加了 python 环境路径到变量。
PYSPARK_PYTHON=/home/venv/python3
之后就没有这个错误了
需要检查的几件事
- 在具有 sudo 权限的工作节点上安装所需的包,以便所有用户都可以使用它们
- 如果您在工作节点上有多个版本的 python,请确保为 Spark 使用的 python 安装软件包(通常由 PYSPARK_PYTHON 设置)。
- 最后,要传递自定义模块(.py 文件),请在使用 spark-submit 或 pyspark 启动会话时使用 --py-files