将 Jupyter 笔记本连接到 Spark

Posted

技术标签:

【中文标题】将 Jupyter 笔记本连接到 Spark【英文标题】:Connecting Jupyter notebook to Spark 【发布时间】:2017-09-24 07:30:20 【问题描述】:

我有一台安装了 Hadoop 和 Spark 的机器。下面是我目前的环境。

python3.6

spark1.5.2

Hadoop 2.7.1.2.3.6.0-3796

我试图通过构建 ipython 内核来连接 jupyter notebook 以连接到 spark。

已写入 2 个新文件。

    /root/.ipython/profile_pyspark/ipython_notebook_config.py

    /root/.ipython/profile_pyspark/startup/00-pyspark-setup.py

    /root/anaconda3/share/jupyter/kernels/pyspark/kernel.json

kernel.json


    "display_name": "PySpark (Spark 2.0.0)",
    "language": "python",
    "argv": [
        "/root/anaconda3/bin/python3",
        "-m",
        "ipykernel",
        "--profile=pyspark"
    ],
    "env": 
        "CAPTURE_STANDARD_OUT": "true",
        "CAPTURE_STANDARD_ERR": "true",
        "SEND_EMPTY_OUTPUT": "false",
        "PYSPARK_PYTHON" : "/root/anaconda3/bin/python3",
        "SPARK_HOME": "/usr/hdp/current/spark-client/"
    

00-pyspark-setup.py

import os
import sys
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["SPARK_HOME"] = "/usr/hdp/current/spark-client"
os.environ["PYLIB"] = os.environ["SPARK_HOME"] + "/python/lib"
spark_home = os.environ.get('SPARK_HOME', None)
sys.path.insert(0, os.environ["PYLIB"] +"/py4j-0.8.2.1-src.zip")
sys.path.insert(0, os.environ["PYLIB"] +"/pyspark.zip")
exec(open(os.path.join(spark_home, 'python/pyspark/shell.py')).read())

ipython_notebook_config.py

c = get_config()
c.NotebookApp.port = 80

然后,当我运行以下内容时

jupyter notebook --profile=pyspark

笔记本运行良好。然后,我将内核更改为“PySpark (Spark 2.0.0)”,并假设使用“sc”火花上下文。但是,当我输入“sc”时,它什么也不显示。

所以,由于 sc 无法初始化,如果我想运行以下命令,它失败了!

nums = sc.parallelize(xrange(1000000))

谁能帮助我如何配置 jupyter notebook 以与 Spark 对话?

【问题讨论】:

这里似乎发生了很多事情。尝试更多地关注您的问题/问题。我建议将您的 Spark 2.0 问题转移到另一个问题。 【参考方案1】:

仅供参考,直到版本 spark 2.1.1 才支持 python 3.6。见 JIRA https://issues.apache.org/jira/browse/SPARK-19019

【讨论】:

【参考方案2】:

您的问题有很多问题...

1) 除了上面 Punskr 的回答之外 - Spark 1.5 only works with Python 2;在 Spark 2.0 中引入了 Python 3 支持。

2) 即使切换到 Python 2 或upgrade Spark,仍然需要导入 Pyspark 的相关模块,并在 notebook 中手动初始化 sc 变量

3) 您似乎也在使用旧版本的 Jupyter,因为配置文件功能在 Jupyter >= 4 中不可用。

要在 Jupyter >=4 中“自动”初始化 sc,请参阅我的回答 here。

【讨论】:

【参考方案3】:

您可以对环境进行一些更改以使用 pyspark 默认 ipython 或 jupyter notebook。

将以下内容放入您的~/.bashrc

export PYSPARK_PYTHON=python3 ## for python3
export PYSPARK_DRIVER_PYTHON=ipython
export PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --port=7000"

见:pyspark on GitHub

接下来,运行source ~/.bashrc

然后,当您启动 pyspark(或使用 YARN)时,它将打开一个服务器供您连接。

在具有 ssh 功能的本地终端上,运行

ssh -N -f -L localhost:8000:localhost:7000 <username>@<host>

如果您使用的是 Windows,我建议您使用 MobaXterm 或 Cygwin。

打开网络浏览器,输入地址localhost:8000 以使用 Spark 进入您的笔记本

现在一些预防措施,我从来没有在 Python 3 上尝试过这个,所以这可能对你有用,也可能不适合你。不管怎样,你真的应该在 Spark 1.5 上使用 Python 2。我的公司也使用 Spark 1.5,因为没有人使用 Python 3。

更新:

根据@desertnaut 的cmets,设置

export PYSPARK_DRIVER_PYTHON=ipython

如果用户需要使用spark-submit,可能会导致问题。如果您想同时使用笔记本和spark-submit,解决方法是创建两个新的环境变量。这是您可以创建的示例

export PYSPARK_PYTHON=python3 ## for python3
export ipyspark='PYSPARK_DRIVER_PYTHON=ipython pyspark'
export pynb='PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --port=7000"'

ipysparkpynb 是 bash 终端上的新命令。

【讨论】:

PYSPARK_DRIVER_PYTHON 设置为ipythonjupyter 是一种非常糟糕 的做法,它会在下游产生严重的问题(例如when trying spark-submit);推荐的方式是create an appropriate Jupyter kernel。 是的,如果您需要使用spark-submit,这是一个常见问题。在我之前的工作中,我们以交互方式使用它,因此我们很少使用spark-submit。但是,解决此问题的方法是创建一个新变量ipyspark = PYSPARK_DRIVER_PYTHON=ipython pyspark。我会将此解释为答案的更新。

以上是关于将 Jupyter 笔记本连接到 Spark的主要内容,如果未能解决你的问题,请参考以下文章

将本地 IPython 笔记本连接到气隙集群上的 Spark

从本地 jupyter notebook 连接到 spark 集群

将 Python 笔记本连接到 MySQL 数据库

无法使用 Jupyter 笔记本上的 pyspark 从 Apache Spark 连接到 MS SQL

将USB串行设备桥接到Cloud Jupyter笔记本电脑

将 IPython notebook 连接到在不同机器上运行的 spark master