在Spark Streaming中使用Java对有序火花流进行迭代编程?

时间:2015-06-17 23:40:15

标签: java apache-spark spark-streaming

是否存在火花流以保持数据跨越排序dstream的多个微批,其中流使用时间戳排序? (假设单调到达数据) 任何人都可以就如何在迭代中保留数据提出建议,其中每次迭代都是在JavaDStream中处理的RDD吗?

迭代意味着什么?

我首先使用时间戳对dstream进行排序,假设数据已经以单调递增的时间戳(没有乱序)到达。

我需要一个全局HashMap X,我希望使用带有时间戳" t1"的值来更新,然后随后" t1 + 1"。由于X的状态本身影响计算,因此它需要是线性操作。因此在" t1 + 1"取决于HashMap X,它依赖于" t1"之前和之后的数据。

应用

当一个人试图更新模型或比较两组RDD时,或者保留某些事件的全局历史记录等会影响未来迭代中的操作时,尤其如此?

我想保留一些累积的历史来进行计算..而不是整个数据集,但是可以保留某些可以在将来的DStream RDD中使用的事件?

1 个答案:

答案 0 :(得分:1)

UpdateStateByKey正是这样做的:它使您能够定义一些状态,以及根据流中的每个RDD更新它的函数。这是随时间累积历史计算的典型方法。

来自doc:

  

updateStateByKey操作允许您在使用新信息不断更新时保持任意状态。要使用它,您必须执行两个步骤。

     
      
  1. 定义状态 - 状态可以是任意数据类型。
  2.   
  3. 定义状态更新功能 - 使用函数指定如何使用先前状态和输入流中的新值更新状态。
  4.   

更多信息: https://spark.apache.org/docs/1.4.0/streaming-programming-guide.html#updatestatebykey-operation

如果这没有削减它或者你需要更多的灵活性,你总是可以像Cassandra那样显式地存储到键值存储(参见Cassandra连接器:https://github.com/datastax/spark-cassandra-connector),尽管这个选项通常较慢,因为它系统地涉及每次查询时的网络传输..