Apache spark Spark状态计算:在mappingFunction中创建RDD

Apache spark Spark状态计算:在mappingFunction中创建RDD,apache-spark,streaming,rdd,stateful,bigdata,Apache Spark,Streaming,Rdd,Stateful,Bigdata,我正在使用Spark Streaming构建一个程序,该程序对输入数据执行一些线性回归,预测我的输出数据并打印该预测 我还想训练我的模型,不仅要训练传入数据,还要训练最后的xxx数据点,我想使用Sparks有状态计算功能来完成这项任务。我所在的州保存着一份数据列表,到时候,将使用所有这些数据来训练模型并预测一组新的值 该应用程序通过spark submit发送给运行在mesos群集上的spark dispatcher,spark submit还设置了该应用程序的主url。正如您在下面看到的,这似

我正在使用Spark Streaming构建一个程序,该程序对输入数据执行一些线性回归,预测我的输出数据并打印该预测

我还想训练我的模型,不仅要训练传入数据,还要训练最后的xxx数据点,我想使用Sparks有状态计算功能来完成这项任务。我所在的州保存着一份数据列表,到时候,将使用所有这些数据来训练模型并预测一组新的值

该应用程序通过spark submit发送给运行在mesos群集上的spark dispatcher,spark submit还设置了该应用程序的主url。正如您在下面看到的,这似乎是一些问题的根源

Sparks MLlib算法(LinearRegressionWithGD)只接受RDD作为输入。这意味着我必须在我的状态下并行化存储在存储器中的数据,例如,使用类似(sc是spark上下文)的东西:

然而,这会产生一些问题:

  • 我无法为我的状态提供spark上下文,因为它不可序列化,而且状态显然会被发送到所有的执行器(我尝试过了,得到了NotSerializableException)

  • 我试图定义一个保存spark上下文的对象,并在类中直接使用它,其思想是对象是一个单例,当函数需要它时,它将被复制到spark executor:

    object Spark {
     lazy val config = new SparkConf()
     lazy val context = new SparkContext
    }
    // Then in my state mapping fuction:
    val parallelizedData = Spark.context.parallelize(trainingData)
    
在这个版本中,执行者试图创建一个新的spark上下文,但是因为主URL是通过spark submit提供的,并且不是硬编码的,所以它不起作用,我得到错误“您必须提供一个主URL”。这似乎是错误的,因为显然我不想(也不能)创建一个新的上下文,而是使用已经存在的旧上下文,并且在我尝试训练我的模型之前很久就在我的主程序中使用了

我还尝试将上面Spark对象中的主URL设置为dispatcher的主URL,但这也不起作用。将其硬编码为“local[N]”是可行的,但随后应用程序不会并行化,而是只在驱动程序上执行

有人有过spark中有状态计算的经验吗?网络上似乎只有很少的文档,其中大部分不适用于我的情况。如何将上下文发送到状态?或者,如何强制在驱动程序上执行状态,使其能够访问该状态


或者我可以创建一个只驻留在worker上的RDD,并将其发送回驱动程序,驱动程序将聚合结果并创建一个新的RDD供我用于培训吗?

我没有状态计算的经验,但我知道新的Spark 1.6功能:mapWithState]()希望这能有所帮助。你到底想做什么还不清楚。我觉得奇怪的是,您需要将
SparkContext
存储在对象中。试着描述一下你的意图是什么,以及你想实现什么。我没有状态计算的经验,但我知道Spark 1.6的新功能:mapWithState]()希望这能有所帮助。现在还不清楚你到底想做什么。我觉得奇怪的是,您需要将
SparkContext
存储在对象中。试着描述一下你的意图是什么,以及你想实现什么。
object Spark {
 lazy val config = new SparkConf()
 lazy val context = new SparkContext
}
// Then in my state mapping fuction:
val parallelizedData = Spark.context.parallelize(trainingData)