工作表中使用IntelliJ的重复Spark上下文

cod*_*ure 10 scala intellij-idea apache-spark apache-spark-sql

我在IntelliJ中有以下工作表:

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

/** Lazily instantiated singleton instance of SQLContext */
object SQLContextSingleton {
  @transient  private var instance: SQLContext = _
  def getInstance(sparkContext: SparkContext): SQLContext = {
    if (instance == null) {
      instance = new SQLContext(sparkContext)
    }
    instance
  }
}

val conf = new SparkConf().
  setAppName("Scala Wooksheet").
  setMaster("local[*]")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val df = sqlContext.read.json("/Users/someuser/some.json")
df.show
Run Code Online (Sandbox Code Playgroud)

此代码在REPL中工作,但似乎只是第一次运行(带有其他一些错误).每次后续,错误是:

16/04/13 11:04:57 WARN SparkContext: Another SparkContext is being constructed (or threw an exception in its constructor).  This may indicate an error, since only one SparkContext may be running in this JVM (see SPARK-2243). The other SparkContext was created at:
org.apache.spark.SparkContext.<init>(SparkContext.scala:82)
Run Code Online (Sandbox Code Playgroud)

如何找到已使用的上下文?

注意:我听到其他人说要使用,conf.set("spark.driver.allowMultipleContexts","true")但这似乎是增加内存使用量的解决方案(如未收集的垃圾).

有没有更好的办法?

tom*_*kas 10

我在使用IntelliJ IDEA(CE 2016.3.4)中的Scala工作表中的Spark执行代码时遇到了同样的问题.

重复Spark上下文创建的解决方案是取消选中Settings - > Languages and Frameworks - > Scala - > Worksheet中的'在编译器进程中运行工作表'复选框.我还测试了其他工作表设置,它们对重复Spark上下文创建的问题没有影响.

我也没有放入sc.stop()工作表.但是我必须在conf中设置master和appName参数才能工作.

以下是Spark Quick Start的 SimpleApp.scala代码的Worksheet版本

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")
Run Code Online (Sandbox Code Playgroud)

我使用了指南中的相同simple.sbt将依赖项导入IntelliJ IDEA.

以下是使用Spark的功能Scala工作表的屏幕截图: 使用Spark的功能Scala工作表的屏幕截图

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

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

代码在Worksheet REPL模式下运行正常.

这是截图: Apache Spark在IntelliJ Scala工作表REPL模式下运行

  • 重复Spark上下文创建的解决方案是取消选中Settings - > Languages and Frameworks - > Scala - > Worksheet中的'在编译器进程中运行工作表'复选框.这对我有用.另一种方法是创建一个简单的Scala对象并将Spark代码放在那里. (3认同)

Log*_*ter 1

正如侦探袋在这篇 git 帖子中所述,您可以通过将工作表切换为仅在“eclipse 兼容模式”下运行来解决此问题:

1)开放偏好

2) 在语言和框架下选择 scala

3)在工作表选项卡下取消选中除“使用“eclipse兼容性”模式”之外的所有内容