我们正在运行一个连接到hdfs的jupyter笔记本&火花集群。有些用户需要为一个用例使用jar库,而我们不想为所有笔记本部署这个用例。因此,我们不想将此依赖项添加到解决方案的全局部署中。
我们正在寻找一种方法,让spark从hdfs加载jar库,这是由我们集群的所有节点和边缘节点访问。我们尝试使用addJar将它加载到需要它的笔记本中,但没有效果。我们尝试:
spark = SparkSession.builder
.config("spark.jars", "hdfs:///some/path/the-lib_2.11-0.13.7.jar")
.appName('test jar imports - .config(spark.jars)')
.getOrCreate()
和
spark.sparkContext._jsc.addJar("hdfs:///some/path/the-lib_2.11-0.13.7.jar")
# note that print(spark.sparkContext._jsc.sc().listJars()) does contain the above path
我的直觉是addJar不与hdfs工作,但我不知道真的
=比;我的问题:是否有一种方法可以从hdfs加载jar库到python spark笔记本程序(这不是一个hack,见下文)?
我们还发现了一个可以工作的hack,通过更改spark-submit参数。但是我们并不满意它,因为它的工作要归功于对预期的当前参数的替换:
os.environ['PYSPARK_SUBMIT_ARGS'] = os.environ['PYSPARK_SUBMIT_ARGS'].replace(', pyspark-shell',',hdfs:/some/path/the-lib_2.11-0.13.7.jar pyspark-shell')
spark = SparkSession.builder
.appName('test jar imports os.environ --jars')
.getOrCreate()
您试过:
hdfs_path = "hdfs:///some/path/the-lib_2.11-0.13.7.jar"
sc = spark.sparkContext
sc.addFile(hdfs_path)
可以使用SparkContext对象的addFile方法向Spark的分布式缓存中添加文件。
那么它将在所有工作节点上可用。
from pyspark import SparkConf, SparkContext
conf = SparkConf().setAppName("myapp").set("spark.jars", hdfs_path)
sc = SparkContext(conf=conf)