如果我有一个自定义库(用 Scala 编码,但它在内部通过 JNI 调用 native 库),有什么方法可以将其部署到 Apache Spark 工作节点,以便集群中的其他应用程序使用它?基本上,我想用我的自定义功能扩展 Spark,以便任何作业都可以使用它。
据我了解,spark-submit是用于提交作业的,所以这不是我想要的。
如果我将 native 库打包到 jar 中,Context.addJar()
可以解决问题吗?我必须在运行时将 native 库解压到某个临时目录才能工作 - 它甚至是 Spark 环境中的一个选项吗?
提前致谢。
最佳答案
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
,因此您可以在使用 REPL
时部署自定义 jar
文件和任何外部依赖项.
如果您有一个特别大的 jar
文件,您可以使用 SparkContext.addJar
将其添加到上下文中。然而,维持这种状态很痛苦。为了真正有效地做到这一点,您需要将 JAR 文件部署到 HDFS,并确保 HDFS 在所有节点之间复制它 - 如果 HDFS 仅在一个节点上有 JAR 文件,那么您就回到了开始的地方。然后你对版本控制做了什么?如果您更改 JAR
文件,很可能您需要保留旧文件,以防任何作业针对它进行编码,因此您需要在 HDFS 中拥有多个版本。您是否要重新编译其他作业以使用新版本? --packages
和 --jars
的好处是,所有这些困惑的事情都会为您处理。
但假设您的自定义 JAR 足够大,可以保证这一点,是的,您可以通过 SparkContext.addJar
包含它,但是,就像我说的 - 这不是标准方法。甚至 Spark 的半核扩展(例如 spark-streaming-kafka
)也是通过 --packages
选项提供的。
关于apache-spark - 如何将自定义库部署到 Apache Spark?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36794350/