簡體   English   中英

如何構建一個胖罐來在EMR上執行火花作業?

[英]How to build a fat jar for running a spark job on EMR?

我正在嘗試在EMR上執行火花工作。 我正在使用AMI 3.3.1,我們可以其中看到包括scala 2.11.1的內容。

但是,spark似乎針對2.10.x進行編譯。

那么,我應該使用哪個版本的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上運行此命令時, Exception in thread "Driver" scala.MatchError: java.lang.NoSuchMethodError: scopt.Read或類似的錯誤中出現錯誤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(該工作在本地模式下的計算機上工作正常)。

謝謝。

問題是您不提供您使用的依賴項。 我建議使用sbt程序集插件 您需要做的是使用以下命令創建文件/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。 提交這個罐子 ,工作就完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM