好吧,正如我所说的 elsewhere,将 PYSPARK_DRIVER_PYTHON 设置为 jupyter(或 ipython)是一种非常糟糕且明显错误的做法,这可能会导致下游无法预料的结果,比如当你try to use spark-submit with the above settings...
为了使用其他语言(此处为 PySpark),定制 Jupyter notebook 的正确方法只有一种,这就是 Jupyter kernels 的使用。
首先要做的是运行jupyter kernelspec list 命令,以获取您机器中所有可用内核的列表;这是我的情况(Ubuntu)的结果:
$ jupyter kernelspec list
Available kernels:
python2 /usr/lib/python2.7/site-packages/ipykernel/resources
caffe /usr/local/share/jupyter/kernels/caffe
ir /usr/local/share/jupyter/kernels/ir
pyspark /usr/local/share/jupyter/kernels/pyspark
pyspark2 /usr/local/share/jupyter/kernels/pyspark2
tensorflow /usr/local/share/jupyter/kernels/tensorflow
第一个内核 python2 是 IPython 附带的“默认”内核(很有可能这是您系统中唯一存在的内核);至于其余的,我还有 2 个 Python 内核 (caffe & tensorflow)、一个 R 内核 (ir) 和两个分别用于 Spark 1.6 和 Spark 2.0 的 PySpark 内核。
上面列表中的条目是目录,每个条目都包含一个文件,名为kernel.json。让我们看看我的pyspark2内核的这个文件的内容:
{
"display_name": "PySpark (Spark 2.0)",
"language": "python",
"argv": [
"/opt/intel/intelpython27/bin/python2",
"-m",
"ipykernel",
"-f",
"{connection_file}"
],
"env": {
"SPARK_HOME": "/home/ctsats/spark-2.0.0-bin-hadoop2.6",
"PYTHONPATH": "/home/ctsats/spark-2.0.0-bin-hadoop2.6/python:/home/ctsats/spark-2.0.0-bin-hadoop2.6/python/lib/py4j-0.10.1-src.zip",
"PYTHONSTARTUP": "/home/ctsats/spark-2.0.0-bin-hadoop2.6/python/pyspark/shell.py",
"PYSPARK_PYTHON": "/opt/intel/intelpython27/bin/python2"
}
}
现在,对您来说最简单的方法是手动对上面显示的内核进行必要的更改(仅限路径)并将其保存在 .../jupyter/kernels 目录的新子文件夹中(这样,如果您再次运行jupyter kernelspec list 命令)。如果您认为这种方法也是一种 hack,那么我会同意您的看法,但这是 Jupyter documentation(第 12 页)中推荐的方法:
但是,没有很好的方法来修改内核规范。一种方法使用jupyter kernelspec list 查找kernel.json 文件,然后对其进行修改,例如kernels/python3/kernel.json,手工制作。
如果您还没有.../jupyter/kernels 文件夹,您仍然可以使用jupyter kernelspec install 安装新内核 - 尚未尝试过,但请查看this SO answer。
如果你想将命令行参数传递给 PySpark,你应该在env 下添加PYSPARK_SUBMIT_ARGS 设置;例如,这里是我各自的 Spark 1.6.0 内核文件的最后一行,我们仍然必须使用外部 spark-csv 包来读取 CSV 文件:
"PYSPARK_SUBMIT_ARGS": "--master local --packages com.databricks:spark-csv_2.10:1.4.0 pyspark-shell"
最后,不要忘记从 bash 配置文件中删除所有与 PySpark/Jupyter 相关的环境变量(只留下 SPARK_HOME 和 PYSPARK_PYTHON 应该没问题)。
另一种可能是使用Apache Toree,但我自己还没有尝试过。