无法在 iPython 中实例化 Spark 上下文

Can't instantiate Spark Context in iPython

我正在尝试在 mac 上本地设置一个独立的 spark 实例并使用 Python 3 API。为此,我做了以下工作, 1. 我已经下载并安装了 Scala 和 Spark。 2. 我设置了以下环境变量,

#Scala
export SCALA_HOME=$HOME/scala/scala-2.12.4
export PATH=$PATH:$SCALA_HOME/bin

#Spark
export SPARK_HOME=$HOME/spark/spark-2.2.1-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin

#Jupyter Python
export PYSPARK_PYTHON=python3
export PYSPARK_DRIVER_PYTHON=ipython3
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"

#Python
alias python="python3"
alias pip="pip3"

export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.4-src.zip:$PYTHONPATH

现在当我 运行 命令

pyspark --master local[2]

然后在笔记本上输入 sc,我得到以下信息,

SparkContext

Spark UI

Version
v2.2.1
Master
local[2]
AppName
PySparkShell

很明显我的 SparkContext 没有初始化。我期待看到一个初始化的 SparkContext 对象。 我在这里做错了什么?

Documentation 接缝说环境变量是从某个文件中读取的,而不是 shell 环境变量。

Certain Spark settings can be configured through environment variables, which are read from the conf/spark-env.sh script in the directory where Spark is installed

好吧,正如我所说 , setting PYSPARK_DRIVER_PYTHON to jupyter (or ipython) is a really bad and plain wrong practice, which can lead to unforeseen outcomes downstream, such as when you try to use spark-submit with the above settings...

只有一种正确的方法可以自定义 Jupyter notebook 以便与其他语言(此处为 PySpark)一起使用,这就是使用 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 一起提供的 "default" 内核(很有可能它是您系统中唯一存在的内核);至于其余的,我还有 2 个 Python 内核(caffetensorflow),一个 R 内核(ir),以及两个用于 Spark 1.6 和分别为 Spark 2.0.

上面列表的条目是目录,每个目录包含一个文件,名为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 页)中推荐的方法:

However, there isn’t a great way to modify the kernelspecs. One approach uses jupyter kernelspec list to find the kernel.json file and then modifies it, e.g. kernels/python3/kernel.json, by hand.

如果您还没有 .../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-related 环境变量(只保留 SPARK_HOMEPYSPARK_PYTHON 应该没问题)。

另一种可能是使用Apache Toree,但我自己还没有尝试过。