如何将自定义库部署到 Apache Spark?
How to deploy custom libraries to Apache Spark?
如果我有一个自定义库(用 Scala 编码,但它在内部通过 JNI 调用本机库),有什么方法可以将它部署到 Apache Spark 工作节点,以便集群中的其他应用程序可以使用它?基本上,我想用我的自定义功能扩展 Spark,以便任何作业都可以使用它。
据我了解,spark-submit是为了提交作业,所以这不是我想要的。
如果我将本机库打包到一个 jar 中,Context.addJar()
会成功吗?我必须在运行时将本机库解压缩到某个临时目录才能工作——它甚至是 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
选项提供的。
如果我有一个自定义库(用 Scala 编码,但它在内部通过 JNI 调用本机库),有什么方法可以将它部署到 Apache Spark 工作节点,以便集群中的其他应用程序可以使用它?基本上,我想用我的自定义功能扩展 Spark,以便任何作业都可以使用它。
据我了解,spark-submit是为了提交作业,所以这不是我想要的。
如果我将本机库打包到一个 jar 中,Context.addJar()
会成功吗?我必须在运行时将本机库解压缩到某个临时目录才能工作——它甚至是 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
选项提供的。