spark scala java.lang.nosuchmethoderror:在cdh 5.16中执行fat jar时出错

wtzytmuj  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(512)

我正在使用 CDH 5.16 有哪些 Spark 1.6.0 , scala 2.10.5 以及 java 1.8 . 我试图通过创建 FAT jar 从我的本地系统使用 sbt .
但是,当我在集群上运行spark submit时,出现以下错误:

  1. Exception in thread "main" java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/reflect/api/JavaUniverse$JavaMirror;
  2. at salesSample$.main(salesSample.scala:24)
  3. at salesSample.main(salesSample.scala)
  4. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  5. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  6. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  7. at java.lang.reflect.Method.invoke(Method.java:498)
  8. at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:730)
  9. at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
  10. at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
  11. at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
  12. at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我的spark代码非常简单,如下所示:

  1. import org.apache.spark.SparkContext
  2. import org.apache.spark.SparkConf
  3. import org.apache.spark.sql.SQLContext
  4. import org.apache.spark.sql.types._
  5. import org.apache.spark.sql.{SQLContext,SaveMode}
  6. case class categories_schema(CategoryID: String, CategoryName: String, Description: String )
  7. case class products_schema(ProductID: String, CategoryID: String, ProductName: String, SupplierID: String)
  8. object salesSample {
  9. def main(args: Array[String]){
  10. val conf:SparkConf = new SparkConf().setAppName("salessample").setMaster("local")
  11. val sc:SparkContext = new SparkContext(conf)
  12. val sqlContext = new SQLContext(sc)
  13. import sqlContext.implicits._
  14. val categories_data = sc.textFile("hdfs://url/user/ak_bng/categories").map(_.split(",")).map(p => categories_schema(p(0),p(1),p(2))).toDF()
  15. val product_data=sc.textFile("hdfs://url/user/ak_bng/products").map(_.split(",")).map( p=> products_schema(p(0),p(1),p(2),p(3))).toDF()
  16. categories_data.registerTempTable("categories_data")
  17. product_data.registerTempTable("product_data")
  18. val prod_order_sql="""select distinct p.ProductID,p.ProductName,c.categoryname,
  19. oh.OrderDate,oh.Freight,oh.OrderID,oh.ShipperID,
  20. od.Quantity,od.Sales,Discount,od.COS,od.GP,p.CategoryID,
  21. oh.Updated_time as oh_Updated_time,od.Updated_time as od_Updated_time
  22. from prod p
  23. inner join ordrd od on p.productID=od.productID
  24. inner join ordrh oh on od.OrderID=oh.OrderID
  25. inner join cat c on c.categoryID=p.categoryID
  26. """
  27. categories_data.write.mode(SaveMode.Overwrite).parquet("hdfs://url/user/hive/warehouse/product_order_temp2")
  28. sc.stop()
  29. }
  30. }

我以前在同一个rhel服务器上安装了hadoop单机版,并且能够通过sbt执行jar构建。
在google上我发现这是一个版本问题。我已经纠正了他们,但仍然不太明白是什么问题。
以下是我的工作内容 build.sbt 文件:

  1. name := "Simple_Project"
  2. version := "1.0"
  3. scalaVersion := "2.10.6"
  4. libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" % "provided"
  5. libraryDependencies += "org.apache.spark" %% "spark-streaming" % "1.6.0" % "provided"
  6. libraryDependencies += "org.apache.spark" %% "spark-streaming-kinesis-asl" % "1.6.0"
  7. libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.6.0" % "provided"
  8. assemblyMergeStrategy in assembly := {
  9. case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  10. case x => MergeStrategy.first
  11. }

我试着改变 Scala2.10.0 , 2.10.5 以及 2.10.6 . 结果都一样。
下面是我的 plugin.sbt 文件内容:

  1. addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
  2. addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.4")

我正在使用 Scala IDE 编写代码。
有人能帮我弄清楚这里有什么问题吗。

idv4meu8

idv4meu81#

最终解决了这个问题。似乎scala的版本没有改变,即使在 .sbt 文件。在 target 文件夹集合的文件夹 jar 将要创建的文件仍命名为 2.11 而不是 2.10 . 所以我创造了一个新的 sbt 为同一个spark项目代码,编译它,重新创建 eclipse 文件(我正在使用 scala ide )然后组装起来。新的 jar 现在一切正常。

相关问题