使用Spark流媒体(1.6)我有一个文件流,用于读取批量大小为2的查找数据,但文件只在每小时复制到目录。
一旦有了新文件,它的内容就会被流读取,这就是我想要缓存到内存中的内容并保留在那里
直到读取新文件。
我想要加入此数据集的另一个流,因此我想要缓存。
这是Batch lookup data for Spark streaming的后续问题
答案确实可以与updateStateByKey
一起使用但是我不知道如何处理KV对时的情况
从查找文件中删除,因为updateStateByKey
中的值序列不断增长。
此外,任何提示如何使用mapWithState
都会很棒。
这是我到目前为止所尝试的内容,但数据似乎并未持久存在:
val dictionaryStream = ssc.textFileStream("/my/dir")
dictionaryStream.foreachRDD{x =>
if (!x.partitions.isEmpty) {
x.unpersist(true)
x.persist()
}
}
答案 0 :(得分:1)
DStreams
可以使用persist
方法直接保留,该方法会保留流中的每个RDD:
dictionaryStream.persist
根据the official documentation自动申请
基于窗口的操作,例如
reduceByWindow
和reduceByKeyAndWindow
以及基于状态的操作,例如updateStateByKey
所以在你的情况下不需要显式缓存。也没有必要手动unpersisting。再次引用the docs:
默认情况下,DStream转换生成的所有输入数据和持久RDD都会自动清除
并根据管道中使用的转换自动调整保留期。
关于mapWithState
,您必须提供StateSpec
。最小的示例需要一个函数,该函数需要key
,Option
当前value
和之前的状态。假设您有DStream[(String, Long)]
并且您想要记录到目前为止的最大值:
val state = StateSpec.function(
(key: String, current: Option[Double], state: State[Double]) => {
val max = Math.max(
current.getOrElse(Double.MinValue),
state.getOption.getOrElse(Double.MinValue)
)
state.update(max)
(key, max)
}
)
val inputStream: DStream[(String, Double)] = ???
inputStream.mapWithState(state).print()
还可以提供初始状态,超时间隔和捕获当前批处理时间。最后两个可用于实现在一段时间内未更新的密钥的删除策略。