如何在EMR上构建一个用于运行spark作业的胖罐?

时间:2015-02-13 13:35:51

标签: scala amazon-web-services apache-spark emr

我正在尝试在EMR上运行一个火花工作。我正在使用AMI 3.3.1,我们可以看到here包含scala 2.11.1。

然而,火花似乎是针对2.10.x编译的。

那么,我应该用什么版本编译我的火花作业?这是我的build.sbt:

name := "myjar"

assemblyJarName in assembly := s"${name.value}-${version.value}.jar"

version := "0.0.1"

scalaVersion := "2.10.4"

mainClass := Some("my.EmrPoc")

resolvers += Resolver.sonatypeRepo("public")

libraryDependencies ++= Seq(
  "org.apache.hadoop" % "hadoop-client" % "2.2.0" % "provided",
  "org.apache.spark" %% "spark-core" % "1.2.0" % "provided",
  "org.apache.spark" %% "spark-sql" % "1.2.0",        
  "com.databricks" %% "spark-avro" % "0.1",           
  "com.github.scopt" %% "scopt" % "3.3.0",
  "net.sf.opencsv" % "opencsv" % "2.3",
  "joda-time" % "joda-time" % "2.7",
  "org.joda" % "joda-convert" % "1.7",
  "org.scalatest" %% "scalatest" % "2.2.1" % "test"
)

assemblyMergeStrategy in assembly := {
  case x if x.endsWith(".class") => MergeStrategy.last
  case x if x.endsWith(".properties") => MergeStrategy.last
  case x if x.contains("/resources/") => MergeStrategy.last
  case x if x.startsWith("META-INF/mailcap") => MergeStrategy.last
  case x if x.startsWith("META-INF/mimetypes.default") => MergeStrategy.first
  case x if x.startsWith("META-INF/maven/org.slf4j/slf4j-api/pom.") => MergeStrategy.first
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    if (oldStrategy == MergeStrategy.deduplicate)
      MergeStrategy.first
    else
      oldStrategy(x)
}

assemblyExcludedJars in assembly := {
  val cp = (fullClasspath in assembly).value
  cp filter {_.data.getName == "avro-ipc-1.7.7-tests.jar"}
}

问题是当我在EMR上运行时,我收到错误Exception in thread "Driver" scala.MatchError: java.lang.NoSuchMethodError: scopt.Read或类似的东西(我现在终止了群集)。所以它显然无法访问scopt jar,我想知道这是否是由于我编译2.10.4而是部署在2.11.1上。但我不认为这是因为我从所有实例中卸载了scala并重新安装了scala v2.10.4并获得了相同的消息。

那么,我该如何调试它,以及如何构建我的jar(在本地模式下我的机器上的工作正常)。

感谢。

1 个答案:

答案 0 :(得分:0)

问题是您没有提供您使用的依赖项。我建议使用sbt assembly plugin。您需要做的就是使用

创建文件/project/assembly.sbt
resolvers += Resolver.url("artifactory", url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

然后运行$sbt assembly。它将创建包含所有依赖项的jar。提交此jar ,即可完成工作。