配置 Spark 以使用 Jupyter Notebook 和 Anaconda

新手上路,请多包涵

我已经花了几天时间尝试让 Spark 与我的 Jupyter Notebook 和 Anaconda 一起工作。这是我的 .bash_profile 的样子:

 PATH="/my/path/to/anaconda3/bin:$PATH"

export JAVA_HOME="/my/path/to/jdk"
export PYTHON_PATH="/my/path/to/anaconda3/bin/python"
export PYSPARK_PYTHON="/my/path/to/anaconda3/bin/python"

export PATH=$PATH:/my/path/to/spark-2.1.0-bin-hadoop2.7/bin
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook" pyspark
export SPARK_HOME=/my/path/to/spark-2.1.0-bin-hadoop2.7
alias pyspark="pyspark --conf spark.local.dir=/home/puifais --num-executors 30 --driver-memory 128g --executor-memory 6g --packages com.databricks:spark-csv_2.11:1.5.0"

当我键入 /my/path/to/spark-2.1.0-bin-hadoop2.7/bin/spark-shell 时,我可以在命令行 shell 中正常启动 Spark。并且输出 sc 不为空。它似乎工作正常。

当我键入 pyspark 时,它会正常启动我的 Jupyter Notebook。当我创建一个新的 Python3 notebook 时,出现这个错误:

 [IPKernelApp] WARNING | Unknown error in handling PYTHONSTARTUP file /my/path/to/spark-2.1.0-bin-hadoop2.7/python/pyspark/shell.py:

并且 sc 在我的 Jupyter Notebook 中是空的。

任何人都可以帮助解决这种情况吗?


只是想澄清一下:错误末尾的冒号后没有任何内容。我还尝试使用这篇 文章 创建我自己的启动文件,我在这里引用,所以你不必去那里看:

我创建了一个简短的初始化脚本 init_spark.py,如下所示:

>  from pyspark import SparkConf, SparkContext
> conf = SparkConf().setMaster("yarn-client")
> sc = SparkContext(conf = conf)
>
> ```
>
> 并将其放在 ~/.ipython/profile_default/startup/ 目录中

当我这样做时,错误变成了:

[IPKernelApp] WARNING | Unknown error in handling PYTHONSTARTUP file /my/path/to/spark-2.1.0-bin-hadoop2.7/python/pyspark/shell.py: [IPKernelApp] WARNING | Unknown error in handling startup files:

”`

原文由 puifais 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 788
2 个回答

Conda 可以帮助正确管理很多依赖关系……

安装火花。假设 spark 安装在 /opt/spark 中,将其包含在您的 ~/.bashrc 中:

 export SPARK_HOME=/opt/spark
export PATH=$SPARK_HOME/bin:$PATH

创建一个 conda 环境,其中包含除 spark 之外的所有必需依赖项:

 conda create -n findspark-jupyter-openjdk8-py3 -c conda-forge python=3.5 jupyter=1.0 notebook=5.0 openjdk=8.0.144 findspark=1.1.0

激活环境

$ source activate findspark-jupyter-openjdk8-py3

启动 Jupyter Notebook 服务器:

 $ jupyter notebook

在您的浏览器中,创建一个新的 Python3 笔记本

尝试使用 以下 脚本计算圆周率(从中借用)

 import findspark
findspark.init()
import pyspark
import random
sc = pyspark.SparkContext(appName="Pi")
num_samples = 100000000
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)
sc.stop()

原文由 Alain Domissy 发布,翻译遵循 CC BY-SA 3.0 许可协议

好吧,看到蹩脚的技巧,比如设置 PYSPARK_DRIVER_PYTHON=jupyter ,已经被提升为“解决方案”并且现在趋向于成为标准做法,这真的让我很痛苦,尽管事实上它们显然会导致 丑陋 的结果,比如输入 pyspark 并以 Jupyter notebook 而不是 PySpark shell 结束,加上下游潜伏的尚未发现的问题,例如当您 尝试使用 spark-submit 与上述设置… :(

(不要误会我的意思,这不是你的错,我不是在责怪你;我已经在 SO 上看到了很多帖子,其中已经提出、接受和赞成这个“解决方案”……)。

在撰写本文时(2017 年 12 月),只有一种正确的方法可以自定义 Jupyter notebook 以便与其他语言(此处为 PySpark)一起使用,这就是使用 Jupyter 内核

要做的第一件事是运行 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 内核(– 用于 Spark 的 ir S 内核)分别是 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"
 }
}

我没有费心将我的详细信息更改为 /my/path/to 等,您已经可以看到我们的案例之间存在一些差异(我使用 Intel Python 2.7,而不是 Anaconda Python 3),但希望您能明白这个想法(顺便说一句,别担心 connection_file - 我也不用)。

现在,最简单的方法是手动对上面显示的内核进行必要的更改(仅限路径),并将其保存在 .../jupyter/kernels 目录的新子文件夹中(这样,如果你再次运行 jupyter kernelspec list 命令)。如果您认为这种方法也是一种 hack,那么我同意您的看法,但这是 Jupyter 文档(第 12 页)中推荐的方法:

然而,没有一个很好的方法来修改内核规范。一种方法使用 jupyter kernelspec list 找到 kernel.json 文件,然后手动修改它,例如 kernels/python3/kernel.json

如果您还没有 .../jupyter/kernels 文件夹,您仍然可以使用 jupyter kernelspec install 安装新内核 - 尚未尝试过,但请查看 此 SO answer

最后,不要忘记从 bash 配置文件中删除所有与 PySpark 相关的环境变量(只留下 SPARK_HOME 应该没问题)。并确认,当您键入 pyspark 时,您会发现自己使用的是 PySpark 外壳,而不是 Jupyter 笔记本……

更新(评论后):如果要将命令行参数传递给 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"

原文由 desertnaut 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题