配置 Spark 与 Jupyter Notebook 和 Anaconda 协同工作

2025-03-26 09:09:00
admin
原创
22
摘要:问题描述:我花了几天时间尝试让 Spark 与我的 Jupyter Notebook 和 Anaconda 配合使用。我的 .bash_profile 如下所示:PATH="/my/path/to/anaconda3/bin:$PATH" export JAVA_HOME="/...

问题描述:

我花了几天时间尝试让 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 笔记本时,出现此错误:

[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:

解决方案 1:

好吧,看到像设置这样糟糕的黑客如何PYSPARK_DRIVER_PYTHON=jupyter被提升为“解决方案”并且现在倾向于成为标准做法,这确实让我很痛苦,尽管它们显然会导致糟糕的结果,例如输入pyspark并最终得到一个 Jupyter 笔记本而不是 PySpark shell,以及潜伏在下游的尚未看到的问题,例如当您尝试使用spark-submit上述设置时...... :(

(不要误会我的意思,这不是你的错,我也没有责怪你;我在 SO 上看到过几十篇帖子,其中提出、接受和赞成这个“解决方案”……)。

在撰写本文时(2017 年 12 月),只有一种正确的方法可以定制 Jupyter 笔记本以便与其他语言(此处为 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 内核(ir)和两个 PySpark 内核,分别用于 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"
 }
}

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

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

但是,没有很好的方法来修改 kernelspecs。一种方法是jupyter kernelspec list找到kernel.json文件然后kernels/python3/kernel.json手动修改它。

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

最后,不要忘记从 bash 配置文件中删除所有与 PySpark 相关的环境变量(只保留SPARK_HOME应该就可以了)。并确认,当您键入时pyspark,您会发现自己拥有一个 PySpark shell,而不是 Jupyter 笔记本……

更新(评论后):如果您想将命令行参数传递给 PySpark,您应该PYSPARK_SUBMIT_ARGS在下添加设置env;例如,这是我的 Spark 1.6.0 相应内核文件的最后一行,我们仍然必须使用外部 spark-csv 包来读取 CSV 文件:

"PYSPARK_SUBMIT_ARGS": "--master local --packages com.databricks:spark-csv_2.10:1.4.0 pyspark-shell"

解决方案 2:

Conda 可以帮助正确管理很多依赖项......

安装 spark。假设 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 笔记本

尝试使用以下脚本计算 PI(借用自此处)

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()

解决方案 3:

我刚刚通过 conda 安装了 sparkmagic(重新安装了较新版本的 Spark 之后)。

我认为仅此一点就可以了,而且比手动摆弄配置文件简单得多。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2079  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1459  
  建筑行业正处于数字化转型的关键时期,建筑产品生命周期管理(PLM)系统的实施对于提升项目效率、质量和协同性至关重要。特别是在 2025 年,基于建筑信息模型(BIM)的项目进度优化工具成为众多建筑企业关注的焦点。这些工具不仅能够整合项目全生命周期的数据,还能通过精准的分析和模拟,为项目进度管理提供强大支持。BIM 与建...
plm是什么软件   0  
  PLM系统开发的重要性与现状PLM(产品生命周期管理)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它贯穿产品从概念设计到退役的整个生命周期,整合了产品数据、流程以及人员等多方面的资源,极大地提高了企业的协同效率和创新能力。通过PLM系统,企业能够实现产品信息的集中管理与共享,不同部门之间可以实时获取...
国产plm软件   0  
  PLM(产品生命周期管理)系统在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和技术的飞速发展,企业对PLM系统的迭代周期优化需求日益迫切。2025年敏捷认证对项目管理提出了新的要求,其中燃尽图作为一种强大的可视化工具,在PLM系统迭代周期优化中有着广泛且重要的应用。深入探讨这些应用,对于提升企业的项...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用