Spark Scala java.lang.NoSuchMethodError:在CDH 5.16中执行fat jar时
我使用的是Spark Scala java.lang.NoSuchMethodError:在CDH 5.16中执行fat jar时,scala,apache-spark,hadoop,sbt,cloudera-cdh,Scala,Apache Spark,Hadoop,Sbt,Cloudera Cdh,我使用的是cdh5.16,它有spark1.6.0、scala2.10.5和java1.8。 我试图通过使用sbt从本地系统创建FAT jar来运行spark代码 但是,当我在集群上运行spark submit时,出现以下错误: Exception in thread "main" java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/ref
cdh5.16
,它有spark1.6.0
、scala2.10.5
和java1.8
。
我试图通过使用sbt
从本地系统创建FAT jar
来运行spark代码
但是,当我在集群上运行spark submit时,出现以下错误:
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 standalone,并且能够通过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.0
,2.10.5
和2.10.6
。
结果都一样
下面是我的plugin.sbt
文件内容:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.4")
我正在使用scalaide
编写代码
有人能帮我找出问题所在吗。最终解决了这个问题。似乎scala的版本在
.sbt
文件中更改后仍然没有更改。在target
文件夹中,将创建组合的jar
文件的文件夹仍然命名为2.11
,而不是2.10
。
因此,我为相同的spark代码创建了一个新的
sbt
项目,编译它,重新创建eclipse
文件(我正在使用scala ide
),然后组装它。新的jar
现在运行良好。最终解决了这个问题。似乎scala的版本在.sbt
文件中更改后仍然没有更改。在target
文件夹中,将创建组合的jar
文件的文件夹仍然命名为2.11
,而不是2.10
。
因此,我为相同的spark代码创建了一个新的
sbt
项目,编译它,重新创建eclipse
文件(我正在使用scala ide
),然后组装它。新的jar
现在运行良好。集群中使用的是哪种版本的Spark和Scala?在集群中,spark的版本是1.6.0,scala的版本是2.10.5(我在开头提到过)。我在sbt文件中匹配了它们,再次创建了eclipse文件,再次组装了它们,并在移动jar后在集群中运行了spark submit命令。但同样的问题!集群中使用的是什么版本的Spark和Scala?在集群中,spark的版本是1.6.0,scala的版本是2.10.5(我在开头提到过)。我在sbt文件中匹配了它们,再次创建了eclipse文件,再次组装了它们,并在移动jar后在集群中运行了spark submit命令。但同样的问题!