在Eclipse中,只有一个SparkContext可以在这个JVM中运行

时间:2018-02-25 15:45:22

标签: scala apache-spark apache-kafka

我需要在单个程序中使用流上下文和spark上下文,因为我正在使用需要Spark上下文的SQLContext。这是我的代码

import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.sql.functions
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkContext
//import java.io.Serializable
case class Sensor(id:String,date:String,temp:String,press:String)
object consum {
 def main(args: Array[String]) {
  val sparkConf = new SparkConf().setAppName("KafkaWordCount").setMaster("local[2]")
val ssc = new StreamingContext(sparkConf, Seconds(2))
val sc=new SparkContext(sparkConf) 
val lines = KafkaUtils.createStream(ssc, "localhost:2181", "spark-streaming-consumer-group", Map("hello" -> 5))


def parseSensor(str:String): Sensor={
    val p=str.split(",")
    Sensor(p(0),p(1),p(2),p(3))
  }
  val data=lines.map(_._2).map(parseSensor)
val sqlcontext=new SQLContext(sc)

import sqlcontext.implicits._
data.foreachRDD { rdd=>



val sensedata=SQLContext.getOrCreate(rdd.sparkContext)
rdd.toDF().registerTempTable("sensor")
val res=sqlcontext.sql("SELECT id,date,max(temp) as maximum temperature,max(press) as maximum pressure FROM Sensor GROUP BY id,date")
res.show()
}
lines.print()

ssc.start()
ssc.awaitTermination()
  }



}

这就是错误。任何人都可以告诉我如何在一个程序中使用它们。我正在使用eclipse。另外,我已经使用了教程中的部分代码,如果我使用错误请告诉我。

Exception in thread "main" 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:82)
org.apache.spark.streaming.StreamingContext$.createNewSparkContext(StreamingContext.scala:864)
org.apache.spark.streaming.StreamingContext.<init>(StreamingContext.scala:81)
consum$.main(consum.scala:16)

1 个答案:

答案 0 :(得分:0)

如果您看到构造函数new StreamingContext(sparkConf, Seconds(2))的主体,您将能够看到它实例化StreamingContext,此构造函数本身正在通过{{1创建一个SparkContext的实例}}:

StreamingContext.createNewSparkContext(conf)

运行火花的第一件事是def this(conf: SparkConf, batchDuration: Duration) = { this(StreamingContext.createNewSparkContext(conf), null, batchDuration) } 。因此,无论您要创建的是SparkContext还是StreamingContext,您都需要在环境中已经创建的SQLContext的实例。

在您的情况下,如果先创建SparkContext,然后在SparkContextStreamingContext的构造函数中传递此SparkContext对象,则可以轻松地避免错误。

SQLContext

上面的代码将使用StreamingContext的以下构造函数:

val sc=new SparkContext(sparkConf) 
val ssc = new StreamingContext(sc, Seconds(2))
val sqlcontext=new SQLContext(sc)