在 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
,但我不清楚如何从笔记本设置此参数(或通过环境变量从外部设置?)。我假设我可以通过SparkConf
或SparkContext
对象动态链接这个外部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的主要内容,如果未能解决你的问题,请参考以下文章
Windows下的Jupyter Notebook 安装与自定义启动
在 Docker 容器中将 Spyder 连接到远程 Jupyter Notebook
如何在 jupyter notebook 中将 spark 数据帧写入 avro 文件格式?
在 jupyter notebook 中将代码单元更改为 markdown 单元的快捷键
如何在 Windows 10 中将 Jupyter Notebook 的默认浏览器更改为 Microsoft Edge?