Scala 如何为在EMR上运行spark作业构建胖罐?

Scala 如何为在EMR上运行spark作业构建胖罐?,scala,amazon-web-services,apache-spark,emr,Scala,Amazon Web Services,Apache Spark,Emr,我正试着在EMR上做一个有火花的工作。我使用的是AMI3.3.1,我们可以看到它包括Scala2.11.1 然而,spark似乎是针对这一点编写的 那么,我应该用什么版本编译我的spark作业呢?以下是我的build.sbt: name := "myjar" assemblyJarName in assembly := s"${name.value}-${version.value}.jar" version := "0.0.1" scalaVersion := "2.10.4" mai

我正试着在EMR上做一个有火花的工作。我使用的是AMI3.3.1,我们可以看到它包括Scala2.11.1

然而,spark似乎是针对这一点编写的

那么,我应该用什么版本编译我的spark作业呢?以下是我的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上运行这个程序时,我在线程“驱动程序”scala.MatchError:java.lang.NoSuchMethodError:scopt.Read中得到一个错误
异常(我现在已经终止了集群)。因此,它显然无法访问
scopt
jar,我想知道这是否是因为我针对2.10.4进行编译,但部署在2.11.1上。但我不认为这是因为我从所有实例中卸载了scala,重新安装了scala v2.10.4,得到了相同的信息

那么,我如何调试它,以及如何构建我的jar(该作业在本地模式下在我的机器上运行良好)


谢谢。

问题是您没有提供所使用的依赖项。我建议使用。您只需使用创建文件
/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工作就完成了。

我用proguard(和sbtproguard)做过类似的事情。但我不会撒谎,每次我使用它,都需要调整才能正确使用。@RichHenry proguard与此有什么关系?我从Scala项目部署到Java环境,proguard将我的Scala-library.jar过滤到我在模块中使用的内容,因为运行时不可用。我也在Scaloid(android项目)等方面使用了类似的方法。也许这个问题还不够相似,如果我给你带来任何困惑,对不起。啊,好的。不,在这种情况下,我需要它抱怨找不到的特定依赖项。不过,我将来会记住这一点。谢谢。如果您有一个
scopt
Class[\u]
实例的句柄,您可以执行类似
classDef.getResource(“/”+classDef.getName.replace(“.”,“/”+“.Class”)。toExternalForm
的操作来查看加载它的jar的名称。希望里面有版本号。