为什么使用“NoClassDefFoundError:org / apache / spark / mllib / regression / LabeledPoint”在IntelliJ IDEA中执行Spark应用程序失败?

时间:2017-12-07 08:51:51

标签: scala maven apache-spark intellij-idea apache-spark-mllib

我一直在使用Spark MLlib和scala编写一个简单的代码。 但是,当我运行代码时,我收到错误“线程中的异常”主“java.lang.NoClassDefFoundError:org / apache / spark / mllib / regression / LabeledPoint” 。是什么导致了这个错误?

IDE工具(IntelliJ)告诉我“LinearRegressionWithSGD已被弃用” 我安装了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>

1 个答案:

答案 0 :(得分:1)

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

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

但是,您运行代码时,该类使用Spark MLlib&#39; LinearRegressionWithSGD,因此要求该类在CLASSPATH上可用。

使用Intellij IDEA执行Spark代码有时很难做到正确,但通常才有效。如果没有,强烈建议使用Spark官方文档中描述的使用spark-submit提交Spark应用程序(使用或不使用Spark MLlib的任何类型)的推荐方式spark-submit {3}}:

  

Spark的bin目录中的spark-mllib_2.11脚本用于在集群上启动应用程序。

在群集&#34; 部分跳过&#34;因为这里没有任何帮助(实际上是不正确的)。

在代码级别表示Spark MLlib的

provided依赖项位于provided范围内,因此在您的Spark应用程序的CLASSPATH中不可用。删除DocumentBuilderFactory fact= DocumentBuilderFactory.newInstance(); fact.setNamespaceAware(true); fact.setFeature("http://xml.org/sax/features/validation", true); fact.setFeature("http://apache.org/xml/features/validation/schema", true); fact.setFeature("http://apache.org/xml/features/validation" + "/schema-full-checking", true); DocumentBuilder docBuilder=fact.newDocumentBuilder(); Document doc = docBuilder.parse(new File(fileName)); doc.setXmlStandalone(true); Element rootElm=doc.getDocumentElement(); Element settingElm=(Element) rootElm.getElementsByTagName("ABC").item(0); NamedNodeMap settingAttr=settingElm.getAttributes(); Node nod=settingAttr.getNamedItem(attribute); if(nod==null){ } else{ nod.setTextContent(value); } TransformerFactory transformerFactory=TransformerFactory.newInstance(); Transformer transformer=transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); DOMSource source=new DOMSource(doc); StreamResult result=new StreamResult(new File(fileName)); transformer.transform(source, result); 范围并重新开始。它应该可以正常工作。