在jupyter笔记本中添加自定义jar到pyspark

时间:2016-03-11 17:58:56

标签: python-3.x apache-kafka pyspark spark-streaming jupyter-notebook

我正在使用 Jupyter笔记本和Pyspark 以及泊坞窗图片Jupyter all-spark-notebook

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

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

5 个答案:

答案 0 :(得分:11)

我已经设法让它从jupyter笔记本中运行,该笔记本正在运行整个火花容器。

我在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

答案 1 :(得分:1)

您可以使用pyspark命令运行jupyter笔记本,方法是设置相关的环境变量:

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

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

现在只需运行pyspark并添加--jars作为开关,就像启动提交

一样

答案 2 :(得分:1)

万一有人和我一样:我尝试了上述所有解决方案,但没有一个对我有用。我正在尝试在Jupyter笔记本中使用Delta Lake

最后,我可以通过先致电from delta.tables import *来使用SparkContext.addPyFile("/path/to/your/jar.jar")。尽管在Spark官方文档中,它仅提及添加.zip.py文件,但是我尝试了.jar,它运行良好。

答案 3 :(得分:0)

要使用spark处理jupyter-notebook,您需要在创建sparkContext对象之前指定外部jar的位置。 pyspark --jarsJar 会创建一个带有外部罐子位置的sparkcontext

答案 4 :(得分:0)

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

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