Apache spark 如何将自定义库部署到ApacheSpark?

Apache spark 如何将自定义库部署到ApacheSpark?,apache-spark,java-native-interface,Apache Spark,Java Native Interface,如果我有一个自定义库(用Scala编码,但它通过JNI在内部调用本机库),那么如何将其部署到ApacheSpark worker节点,以便集群中的其他应用程序可以使用它?基本上,我想用我的自定义功能扩展Spark,以便任何作业都可以使用它 据我所知,spark submit是用来提交作业的,所以这不是我想要的 如果我将本机库打包到一个jar中,Context.addJar()会起作用吗?我必须在运行时将本机库解包到某个临时目录中,这样才能工作——这在Spark环境中是一个选项吗 提前感谢。spa

如果我有一个自定义库(用Scala编码,但它通过JNI在内部调用本机库),那么如何将其部署到ApacheSpark worker节点,以便集群中的其他应用程序可以使用它?基本上,我想用我的自定义功能扩展Spark,以便任何作业都可以使用它

据我所知,spark submit是用来提交作业的,所以这不是我想要的

如果我将本机库打包到一个jar中,
Context.addJar()
会起作用吗?我必须在运行时将本机库解包到某个临时目录中,这样才能工作——这在Spark环境中是一个选项吗


提前感谢。

spark submit
采用了一些感兴趣的参数<代码>--包和
--罐
。您可以将自定义的
.jar
添加到
--jars
中。您可以将maven坐标传递给
--packages
。比如:

spark-submit ... --packages org.apache.spark:spark-streaming-kafka_2.10:1.6.0,org.apache.kafka:kafka_2.10:0.8.2.0 --jars localpath/to/your.jar
它们也在
sparkshell
中工作,因此当您使用
REPL
时,可以部署自定义
jar
文件和任何外部依赖项

如果您有一个特别大的
jar
文件,可以使用
SparkContext.addJar
将其添加到上下文中。然而,这是一个痛苦的维持。要真正有效地执行此操作,您需要将JAR文件部署到HDFS,并确保HDFS在所有节点之间复制它——如果HDFS只有一个节点上有JAR文件,那么您就回到了开始的位置。那么你对版本控制做了什么?如果您更改
JAR
文件,很可能需要保留旧文件,以防任何作业都是针对它进行编码的,因此您需要在HDFS中有多个版本。是否要重新编译其他作业以使用新版本?
--packages
--jars
的好处在于,所有这些乱七八糟的东西都可以为您处理


但是,假设您的自定义JAR足够大,可以通过
SparkContext.addJar
将其包括在内,但是,正如我所说,这不是标准的方法。甚至Spark的半核心扩展,如
Spark streaming kafka
,也通过
--packages
选项提供。

当您说“一些调用本机库的Scala代码”时,您的意思是代码在Spark作业中运行吗?该代码应该可以从Spark作业中调用。我将对问题进行编辑以澄清。您想利用Spark工作中的外部库吗?你有没有考虑过把它放进你工作的uber罐子里?这不是我的工作。我想用我的自定义功能扩展Spark,以便任何作业都可以使用它。这会实际部署我的库,以便其他作业可以使用它吗?我不是在尝试运行我自己的作业,而是扩展Spark,以便所有作业都可以调用我的库。其他作业需要使用此答案中的命令。这就是让他们部署自定义代码的方式——你给他们jar,让他们像上面那样运行命令(使用
--jars
),或者你创建
maven
工件并给他们坐标。如果您在我的示例中查看,
spark streaming kafka
是spark的扩展。您正试图做它正在做的事情--扩展Spark--这是标准的方法。但是,jar不会在每个新作业中都被复制吗?理想情况下,我会将它“安装”到每个工作节点上,并准备好供其他作业使用。我的意思是,你所说的库有多大?它是千兆字节、兆字节还是几百K?它是几百MB。谢谢你的回答!在Spark中调用打包在jar中的本机代码会是一个问题吗?安全等等?