我正在使用 Jupyter笔记本和Pyspark 以及泊坞窗图片:Jupyter all-spark-notebook
现在我想写一个 pyspark流媒体应用程序,它消耗来自Kafka的消息。在Spark-Kafka Integration guide中,他们描述了如何使用spark-submit部署这样的应用程序(它需要链接外部jar - 解释在 3。部署)。但是因为我使用的是Jupyter笔记本,所以我从未真正运行spark-submit
命令,我认为如果按下执行,它会在后面运行。
在spark-submit
命令中,您可以指定一些参数,其中一个是-jars
,但我不清楚如何从笔记本中设置此参数(或通过环境变量从外部设置? )。我假设我可以通过SparkConf
或SparkContext
对象动态链接此外部jar。有没有人体验如何从笔记本中正确执行链接?
答案 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()