装配,包括我的罐子

问题描述 投票:2回答:1

我想构建一个“胖”的代码罐。我理解如何做到这一点,但所有的例子我都使用jar不是本地的想法,我不知道如何在我组装的jar中包含我构建的scala代码使用的另一个JAR。像我必须包含的JAR文件夹一样?

通常,当我使用spark-shell将我当前的代码作为测试运行时,它看起来像这样:

spark-shell --jars magellan_2.11-1.0.6-SNAPSHOT.jar -i st_magellan_abby2.scala 

(jar文件与.scala文件位于同一路径中)

所以现在我想构建一个build.sbt文件,它执行相同的操作并包含SNAPSHOT.jar文件?

name := "PSGApp"
version := "1.0"
scalaVersion := "2.11.8"

resolvers += "Spark Packages Repo" at "http://dl.bintray.com/spark-packages/maven"

//provided means don't included it is there.  already on cluster?

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "2.2.0" % "provided",
    "org.apache.spark" %% "spark-sql" % "2.2.0" % "provided",
    "org.apache.spark" %% "spark-streaming" % "2.2.0" % "provided",
    //add magellan here somehow?

)

那么我在哪里将jar放入SBT项目文件夹结构中,以便在运行sbt程序集时它被拾取?那是在main / resources文件夹中吗?参考手册中说的是'主罐中包含的文件'去哪里了?

我会在这里放入库依赖项,以便它知道添加特定的jar而不是去网上获取它?

最后一件事,我还在我的测试代码中进行了一些导入,现在似乎不会飞,因为我把这个代码放在一个附加了def main的对象中。

我有类似的东西:

导入sqlContext.implicits._这是在上面的代码中正好使用它,如下所示:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

import sqlContext.implicits._
import org.apache.spark.sql.functions.udf

val distance =udf {(a: Point, b: Point) => 
   a.withinCircle(b, .001f);  //current radius set to .0001
}

我不确定我可以将这些导入保留在def main中吗?或者我必须以某种方式将它们移到别处? (我仍在学习scala和争论范围)。

scala apache-spark sbt
1个回答
3
投票

一种方法是使用本地程序集插件(https://github.com/sbt/sbt-assembly)和publishLocal构建你的胖罐,将生成的jar存储到你的本地ivy2缓存中

这将使其可以基于此项目中的build.sbt设置包含在您的其他项目中,例如:

name := "My Project"
organization := "org.me"
version := "0.1-SNAPSHOT"

将在本地提供"org.me" %% "my-project" % "0.1-SNAPSHOT" SBT将在尝试从外部回购下载之前搜索本地缓存。

然而,这被认为是不好的做法,因为只有最终的项目才能成为一个胖子。你永远不应该把一个作为依赖(很多头痛)。

如果PGapp中包含库,那么没有理由将项目magellan变成胖罐。只需发布本地而无需汇编

另一种方法是使项目彼此依赖作为代码,而不是库。

lazy val projMagellan = RootProject("../magellan")
lazy val projPSGApp = project.in(file(".")).dependsOn(projMagellan)

这使得在projMagellan中的projPSGApp tigger编译中进行编译。

这取决于你的用例。

只是不要陷入必须手动管理.jar的情况

另一个问题:

import sqlContext.implicits._应始终包含在需要数据帧操作的范围内,因此您不应将该导入放在标题中的其他导入附近


更新

根据评论中的讨论,我的建议是:

  • 获取magellan回购

git clone [email protected]:harsha2010/magellan.git

  • 创建一个分支来处理,例如。

git checkout -b new-stuff

  • 更改所需的代码
  • 然后更新版本号,例如。

version := "1.0.7-SNAPSHOT"

  • 在本地发布

sbt publishLocal

你会看到类似的东西(过了一会儿):

[info]将ivy发布到/Users/tomlous/.ivy2/local/harsha2010/magellan_2.11/1.0.7-SNAPSHOT/ivys/ivy.xml

  • 转到您的其他项目
  • 改变build.sbt包括

"harsha2010" %% "magellan" % "1.0.7-SNAPSHOT"在你的libraryDependencies

现在您对库有一个很好的(临时)引用。

您的PSGApp应该构建为胖jar程序集以传递给Spark

sbt clean assembly

这将拉入自定义构建jar

如果magellan项目中的更改对世界其他地方有用,您应该推送您的更改并创建拉取请求,以便将来您可以包含此库的最新版本

© www.soinside.com 2019 - 2024. All rights reserved.