多个SparkContexts在同一个JVM上运行

时间:2015-02-27 21:09:03

标签: apache-spark spark-streaming

我正在使用spark,并且遇到了一个错误,它阻止了整个火花过程:

16:01:37.289 [main] WARN  org.apache.spark.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.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:61)

我认为我在同一个JVM上运行多个SparkContext。怎么检查这个?或者强制杀死已经运行的那个?

2 个答案:

答案 0 :(得分:2)

当您尝试在已启动SparkContext的同一JVM中实例化另一个SparkContext时,SparkContext构造函数将引发异常。您可以使用spark.driver.allowMultipleContexts = true关闭异常。

//SparkConf which is using to instantiate SparkContext (new SparkContext((conf))
conf.set("spark.driver.allowMultipleContexts","true")

如果以本地模式启动,通常情况下spark会在正在运行的机器中打开4040端口。您可以从4040到4050运行一个端口扫描并检查进程名称。

答案 1 :(得分:2)

您没有可供查询的活动上下文列表。正如@ Devan M S指出的那样,您可以禁止使用conf.set("spark.driver.allowMultipleContexts","true")抛出异常,但 Spark仍会发出警告并且有充分的理由。 Spark使用JVM范围的缓存(参见SPARK-2243)。

Spark也没有提供杀死现有上下文的API(假设它们是单例,这有点奇怪,但是嘿)。正如@ Josh Rosen在评论中所说,您可以通过完整堆栈跟踪找到新上下文的创建位置。

您遇到问题的答案取决于您何时遇到问题。如果是在自动化测试期间,则faster2b表示测试可能不会在自身之后清除。我建议使用JUnit Rule来处理清理工作。

如果它是在运行时期间,那么我会查看使用Dependency Injection,因此只有应用程序的一部分负责创建Spark上下文。