pyspark引起火花-客户端的python版本是否会影响驱动程序python版本?

时间:2019-12-05 08:19:34

标签: python apache-spark pyspark

我将python和pyspark一起使用

出于测试目的,我在docker上运行了一个独立的集群。

使用this代码回购

请注意,在运行该命令时,应先运行此命令,然后才能登录该命令

docker network create --gateway 10.5.0.1 --subnet 10.5.0.0/24 spark_master

在使用

时,我会进入worker和master
which python

我得到类似的python版本(3.5)

当我运行最简单的pyspark代码(在容器之外)

from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName('appName').setMaster('spark://0.0.0.0:7077')
sc = SparkContext(conf=conf)
rdd = sc.parallelize([1, 2, 3, 4])
rdd.map(lambda x: x**2).collect()

我不断收到此错误

异常:worker中的Python版本与驱动程序3.7中的Python版本不同,PySpark无法使用其他次要版本运行。请检查环境变量PYSPARK_PYTHON和PYSPARK_DRIVER_PYTHON是否正确设置。

at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.handlePythonException(PythonRunner.scala:452)
at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRunner.scala:588)
at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRunner.scala:571)
at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.hasNext(PythonRunner.scala:406)
at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37)
at scala.collection.Iterator$class.foreach(Iterator.scala:891)
at org.apache.spark.InterruptibleIterator.foreach(InterruptibleIterator.scala:28)
at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:59)
at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:104)
at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:48)
at scala.collection.TraversableOnce$class.to(TraversableOnce.scala:310)
at org.apache.spark.InterruptibleIterator.to(InterruptibleIterator.scala:28)
at scala.collection.TraversableOnce$class.toBuffer(TraversableOnce.scala:302)
at org.apache.spark.InterruptibleIterator.toBuffer(InterruptibleIterator.scala:28)
at scala.collection.TraversableOnce$class.toArray(TraversableOnce.scala:289)
at org.apache.spark.InterruptibleIterator.toArray(InterruptibleIterator.scala:28)
at org.apache.spark.rdd.RDD$$anonfun$collect$1$$anonfun$13.apply(RDD.scala:945)
at org.apache.spark.rdd.RDD$$anonfun$collect$1$$anonfun$13.apply(RDD.scala:945)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2101)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2101)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
at org.apache.spark.scheduler.Task.run(Task.scala:121)
at org.apache.spark.executor.Executor$TaskRunner$$anonfun$10.apply(Executor.scala:408)
at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:414)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

19/12/05 08:14:29 INFO CoarseGrainedExecutor后端:已分配任务7 19/12/05 08:14:29 INFO执行程序:在阶段0.0中运行任务1.3(TID 7) 19/12/05 08:14:29信息执行者:执行者试图杀死阶段1.3(TID 7)中的任务1.3,原因:阶段已取消 19/12/05 08:14:29信息执行者:执行者在阶段0.0(TID 7)中杀死了任务1.3,原因:阶段已取消 19/12/05 08:14:29 INFO CoarseGrainedExecutor后端:驱动程序命令关闭 19/12/05 08:14:29信息MemoryStore:MemoryStore已清除 19/12/05 08:14:29 INFO BlockManager:BlockManager Stoppe

我的客户的python版本是3.7,但我尝试使用python 3.5设置新的conda,但仍然遇到相同的错误。

我在线阅读here,我应该将驱动程序和worker python设置为相同,但是它们似乎相同。我想念什么?我应该在客户端上设置它吗?据我所知,客户端只为驱动程序提供服务,它不会影响驱动程序的python版本,如果是evan,我尝试使用python 3.5却没有运气...

edit:尝试使用os.environ设置env变量: 我试图将其添加到我的python代码中

os.environ["PYSPARK_PYTHON"] = "/usr/bin/python3.5"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/usr/bin/python3.5"
os.environ["PYSPARK_WORKER_PYTHON"] = "/usr/bin/python3.5"

仍然出现相同的错误。 似乎当我尝试添加缺少的路径时,它确实引发了另一个错误

  

没有这样的文件或目录

我认为这意味着该代码确实可以在集群中运行,但似乎并不影响实际问题。

1 个答案:

答案 0 :(得分:0)

最后,问题出在客户端的python版本,将其更改为驱动程序的相同(3.5)版本,工作人员解决了该问题。

我不明白为什么,就我所知,客户端的版本不应以任何方式与驱动程序冲突。

使用pyspark运行以python编写的用户函数的可能原因。