apache-spark - 如何将自定义库部署到 Apache Spark?

标签 apache-spark java-native-interface

如果我有一个自定义库(用 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/

相关文章:

c++ - Android JNI bridge Toast C++ 不工作——如何解决?

java - JNI 代码中的内存泄漏

apache-spark - 缓慢加入pyspark,尝试重新分区

apache-spark - kmean如何计算不同分区的数据?

apache-spark - 为什么spark在sql查询的末尾追加 'WHERE 1=0'

android - 完全使用 native 代码(无 JNI)从后台线程更新 UI?

scala - 无法通过 Jupyter 导入 sqlContext.implicits._ 而不会出现错误

apache-spark - spark-submit --file hdfs://file被缓存在驱动程序的/tmp中

java - JNI - 如何填充从 C++ 传递到 Java 的字符串

java - 使用捆绑资源创建 JavaVM