在 jupyter notebook 中将自定义 jars 添加到 pyspark

Posted

技术标签:

【中文标题】在 jupyter notebook 中将自定义 jars 添加到 pyspark【英文标题】:Adding custom jars to pyspark in jupyter notebook 【发布时间】:2016-06-27 02:10:35 【问题描述】:

我正在使用带有 Pyspark 的 Jupyter notebook 和以下 docker 映像:Jupyter all-spark-notebook

现在我想编写一个 pyspark 流应用程序,它使用来自 Kafka 的消息。在Spark-Kafka Integration guide 中,他们描述了如何使用 spark-submit 部署这样的应用程序(它需要链接一个外部 jar - 解释在 3. Deploying 中)。但由于我使用的是 Jupyter 笔记本,我从未真正运行过 spark-submit 命令,我假设如果我按下执行,它会在后面运行。

spark-submit 命令中,您可以指定一些参数,其中一个是-jars,但我不清楚如何从笔记本设置此参数(或通过环境变量从外部设置?)。我假设我可以通过SparkConfSparkContext 对象动态链接这个外部jar。有没有人了解如何从笔记本正确执行链接?

【问题讨论】:

【参考方案1】:

您可以通过设置相关环境变量,使用 pyspark 命令运行您的 jupyter notebook:

export PYSPARK_DRIVER_PYTHON=jupyter
export IPYTHON=1
export PYSPARK_DRIVER_PYTHON_OPTS="notebook --port=XXX --ip=YYY"

其中 XXX 是您要用于访问笔记本的端口,YYY 是 IP 地址。

现在只需运行 pyspark 并添加 --jars 作为开关,就像触发提交一样

【讨论】:

这很有趣。 Docker 可以使用docker run -e 设置环境变量,但它们也可能在某处被破坏。 all-spark-notebook 的 Dockerfile 使用 env SPARK_OPTS 但我注意到 all-spark-notebook Toree (scala) 正在破坏 --driver-memory 设置以及 --master 并在特定内核中使用 local[2]。 json 文件。例如,请参阅我在 github.com/jupyter/docker-stacks/pull/144 中关于一些手动测试的帖子。【参考方案2】:

我已经设法让它在 jupyter notebook 中工作,该 notebook 从 all-spark 容器中运行。

我在 jupyterhub 中启动一个 python3 笔记本并覆盖 PYSPARK_SUBMIT_ARGS 标志,如下所示。 Kafka消费者库是从maven仓库下载的,放到我的主目录/home/jovyan:

import os
os.environ['PYSPARK_SUBMIT_ARGS'] = 
  '--jars /home/jovyan/spark-streaming-kafka-assembly_2.10-1.6.1.jar pyspark-shell'

import pyspark
from pyspark.streaming.kafka import KafkaUtils
from pyspark.streaming import StreamingContext

sc = pyspark.SparkContext()
ssc = StreamingContext(sc,1)

broker = "<my_broker_ip>"
directKafkaStream = KafkaUtils.createDirectStream(ssc, ["test1"],
                        "metadata.broker.list": broker)
directKafkaStream.pprint()
ssc.start()

注意:不要忘记环境变量中的pyspark-shell!

扩展:如果你想包含来自 spark-packages 的代码,你可以使用 --packages 标志。有关如何在 all-spark-notebook 中执行此操作的示例,请参见 here

【讨论】:

谢谢。只想说broker 的格式应该是:"localhost:9092" 你是否能够在不下载 jar 并使用 --packages 选项(此处提到:spark.apache.org/docs/latest/submitting-applications.html)的情况下做同样的事情? 我很惊讶这实际上对你有用。我必须在容器启动之前在 Dockerfile 中设置 PYSPARK_SUBMIT_ARGS。【参考方案3】:

要使用 spark 处理 jupyter-notebook,您需要在创建 sparkContext 对象之前提供外部 jar 的位置。 pyspark --jars youJar 将创建一个带有外部 jar 位置的 sparkcontext

【讨论】:

【参考方案4】:

确实,有一种方法可以在创建 SparkSession 时通过 SparkConf 对象动态链接它,如this answer 中所述:

spark = SparkSession \
    .builder \
    .appName("My App") \
    .config("spark.jars", "/path/to/jar.jar,/path/to/another/jar.jar") \
    .getOrCreate()

【讨论】:

【参考方案5】:

如果有人和我一样:我尝试了上述所有解决方案,但没有一个适合我。我想做的是在 Jupyter 笔记本中使用Delta Lake。

最后我可以通过先调用SparkContext.addPyFile("/path/to/your/jar.jar") 来使用from delta.tables import *。虽然在 spark 官方文档中只提到了添加 .zip.py 文件,但我尝试了 .jar 并且效果很好。

【讨论】:

gist.github.com/joshuacook/fbda6fdbec7dc6b0fb9bd7ed9953004a

以上是关于在 jupyter notebook 中将自定义 jars 添加到 pyspark的主要内容,如果未能解决你的问题,请参考以下文章

自定义Jupyter Notebook工作目录

Windows下的Jupyter Notebook 安装与自定义启动

在 Docker 容器中将 Spyder 连接到远程 Jupyter Notebook

如何在 jupyter notebook 中将 spark 数据帧写入 avro 文件格式?

在 jupyter notebook 中将代码单元更改为 markdown 单元的快捷键

如何在 Windows 10 中将 Jupyter Notebook 的默认浏览器更改为 Microsoft Edge?