scala - Spark 斯卡拉 java.lang.NoSuchMethodError : while executing fat jar in CDH 5. 16

标签 scala apache-spark hadoop sbt cloudera-cdh

我正在使用 CDH 5.16,它有 Spark 1.6.0scala 2.10.5java 1.8 . 我正在尝试通过使用 sbt 从我的本地系统创建 FAT jar 来运行 spark 代码。

但是当我在集群上运行 spark 提交时,出现以下错误:

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

我的 spark 代码相当简单,如下所示:

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types._
import org.apache.spark.sql.{SQLContext,SaveMode}


case class categories_schema(CategoryID: String, CategoryName: String, Description: String )
case class products_schema(ProductID: String, CategoryID: String, ProductName: String, SupplierID: String)

object salesSample {

  def main(args: Array[String]){

    val conf:SparkConf = new SparkConf().setAppName("salessample").setMaster("local")
    val sc:SparkContext = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)


    import sqlContext.implicits._



    val categories_data = sc.textFile("hdfs://url/user/ak_bng/categories").map(_.split(",")).map(p => categories_schema(p(0),p(1),p(2))).toDF()
    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()

   categories_data.registerTempTable("categories_data")
   product_data.registerTempTable("product_data")

   val prod_order_sql="""select distinct p.ProductID,p.ProductName,c.categoryname,
                          oh.OrderDate,oh.Freight,oh.OrderID,oh.ShipperID,
                          od.Quantity,od.Sales,Discount,od.COS,od.GP,p.CategoryID,
                          oh.Updated_time as oh_Updated_time,od.Updated_time as od_Updated_time
                          from prod p 
                          inner join ordrd od on p.productID=od.productID
                          inner join ordrh oh on od.OrderID=oh.OrderID
                          inner join cat c on c.categoryID=p.categoryID
                       """  

   categories_data.write.mode(SaveMode.Overwrite).parquet("hdfs://url/user/hive/warehouse/product_order_temp2")
   sc.stop()
  }
}

我之前在同一个 RHEl 服务器上安装了独立的 Hadoop,我能够通过 SBT 执行 jar 构建。

在谷歌搜索中我发现这是一个版本问题。我已经更正了它们,但仍然无法完全弄清楚问题是什么。

下面是我的 build.sbt 文件的内容:

name := "Simple_Project"

version := "1.0"

scalaVersion := "2.10.6"

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" % "provided"
libraryDependencies += "org.apache.spark" %% "spark-streaming" % "1.6.0" % "provided"
libraryDependencies += "org.apache.spark" %% "spark-streaming-kinesis-asl" % "1.6.0"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.6.0" % "provided"

assemblyMergeStrategy in assembly := {
 case PathList("META-INF", xs @ _*) => MergeStrategy.discard
 case x => MergeStrategy.first
}

我尝试将 Scala 的版本更改为 2.10.02.10.52.10.6 . 所有人都给出了相同的结果。

下面是我的plugin.sbt文件内容:

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

我正在使用 Scala IDE 编写代码。

谁能帮我弄清楚这里的问题是什么。

最佳答案

终于解决了。似乎即使在 .sbt 文件中更改了 Scala 的版本也没有更改。在 target 文件夹中,将创建组装的 jar 文件的文件夹仍命名为 2.11 而不是 2.10 . 所以我为相同的 spark 代码创建了一个新的 sbt 项目,编译它,重新创建 eclipse 文件(我正在使用 scala ide)然后组装它。新的 jar 现在工作正常。

关于scala - Spark 斯卡拉 java.lang.NoSuchMethodError : while executing fat jar in CDH 5. 16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57004414/

相关文章:

apache-spark - CheckPointing 时在 foreachRDD() 中使用的对象的序列化

r - 如何使用 Spark Dataframe API 对 Case-Otherwise 语句应用多个条件

hadoop - 从多个服务器加载数据时避免数据重复

scala - 在 Scalaz 中自定义 Future、Either 和 Writer 的组合

scala - 在 Scala 中查找数字的对数

java - 增加 Spark on Yarn 中的 Java 堆大小

python - 使用 pyspark 创建自动增量键值

scala - 如何在 ScalaFX 中更改 LineChart XAxis 下限/上限?

scala - 在 Scala 中将案例类转换为 CSV

hadoop - 权限被拒绝:验证Hadoop dfs