我需要从HDFS上的文件中查找Spark-streaming作业中的一些数据 批处理作业每天提取一次此数据 这样的任务是否有“设计模式”?
答案 0 :(得分:2)
一种可能的方法是删除本地数据结构并改为使用有状态流。让我们假设您有一个名为mainStream
的主数据流:
val mainStream: DStream[T] = ???
接下来,您可以创建另一个读取数据的流:
val lookupStream: DStream[(K, V)] = ???
和一个可用于更新状态的简单函数
def update(
current: Seq[V], // A sequence of values for a given key in the current batch
prev: Option[V] // Value for a given key from in the previous state
): Option[V] = {
current
.headOption // If current batch is not empty take first element
.orElse(prev) // If it is empty (None) take previous state
}
这两件可用于创建状态:
val state = lookup.updateStateByKey(update)
剩下的所有内容都是按键mainStream
并连接数据:
def toPair(t: T): (K, T) = ???
mainStream.map(toPair).leftOuterJoin(state)
虽然从性能的角度来看这可能不是最优的,但它利用已经存在的架构,使您无需手动处理失效或故障恢复。