Spark 异常:worker 中的 Python 版本 3.4 与驱动程序 3.5 中的版本不同
Posted
技术标签:
【中文标题】Spark 异常:worker 中的 Python 版本 3.4 与驱动程序 3.5 中的版本不同【英文标题】:Spark Exception: Python in worker has different version 3.4 than that in driver 3.5 【发布时间】:2016-08-13 19:16:54 【问题描述】:我使用的是 Amazon EC2,我的主服务器和开发服务器合二为一。我还有一个单个工人的实例。
我是新手,但我设法让 spark 在独立模式下工作。现在我正在尝试集群。 master 和 worker 处于活动状态(我可以看到它们的 webUI 并且它们正在运行)。
我有 Spark 2.0,并安装了 Python 3.5.2 附带的最新 Anaconda 4.1.1。在worker和master中,如果我去pyspark并执行os.version_info,我将得到3.5.2,我还正确设置了所有环境变量(如***和google的其他帖子中所见)(例如,PYSPARK_PYTHON) .
反正没有 3.4 版本的 python。所以我想知道如何解决这个问题。
我通过运行以下命令得到错误:
rdd = sc.parallelize([1,2,3])
rdd.count()
count() 方法发生错误:
16/08/13 18:44:31 ERROR Executor: Exception in task 1.0 in stage 2.0 (TID 17)
org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File "/opt/spark/python/lib/pyspark.zip/pyspark/worker.py", line 123, in main
("%d.%d" % sys.version_info[:2], version))
Exception: Python in worker has different version 3.4 than that in driver 3.5, PySpark cannot run with different minor versions
at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:193)
at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:234)
at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:152)
at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:63)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:283)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:70)
at org.apache.spark.scheduler.Task.run(Task.scala:85)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
16/08/13 18:44:31 ERROR Executor: Exception in task 1.1 in stage 2.0 (TID 18)
org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File "/opt/spark/python/lib/pyspark.zip/pyspark/worker.py", line 123, in main
("%d.%d" % sys.version_info[:2], version))
Exception: Python in worker has different version 3.4 than that in driver 3.5, PySpark cannot run with different minor versions
at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:193)
at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:234)
at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:152)
at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:63)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:283)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:70)
at org.apache.spark.scheduler.Task.run(Task.scala:85)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
【问题讨论】:
【参考方案1】:由于您已经使用 Anaconda,您可以简单地使用所需的 Python 版本创建一个环境:
conda create --name foo python=3.4
source activate foo
python --version
## Python 3.4.5 :: Continuum Analytics, Inc
并将其用作PYSPARK_DRIVER_PYTHON
:
export PYSPARK_DRIVER_PYTHON=/path/to/anaconda/envs/foo/bin/python
【讨论】:
没用。我在驱动程序和主机上都这样做了,我可以在我的 ssh 窗口的每一行的开头看到 (foo),所以它正在做它应该做的事情。但错误仍然保持不变。 它现在通过做一些不同的事情来工作。我使用您的建议在 master 和 worker 上使用 python 3.5 创建了一个 foo 环境。这并没有解决问题。但是,现在,我只在 master 上创建了一个 3.4 的环境(因为它似乎认为 slave 是 3.4),并且一切都很好。所以如果没有办法让worker被识别为3.5,我会把这个问题作为解决方案。【参考方案2】:我也遇到了同样的问题。有几个可能的原因:
你的一个工人有 python3.4,但你没有注意到它。请到每个工人那里检查PYSPARK_PYTHON
。也就是如果你设置了PYSPARK_PYTHON=python3
,去每个worker里输入python3
,查看版本。
您连接到错误的工作人员。检查您的 SparkContext
配置并确定您的工人是什么。
我花了十多个小时才找到与您相同的问题。但对我来说根本原因是错误的连接.... TAT
【讨论】:
以上是关于Spark 异常:worker 中的 Python 版本 3.4 与驱动程序 3.5 中的版本不同的主要内容,如果未能解决你的问题,请参考以下文章
Spark master 会自动将其他库复制到 worker 中吗?
Spark 中的任务是啥? Spark worker 是如何执行 jar 文件的?
Pyspark 和使用 UDF:如何将 Python 参数(sys.argv、argparse)传递给 Python Worker?