Apache spark 运行时的sbt交换机依赖项
我正在开发一个使用xgboost4j的spark应用程序。 由于jar的本地C依赖性,这个包需要编译到本地架构。但是集群的体系结构与开发笔记本电脑不同。当通过集群中的一个组件运行sbt assembly时,如何替换包?或者您是否建议通过%“提供”来解决此问题?对(提供/编译)libs使用后缀,如下所示:Apache spark 运行时的sbt交换机依赖项,apache-spark,sbt,sbt-assembly,Apache Spark,Sbt,Sbt Assembly,我正在开发一个使用xgboost4j的spark应用程序。 由于jar的本地C依赖性,这个包需要编译到本地架构。但是集群的体系结构与开发笔记本电脑不同。当通过集群中的一个组件运行sbt assembly时,如何替换包?或者您是否建议通过%“提供”来解决此问题?对(提供/编译)libs使用后缀,如下所示: val suffix = Option(System getProperty "provided").isDefined match { case true => "provi
val suffix = Option(System getProperty "provided").isDefined match {
case true => "provided"
case false => "compile"
}
libraryDependencies += "org.apache.spark" %% "spark-sql" % Spark.version % suffix
并运行
sbt-Dprovided assembly
如果您需要uberjar中的所有JAR您可以为来自目标环境和开发环境的工件提供不同的分类器或工件ID吗?如果是,那么您可以使用系统属性在工件之间切换(正如在其他问题中提到的-我不想在确认之前发布答案;)。您是指阶段吗?我认为这应该是可能的。但这会在本地架构中编译吗?编译是否在运行中执行?@GeorgHeiler它将使用以前编译的依赖项。这就是我的问题——如果您可以在项目构建之前提供两个不同的JAR,那么这个答案是正确的(我以前建议过,但FaigB是第一个,所以我不会发布重复的)。如果您必须动态编译模块(在编译应用程序期间),我认为这个答案是不正确的,因此我应该使用名称xgboost local构建xgboost4j jar一次本地,为cluster xgboost cluster构建一次?两个选项:您可以按照编写的方式进行,也可以使用相同的工件ID进行构建,但在生产中,您将使用提供的依赖项,通过--jar选项添加到Spark Submit中。本地存储库中的版本将用于开发人员机器,但集群上的jar将只针对集群进行编译,而不包括在应用程序的uber jar中。两种选择都可以。只有在每次构建模块时都要编译xgboost时,问题才会出现