Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark Scala java.lang.NoSuchMethodError:在CDH 5.16中执行fat jar时_Scala_Apache Spark_Hadoop_Sbt_Cloudera Cdh - Fatal编程技术网

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命令。但同样的问题!