如果我有一个自定义库(用Scala编写,但它在内部通过JNI调用本机库),有什么方法可以将它部署到Apache Spark工作节点,以便集群中的其他应用程序可以使用它?基本上,我想用我的自定义功能扩展Spark,以便任何作业都可以使用它。
据我了解,spark-submit用于提交工作,这不是我想要的。
如果我将本机库打包在一个jar中,那么Context.addJar()
是否可以解决问题?我必须在运行时将本机库解压缩到一些临时目录才能工作 - 它甚至是Spark环境中的一个选项吗?
提前致谢。
答案 0 :(得分:3)
spark-submit
需要一些感兴趣的参数。 --packages
和--jars
。您可以将自定义.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
这些也适用于spark-shell
,因此您可以在使用jar
时部署自定义REPL
文件和任何外部依赖项。
如果您有一个特别大的jar
文件,则可以使用SparkContext.addJar
将其添加到上下文中。但是,这是一个难以维持的问题。要真正有效地执行此操作,您需要将JAR文件部署到HDFS,并确保HDFS在所有节点之间复制它 - 如果HDFS在一个节点上只有JAR文件,那么您就可以回到起始位置了。然后你如何处理版本控制?如果您更改JAR
文件,则很可能需要保留旧文件,以防任何作业被编码,因此您需要在HDFS中拥有多个版本。您是否打算重新编译其他作业以使用新版本?关于--packages
和--jars
的好处是,所有这些的混乱都是为你处理的。
但假设您的自定义JAR足够大,可以保证,是的,您可以通过SparkContext.addJar
包含它,但是,就像我说的那样 - 这不是标准的方法。甚至Spark的半核心扩展(例如spark-streaming-kafka
)也通过--packages
选项提供。