如何设置Intellij 14 Scala工作表来运行Spark

时间:2015-08-24 18:27:54

标签: scala intellij-idea apache-spark worksheet

我正在尝试在Intellij 14 Scala工作表中创建一个SparkContext。

这是我的依赖

name := "LearnSpark"
version := "1.0"
scalaVersion := "2.11.7"
// for working with Spark API
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.0"

以下是我在工作表中运行的代码

import org.apache.spark.{SparkContext, SparkConf}
val conf = new SparkConf().setMaster("local").setAppName("spark-play")
val sc = new SparkContext(conf)

错误

15/08/24 14:01:59 ERROR SparkContext: Error initializing SparkContext.
java.lang.ClassNotFoundException: rg.apache.spark.rpc.akka.AkkaRpcEnvFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)

当我将Spark作为独立应用运行时,它运行正常。例如

import org.apache.spark.{SparkContext, SparkConf}

// stops verbose logs
import org.apache.log4j.{Level, Logger}

object TestMain {

  Logger.getLogger("org").setLevel(Level.OFF)

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

    //Create SparkContext
    val conf = new SparkConf()
      .setMaster("local[2]")
      .setAppName("mySparkApp")
      .set("spark.executor.memory", "1g")
      .set("spark.rdd.compress", "true")
      .set("spark.storage.memoryFraction", "1")

    val sc = new SparkContext(conf)

    val data = sc.parallelize(1 to 10000000).collect().filter(_ < 1000)
    data.foreach(println)
  }
}

有人可以就解决此异常的目的提供一些指导吗?

感谢。

5 个答案:

答案 0 :(得分:11)

由于仍然存在很多疑问,如果可以使用Spark运行IntelliJ IDEA Scala Worksheet并且这个问题是最直接的问题,我想分享我的截图和菜谱样式配方以获得Spark代码评估工作表。

我在IntelliJ IDEA中使用Spark 2.1.0和Scala Worksheet(CE 2016.3.4)。

第一步是在IntelliJ中导入依赖项时使用build.sbt文件。我使用了Spark Quick Start中的相同simple.sbt:

name := "Simple Project"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"

第二步是取消选中Settings - &gt;中的'在编译器进程中运行工作表'复选框。语言和框架 - &gt; Scala - &gt;工作表。我还测试了其他工作表设置,它们对重复Spark上下文创建的警告没有影响。

以下是SimpleApp.scala示例中的代码版本,该示例在修改为在工作表中工作的同一指南中。必须在同一工作表中设置masterappName参数:

import org.apache.spark.{SparkConf, SparkContext}

val conf = new SparkConf()
conf.setMaster("local[*]")
conf.setAppName("Simple Application")

val sc = new SparkContext(conf)

val logFile = "/opt/spark-latest/README.md"
val logData = sc.textFile(logFile).cache()
val numAs = logData.filter(line => line.contains("a")).count()
val numBs = logData.filter(line => line.contains("b")).count()

println(s"Lines with a: $numAs, Lines with b: $numBs")

以下是使用Spark的功能Scala工作表的屏幕截图: a screenshot of the functioning Scala Worksheet with Spark

IntelliJ CE 2017.1更新(REPL模式下的工作表)

在2017.1中,Intellij为Worksheet引入了REPL模式。我已经通过选中“使用REPL”选项测试了相同的代码。要运行此模式,您需要在上面描述的工作表设置中选中“在编译器进程中运行工作表”复选框(默认情况下是这样)。

代码在Worksheet REPL模式下运行良好。

这是截图: Spark in IJ Scala Worksheet REPL mode

答案 1 :(得分:5)

我使用Intellij CE 2016.3,Spark 2.0.2并在eclipse兼容模型中运行scala工作表,到目前为止,大部分都没问题,只剩下小问题了。

打开偏好设置 - &gt;类型scala - &gt;在语言和框架,选择Scala - &gt;选择工作表 - &gt;只选择eclipse兼容模式或不选择任何内容。

以前,在编译过程中选择&#34;运行工作表&#34;时,我遇到了很多问题,不仅仅是使用Spark,还有Elasticsearch。我想在编译过程中选择&#34;运行工作表&#34;时,Intellij会做一些棘手的优化,可能会对变量等添加延迟,这在某些情况下会使工作表变得相当有线。

另外我发现有时当工作表中定义的类不工作或行为异常时,放入一个单独的文件并编译它,然后在工作表中运行它会解决很多问题。

答案 2 :(得分:1)

我遇到了同样的问题,虽然尝试了多次尝试,但无法解决这个问题。而不是工作表,现在我正在使用scala console,至少比什么都没用。

答案 3 :(得分:-1)

我也遇到过与Intellij类似的问题,在build.sbt中添加libraryDependencies后,SBT无法解析这些库。 IDEA默认情况下不下载依赖项。重启了Intellij,它解决了这个问题。开始下载依赖项。

所以,

  

确保在本地项目中下载依赖项,如果没有,请重新启动IDE或触发IDE以下载所需的依赖项

     

确保已解析存储库,如果没有,请在解析程序下包含存储库位置+ =

答案 4 :(得分:-1)

以下是我的maven dependecies配置,它始终有效且稳定。我经常编写spark pragram并将其提交给yarn-cluster进行集群运行。

关键jar是 $ {spark.home} /lib/spark-assembly-1.5.2 hadoop2.6.0.jar ,它包含几乎所有的spark依赖项,并包含在每个spark版本中。 (实际上spark-submit会将这个jar分发到集群,所以不要再担心ClassNotFoundException了:D)

我认为您可以使用以上类似配置更改 libraryDependencies + =“org.apache.spark”%%“spark-core”%“1.4.0”(Maven使用systemPath指向本地jar依赖,我认为SBT有类似的配置)

注意:记录罐子排除是可选的,因为它与我的其他罐子有冲突。

 <!--Apache Spark -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-assembly</artifactId>
            <version>1.5.2</version>
            <scope>system</scope>
            <systemPath>${spark.home}/lib/spark-assembly-1.5.2-hadoop2.6.0.jar</systemPath>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.10.2</version>
        </dependency>