如何在Spark Streaming中构建查找映射?

时间:2015-10-12 19:08:58

标签: apache-spark spark-streaming

在火花流应用程序中维护应用程序状态的最佳方法是什么?

我知道两种方式:

  1. 使用“Union”操作附加到查找RDD并在每次联合后保留它。
  2. 将状态保存在文件或数据库中,并在每个批处理的开头加载它。
  3. 我的问题是从绩效角度来看哪一个更好?另外,有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

您应该按照以下方式使用mapWithState(spec: StateSpec[K, V, StateType, MappedType])

import org.apache.spark.streaming.{ StreamingContext, Seconds }
val ssc = new StreamingContext(sc, batchDuration = Seconds(5))

// checkpointing is mandatory
ssc.checkpoint("_checkpoints")

val rdd = sc.parallelize(0 to 9).map(n => (n, n % 2 toString))
import org.apache.spark.streaming.dstream.ConstantInputDStream
val sessions = new ConstantInputDStream(ssc, rdd)

import org.apache.spark.streaming.{State, StateSpec, Time}
val updateState = (batchTime: Time, key: Int, value: Option[String], state: State[Int]) => {
  println(s">>> batchTime = $batchTime")
  println(s">>> key       = $key")
  println(s">>> value     = $value")
  println(s">>> state     = $state")
  val sum = value.getOrElse("").size + state.getOption.getOrElse(0)
  state.update(sum)
  Some((key, value, sum)) // mapped value
}
val spec = StateSpec.function(updateState)
val mappedStatefulStream = sessions.mapWithState(spec)

mappedStatefulStream.print()