根据Spark docs,有一种方法可以将环境变量传递给生成的执行程序:
spark.executorEnv。[EnvironmentVariableName]将EnvironmentVariableName指定的环境变量添加到Executor进程。用户可以指定其中的多个来设置多个环境变量。
我正在尝试指示我的pyspark应用程序使用特定的python可执行文件(带有numpy等的anaconda环境等),这通常通过更改PYSPARK_PYTHON
中的spark-env.sh
变量来完成。虽然这种方式有效,但每次我想切换virtualenv时,都会向所有群集节点发送新的配置,这看起来像是一个巨大的过度杀伤。
这就是我尝试以下列方式传递PYSPARK_PYTHON的原因:
uu@e1:~$ PYSPARK_DRIVER_PYTHON=ipython pyspark --conf \
spark.executorEnv.PYSPARK_PYTHON="/usr/share/anaconda/bin/python" \
--master spark://e1.local:7077
但它似乎不起作用:
In [1]: sc._conf.getAll()
Out[1]:
[(u'spark.executorEnv.PYSPARK_PYTHON', u'/usr/share/anaconda/bin/python'),
(u'spark.rdd.compress', u'True'),
(u'spark.serializer.objectStreamReset', u'100'),
(u'spark.master', u'spark://e1.local:7077'),
(u'spark.submit.deployMode', u'client'),
(u'spark.app.name', u'PySparkShell')]
In [2]: def dummy(x):
import sys
return sys.executable
...:
In [3]: sc.parallelize(xrange(100),50).map(dummy).take(10)
Out[3]:
['/usr/bin/python2.7',
'/usr/bin/python2.7',
'/usr/bin/python2.7',
'/usr/bin/python2.7',
'/usr/bin/python2.7',
'/usr/bin/python2.7',
'/usr/bin/python2.7',
'/usr/bin/python2.7',
'/usr/bin/python2.7',
'/usr/bin/python2.7']
我的spark-env.sh
没有配置PYSPARK_PYTHON
,所以这只是被调用的默认python。一些额外的信息:它是spark 1.6.0独立模式集群。
我错过了一些重要的事情吗?
答案 0 :(得分:2)
快速查看https://github.com/apache/spark/blob/master/bin/pyspark
我认为他们只是在做出口 你能做到吗
导出PYSPARK_PYTHON =“/ usr / share / anaconda / bin / python”
看它是否适用于所有执行者 然后运行
PYSPARK_DRIVER_PYTHON = ipython pyspark