Java 在同一JVM中检测到多个SparkContext

Java 在同一JVM中检测到多个SparkContext,java,apache-spark,jvm,Java,Apache Spark,Jvm,根据我的经验,我必须为我唯一的JVM定义多个SparkContext 我采用了下一种方法(使用Java): 之后,我创建下一个源代码: SparkContext sc = new SparkContext(conf); SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc); 后来在代码中: JavaSparkContext ctx = new JavaSparkContext(conf); JavaRDD<Row&

根据我的经验,我必须为我唯一的JVM定义多个SparkContext

我采用了下一种方法(使用Java):

之后,我创建下一个源代码:

SparkContext sc = new SparkContext(conf);
SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc);
后来在代码中:

JavaSparkContext ctx = new JavaSparkContext(conf);
JavaRDD<Row> testRDD = ctx.parallelize(AllList);
JavaSparkContext ctx=新的JavaSparkContext(conf);
javarddtestrdd=ctx.parallelize(AllList);
执行代码后,我收到下一条错误消息:

16/01/19 15:21:08 WARN SparkContext: Multiple running SparkContexts detected in the same JVM!
org.apache.spark.SparkException: Only one SparkContext may be running in this JVM (see SPARK-2243). To ignore this error, set spark.driver.allowMultipleContexts = true. The currently running SparkContext was created at:
org.apache.spark.SparkContext.<init>(SparkContext.scala:81)
test.MLlib.BinarryClassification.main(BinaryClassification.java:41)
    at org.apache.spark.SparkContext$$anonfun$assertNoOtherContextIsRunning$1.apply(SparkContext.scala:2083)
    at org.apache.spark.SparkContext$$anonfun$assertNoOtherContextIsRunning$1.apply(SparkContext.scala:2065)
    at scala.Option.foreach(Option.scala:236)
    at org.apache.spark.SparkContext$.assertNoOtherContextIsRunning(SparkContext.scala:2065)
    at org.apache.spark.SparkContext$.setActiveContext(SparkContext.scala:2151)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:2023)
    at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:61)
    at test.MLlib.BinarryClassification.main(BinaryClassification.java:105)
16/01/19 15:21:08警告SparkContext:在同一JVM中检测到多个正在运行的SparkContext!
org.apache.spark.SparkException:此JVM中只能运行一个SparkContext(请参阅spark-2243)。要忽略此错误,请将spark.driver.allowMultipleContexts设置为true。当前运行的SparkContext是在以下位置创建的:
org.apache.spark.SparkContext(SparkContext.scala:81)
main(BinaryClassification.java:41)
在org.apache.spark.SparkContext$$anonfun$assertNoOtherContextIsRunning$1.apply上(SparkContext.scala:2083)
在org.apache.spark.SparkContext$$anonfun$assertNoOtherContextIsRunning$1.apply上(SparkContext.scala:2065)
位于scala.Option.foreach(Option.scala:236)
位于org.apache.spark.SparkContext$.assertNoOtherContextIsRunning(SparkContext.scala:2065)
位于org.apache.spark.SparkContext$.setActiveContext(SparkContext.scala:2151)
位于org.apache.spark.SparkContext(SparkContext.scala:2023)
位于org.apache.spark.api.java.JavaSparkContext(JavaSparkContext.scala:61)
位于test.MLlib.BinarryClassification.main(binaryclassion.java:105)

数字
41
105
是行,这两个对象都是在Java代码中定义的。我的问题是,如果我已经使用
set
-方法,是否可以在同一JVM上执行多个SparkContext,以及如何执行

您确定需要JavaSparkContext作为单独的上下文吗?你提到的前一个问题没有这样说。如果您已经有了Spark上下文,则可以从中创建新的JavaSparkContext,而不是创建单独的上下文:

SparkConf conf = new SparkConf();
conf.setAppName("Spark MultipleContest Test");
conf.set("spark.driver.allowMultipleContexts", "true");
conf.setMaster("local");

SparkContext sc = new SparkContext(conf);
SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc);

//Create a Java Context which is the same as the scala one under the hood
JavaSparkContext.fromSparkContext(sc)

默认情况下,SparkContext正在运行,因此您必须停止此上下文: sc.停止
然后,您可以在没有任何pb的情况下继续而不是使用
SparkContext
您应该在
SparkSession
上使用
builder
方法,该方法可以更轻松地实例化spark和SQL上下文,并确保没有上下文冲突

import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().appName("demo").getOrCreate()

你可以在一个JVM中创建多个上下文吗?这里有一个很大的讨论,如果你还没有读过的话:不,我不想:)非常感谢你的解决方案,它看起来很有效。我很高兴得到社区的支持:)
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().appName("demo").getOrCreate()