Python 如何将PySpark作业从本地Jupyter笔记本运行到Docker容器中的Spark master?

Python 如何将PySpark作业从本地Jupyter笔记本运行到Docker容器中的Spark master?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我有一个Docker容器,它运行ApacheSpark,有一个主从工。我正在尝试从主机上的Jupyter笔记本提交作业。见下文: # Init !pip install findspark import findspark findspark.init() # Context setup from pyspark import SparkConf, SparkContext # Docker container is exposing port 7077 conf = SparkConf()

我有一个Docker容器,它运行ApacheSpark,有一个主从工。我正在尝试从主机上的Jupyter笔记本提交作业。见下文:

# Init
!pip install findspark
import findspark
findspark.init()


# Context setup
from pyspark import SparkConf, SparkContext
# Docker container is exposing port 7077
conf = SparkConf().setAppName('test').setMaster('spark://localhost:7077')
sc = SparkContext(conf=conf)
sc

# Execute step
import random
num_samples = 1000
def inside(p):     
  x, y = random.random(), random.random()
  return x*x + y*y < 1
count = sc.parallelize(range(0, num_samples)).filter(inside).count()
pi = 4 * count / num_samples
print(pi)
在我看来,该命令试图在本地运行Spark作业,而应该将其发送到前面步骤中指定的Spark主机。这不可能通过Jupyter笔记本实现吗


我的容器基于,但我在
/usr/bin/python3.6
下安装了Python 3.6,在创建SparkContext之前,我必须执行以下

import os
# Path on master/worker where Python is installed
os.environ['PYSPARK_PYTHON'] = '/usr/bin/python3.6'
一些研究表明,我需要通过以下方式将其添加到
/usr/local/spark/conf/spark env.sh

export PYSPARK_PYTHON='/usr/bin/python3.6'

但是这不起作用。

粗略查看一下源代码,就会发现PySpark从驱动程序脚本的
PySpark\u Python
环境变量中读取Python解释器的位置,然后将其与每个工作项一起广播给所有执行者。使用
spark submit
时,此变量设置为spark master在其环境中的内容,可通过
spark env.sh
进行配置。当您使用
findspark
时,例如在笔记本中,它使用当前解释器的环境,这就是为什么您需要分配给
os.environ['PYSPARK\u PYTHON']
。对于那些喜欢翻查源代码的人,它正好位于PYSPARK的
SparkContext
类的初始化函数中。
SparkContext.pythonExec
的值附加到发送给执行者的每个工作项,并由执行者用于启动Python-请参阅。
export PYSPARK_PYTHON='/usr/bin/python3.6'