Spark流的批量查找数据

时间:2016-05-25 20:51:26

标签: scala apache-spark spark-streaming

我需要从HDFS上的文件中查找Spark-streaming作业中的一些数据 批处理作业每天提取一次此数据 这样的任务是否有“设计模式”?

  • 如何在as后立即重新加载内存中的数据(hashmap) 每日更新?
  • 此查找数据为
    时,如何连续提供流式传输作业 被抓了?

1 个答案:

答案 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)

虽然从性能的角度来看这可能不是最优的,但它利用已经存在的架构,使您无需手动处理失效或故障恢复。