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

时间:2016-04-13 18:09:54

标签: 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

此代码在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)

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

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:10)

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

重复Spark上下文创建的解决方案是在编译器进程中取消选中&#39; Run工作表&#39;设置中的复选框 - &gt;语言和框架 - &gt; Scala - &gt;工作表。我还测试了其他工作表设置,它们对重复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")

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

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

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

在2017.1中,Intellij为Worksheet引入了REPL模式。我用&#39;使用REPL&#39;测试了相同的代码。选项已选中。要运行此模式,您需要在编译过程中保留&#39;运行工作表&#39;上面描述的工作表设置中的复选框已选中(默认情况下)。

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

这是截图: Apache Spark running in IntelliJ Scala Worksheet REPL Mode

答案 1 :(得分:1)

作为detectivebag stated in this git post,您可以通过将工作表切换为仅在“eclipse兼容模式”下运行来解决此问题:

1)打开偏好

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

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

之外的所有内容