使用 MLlib 时出现 NumPy 异常,即使安装了 Numpy
NumPy exception when using MLlib even though Numpy is installed
这是我要执行的代码:
from pyspark.mllib.recommendation import ALS
iterations=5
lambdaALS=0.1
seed=5L
rank=8
model=ALS.train(trainingRDD,rank,iterations, lambda_=lambdaALS, seed=seed)
当我运行依赖于numpy的model=ALS.train(trainingRDD,rank,iterations, lambda_=lambdaALS, seed=seed)
命令时,Spark使用的Py4Java库抛出以下消息:
Py4JJavaError: An error occurred while calling o587.trainALSModel.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 67.0 failed 4 times, most recent failure: Lost task 0.3 in stage 67.0 (TID 195, 192.168.161.55): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File "/home/platform/spark/python/lib/pyspark.zip/pyspark/worker.py", line 98, in main
command = pickleSer._read_with_length(infile)
File "/home/platform/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 164, in _read_with_length
return self.loads(obj)
File "/home/platform/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 421, in loads
return pickle.loads(obj)
File "/home/platform/spark/python/lib/pyspark.zip/pyspark/mllib/__init__.py", line 27, in <module>
Exception: MLlib requires NumPy 1.4+
NumPy 1.10 已安装在错误消息中所述的计算机上。
此外,在我的 Jupyter notebook 中直接执行以下命令时,我得到了 1.9.2 版:
import numpy
numpy.version.version
我显然 运行正在使用早于 1.4 的 NumPy 版本,但我不知道在哪里。我如何知道我需要在哪台机器上更新我的 NumPy 版本?
您似乎安装了两个版本的 numpy,而 pyspark 正在导入旧版本。要确认这一点,您可以执行以下操作:
import numpy
print numpy.__version__
print numpy.__path__
这可能会给您 1.9.2 及其路径。现在这样做:
import pyspark
print pyspark.numpy.__version__
print pyspark.numpy.__path__
它是否从另一个路径加载了不同的 numpy?如果是,删除它很可能会解决问题。
这是 Mllib 初始化代码中的错误
import numpy
if numpy.version.version < '1.4':
raise Exception("MLlib requires NumPy 1.4+")
“1.10”小于“1.4”
你可以使用 NumPy 1.9.2 .
如果您必须使用 NumPy 1.10 并且不想升级到 spark 1.5.1。
对代码进行手动更新。
https://github.com/apache/spark/blob/master/python/pyspark/mllib/init.py
这是我要执行的代码:
from pyspark.mllib.recommendation import ALS
iterations=5
lambdaALS=0.1
seed=5L
rank=8
model=ALS.train(trainingRDD,rank,iterations, lambda_=lambdaALS, seed=seed)
当我运行依赖于numpy的model=ALS.train(trainingRDD,rank,iterations, lambda_=lambdaALS, seed=seed)
命令时,Spark使用的Py4Java库抛出以下消息:
Py4JJavaError: An error occurred while calling o587.trainALSModel.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 67.0 failed 4 times, most recent failure: Lost task 0.3 in stage 67.0 (TID 195, 192.168.161.55): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File "/home/platform/spark/python/lib/pyspark.zip/pyspark/worker.py", line 98, in main
command = pickleSer._read_with_length(infile)
File "/home/platform/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 164, in _read_with_length
return self.loads(obj)
File "/home/platform/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 421, in loads
return pickle.loads(obj)
File "/home/platform/spark/python/lib/pyspark.zip/pyspark/mllib/__init__.py", line 27, in <module>
Exception: MLlib requires NumPy 1.4+
NumPy 1.10 已安装在错误消息中所述的计算机上。
此外,在我的 Jupyter notebook 中直接执行以下命令时,我得到了 1.9.2 版:
import numpy
numpy.version.version
我显然 运行正在使用早于 1.4 的 NumPy 版本,但我不知道在哪里。我如何知道我需要在哪台机器上更新我的 NumPy 版本?
您似乎安装了两个版本的 numpy,而 pyspark 正在导入旧版本。要确认这一点,您可以执行以下操作:
import numpy
print numpy.__version__
print numpy.__path__
这可能会给您 1.9.2 及其路径。现在这样做:
import pyspark
print pyspark.numpy.__version__
print pyspark.numpy.__path__
它是否从另一个路径加载了不同的 numpy?如果是,删除它很可能会解决问题。
这是 Mllib 初始化代码中的错误
import numpy
if numpy.version.version < '1.4':
raise Exception("MLlib requires NumPy 1.4+")
“1.10”小于“1.4” 你可以使用 NumPy 1.9.2 .
如果您必须使用 NumPy 1.10 并且不想升级到 spark 1.5.1。 对代码进行手动更新。 https://github.com/apache/spark/blob/master/python/pyspark/mllib/init.py