我在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")
,但这似乎是增加内存使用量的解决方案(如未收集的垃圾)。
有更好的方法吗?
答案 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。
IntelliJ CE 2017.1更新(REPL模式下的工作表)
在2017.1中,Intellij为Worksheet引入了REPL模式。我用&#39;使用REPL&#39;测试了相同的代码。选项已选中。要运行此模式,您需要在编译过程中保留&#39;运行工作表&#39;上面描述的工作表设置中的复选框已选中(默认情况下)。
代码在Worksheet REPL模式下运行良好。
答案 1 :(得分:1)
作为detectivebag stated in this git post,您可以通过将工作表切换为仅在“eclipse兼容模式”下运行来解决此问题:
1)打开偏好
2)在语言和框架下选择scala
3)在工作表选项卡下取消选中除“使用”eclipse兼容性“模式”
之外的所有内容