【问题标题】:Can't instantiate Spark Context in iPython无法在 iPython 中实例化 Spark 上下文
【发布时间】:2018-07-17 06:10:40
【问题描述】:

我正在尝试在 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 对象。 我在这里做错了什么?

【问题讨论】:

标签: python python-3.x apache-spark pyspark ipython


【解决方案1】:

好吧,正如我所说的 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_HOMEPYSPARK_PYTHON 应该没问题)。

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

【讨论】:

    【解决方案2】:

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

    某些Spark设置可以通过环境变量进行配置,环境变量从Spark安装目录下的conf/spark-env.sh脚本中读取

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      相关资源
      最近更新 更多