Why does executing Spark application fail in IntelliJ IDEA with "NoClassDefFoundError: org/apache/spark/mllib/regression/LabeledPoint"?

Why does executing Spark application fail in IntelliJ IDEA with "NoClassDefFoundError: org/apache/spark/mllib/regression/LabeledPoint"?

我一直在使用 Spark MLlib 和 scala 编写简单的代码。 但是,当我 运行 代码时,我得到了错误 "Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/mllib/regression/LabeledPoint" .是什么原因导致此错误?

IDE 工具 (IntelliJ) 告诉我 "LinearRegressionWithSGD is deprecated" 我安装的是2.2.0的spark版本和2.11的scala版本。 我应该做些什么?如果我想使用 "LinearRegressionWithSGD".

请帮我解决这个问题。

代码如下:

import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.mllib.regression.LinearRegressionWithSGD
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors

import java.io.StringWriter
import au.com.bytecode.opencsv.CSVWriter
import scala.collection.JavaConversions._
import java.io.FileWriter
import java.io.BufferedWriter

import java.io.File

// feature vector
var _00h = Array(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

object CacheAlgoApp {
  def main(args: Array[String]) : Unit = {

      // Load and parse the data
      var data = sc.textFile("test.log")
      var operationData = data.filter(line => line.contains("operations"))

      val adjustTime = 6

      var parsedData = operationData.map { line =>
        var parts = line.split(' ')
        LabeledPoint(parts(adjustTime+0).toDouble, Vectors.dense(_00h.take(24).map(_.toDouble)))
      }

      // Build linear regression model
      var regression = new LinearRegressionWithSGD().setIntercept(false)
      regression.optimizer.setNumIterations(200)
      regression.optimizer.setStepSize(1) //0.0, 0.20999999999999963, 0.03999999999999999
      var model00 = regression.run(parsedData)

    }    
}

而pom.xml如下。会不会是依赖的问题?

<dependencies>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.11.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.2.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-mllib -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_2.11</artifactId>
        <version>2.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

tl;dr 删除 provided 范围的 spark-mllib_2.11 依赖项并重新开始。

出现异常的原因是您 运行 在应用程序的 class 路径上没有 Spark MLlib 的代码。

但是您 运行 class 使用 Spark MLlib 的 LinearRegressionWithSGD 的代码,因此需要 class 在 CLASSPATH 上可用。

使用 Intellij IDEA 执行 Spark 代码 有时 很难做到正确,但 通常 就可以了。如果没有,强烈建议按照 Spark 官方文档的 Submitting Applications:[=20 中所述,使用 spark-submit 提交 Spark 应用程序(任何类型的有或没有 Spark MLlib)的推荐方式=]

The spark-submit script in Spark’s bin directory is used to launch applications on a cluster.

跳过 "on a cluster" 部分,因为这对这里没有帮助(实际上是不正确的)。

spark-mllib_2.11 在代码级别表示 Spark MLlib 的依赖项在 provided 范围内,因此在您的 Spark 应用程序的 CLASSPATH 中不可用。删除 provided 范围并重新开始。它应该工作正常。