如何将JAR捆绑到python包中并使其可供pyspark使用?

如何将JAR捆绑到python包中并使其可供pyspark使用?,python,pyspark,Python,Pyspark,我已经编写了一些Scala代码,它在SparkDataFrames上运行。我希望我公司的数据科学家能够从PySpark(他们主要在Jupyter笔记本中使用)调用它,因此我在其周围编写了一个瘦Python包装器,用于调用Scala代码(通过py4j),该代码已编译成一个JAR(foo.JAR)。我已经将jar和包装器(foo.py)打包到一个Python轮子(foo.whl)中 当轮子安装了pip时,它可以在/path/to/site-packages/foo上找到,JAR位于/path/to/

我已经编写了一些Scala代码,它在Spark
DataFrame
s上运行。我希望我公司的数据科学家能够从PySpark(他们主要在Jupyter笔记本中使用)调用它,因此我在其周围编写了一个瘦Python包装器,用于调用Scala代码(通过py4j),该代码已编译成一个JAR(foo.JAR)。我已经将jar和包装器(
foo.py
)打包到一个Python轮子(foo.whl)中

当轮子安装了
pip
时,它可以在
/path/to/site-packages/foo
上找到,JAR位于
/path/to/site-packages/foo/jars/foo.JAR

在foo.py中,我有以下代码将JAR安装到${SPARK\u HOME}/jars目录中

package\u dir=os.path.dirname(os.path.realpath(\u文件\u))
jar\u file\u path=os.path.join(package\u dir,f“foo/jars/foo.jar”)
tgt=f“{os.environ.get('SPARK_HOME')}/jars/foo.jar”
如果os.path.islink(tgt):
打印(f“删除现有符号链接{tgt}”)
操作系统取消链接(tgt)
symlink(jar\u文件\u路径,tgt)
当我或任何希望使用它的人运行
import foo
时,JAR会被移动到spark期望的正确位置,然后可以从pyspark代码调用它。一切都很好

不幸的是,我们的生产环境受到限制,最终用户(正确地)没有足够的权限允许他们影响文件系统,因此当上面的代码尝试创建符号链接时,它会失败,并出现权限错误

这是可以解决的吗?我想:

  • 让我们的数据科学家能够真正轻松地
    pip安装foo
    ,并让他们能够使用软件包的功能
  • 但是也可以使JAR对spark可用,而无需将其移动到
    ${spark\u HOME}
有人能提出解决办法吗



评论员要求的一些额外信息。我们的Spark集群实际上是GCP DataProc集群(即Google针对hadoop/Spark的托管服务)。数据存储在谷歌的存储桶(GCS——谷歌相当于S3)中,最终用户(在Jupyter中使用pyspark)确实可以访问这些存储桶。

您已经开发了一个带有Python包装器的Spark功能——那么,您为什么要关注“Pythonic做事方式”,而不是“Spark做事方式”,或者可能的话“Jupyter做事的方式”?请提供更多关于您的用户将如何运行PySpark作业、PySpark外壳或Jupyter笔记本的上下文。包括您是否有某种共享存储可供Spark使用(即HDFS或S3等)建议阅读:
Spark提交
关于
--jars
选项的文档(也可用于
pyspark
和Jupyter-kerrnels,也可用于Livy-REST-gateway,在引用本地文件时使用不同的语法和所需的白名单)推荐阅读:ScalaDoc for
SparkContext
关于
addJar
方法——不幸的是,Python API有一个
addPyFile
方法,因此不清楚您是否也可以将其用于JAR,还是必须通过Py4J,这篇文章处理了一个非常类似的问题,但有一个ans的大杂烩让整个主题变得模糊的WER您已经开发了一个Spark功能,带有Python包装器——那么为什么您要关注“Pythonic做事方式”,而不是“Spark做事方式”,或者可能是“Jupyter做事方式”“?请提供有关您的用户将如何运行其PySpark作业、PySpark shell或Jupyter笔记本的更多上下文。包括您是否有某种共享存储可供Spark使用(即HDFS或S3等)建议阅读:
Spark提交
关于
--jars
选项的文档(也可用于
pyspark
和Jupyter-kerrnels,也可用于Livy-REST-gateway,在引用本地文件时使用不同的语法和所需的白名单)推荐阅读:ScalaDoc for
SparkContext
关于
addJar
方法——不幸的是,Python API有一个
addPyFile
方法,因此不清楚您是否也可以将其用于JAR,还是必须通过Py4J,这篇文章处理了一个非常类似的问题,但有一个ans的大杂烩这使整个话题变得很模糊