Apache spark 如何将自定义库部署到ApacheSpark?
如果我有一个自定义库(用Scala编码,但它通过JNI在内部调用本机库),那么如何将其部署到ApacheSpark worker节点,以便集群中的其他应用程序可以使用它?基本上,我想用我的自定义功能扩展Spark,以便任何作业都可以使用它 据我所知,spark submit是用来提交作业的,所以这不是我想要的 如果我将本机库打包到一个jar中,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
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中的本机代码会是一个问题吗?安全等等?