Spark Streaming状态除了在内存中之外还要保存到磁盘

时间:2016-11-03 04:17:19

标签: scala apache-spark spark-streaming

我已经使用带有状态函数的map来编写一个使用spark streaming的程序,该函数检测重复记录并避免这些记录。该函数类似于下面:

val trackStateFunc1 = (batchTime: Time, 
                       key: String,  
                       value: Option[(String,String)],
                       state: State[Long]) => {
  if (state.isTimingOut()) {
    None
  }
  else if (state.exists()) None
  else {
    state.update(1L)
    Some(value.get)
  }
}

val stateSpec1 = StateSpec.function(trackStateFunc1)
//.initialState(initialRDD)
.numPartitions(100)
.timeout(Minutes(30*24*60)) 

我的记录数量可能很高,我保留了大约一个月的时间。因此,记录和键的数量可能很高..我想知道我是否可以将这些状态保存在磁盘上除了Memory ...之类的东西 " RDD.persist(StorageLevel.MEMORY_AND_DISK_SER)"

2 个答案:

答案 0 :(得分:0)

  

我想知道我是否可以将这些状态保存在磁盘上除了   存储器

Spark中的有状态流自动被序列化为持久存储,这称为checkpointing。运行有状态DStream时,必须提供检查点目录,否则图形将无法在运行时执行。

您可以通过DStream.checkpoint设置检查点间隔。例如,如果要将其设置为每30秒:

inputDStream
 .mapWithState(trackStateFunc)
 .checkpoint(Seconds(30))

答案 1 :(得分:0)

根据“MapWithState”来源,您可以尝试:

mapWithStateDS.dependencies.head.persist(StorageLevel.MEMORY_AND_DISK)

实际适用于 spark 3.0.1