Spark流:在批次

时间:2016-05-31 15:38:31

标签: scala apache-spark spark-streaming

使用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()
  }
}

1 个答案:

答案 0 :(得分:1)

DStreams可以使用persist方法直接保留,该方法会保留流中的每个RDD:

dictionaryStream.persist

根据the official documentation自动申请

  

基于窗口的操作,例如reduceByWindowreduceByKeyAndWindow以及基于状态的操作,例如updateStateByKey

所以在你的情况下不需要显式缓存。也没有必要手动unpersisting。再次引用the docs

  

默认情况下,DStream转换生成的所有输入数据和持久RDD都会自动清除

并根据管道中使用的转换自动调整保留期。

关于mapWithState,您必须提供StateSpec。最小的示例需要一个函数,该函数需要keyOption当前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()

还可以提供初始状态,超时间隔和捕获当前批处理时间。最后两个可用于实现在一段时间内未更新的密钥的删除策略。