装配,包括我的罐子
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装配,包括我的罐子相关的知识,希望对你有一定的参考价值。
我想构建一个“胖”的代码罐。我理解如何做到这一点,但所有的例子我都使用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和争论范围)。
一种方法是使用本地程序集插件(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 git@github.com: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项目中的更改对世界其他地方有用,您应该推送您的更改并创建拉取请求,以便将来您可以包含此库的最新版本
以上是关于装配,包括我的罐子的主要内容,如果未能解决你的问题,请参考以下文章