我已经使用带有状态函数的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)"
答案 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