在Spark Streaming中使用updateStateByKey()从原始事件流

时间:2015-08-19 06:43:52

标签: apache-spark spark-streaming

当我遇到updateStateByKey()函数时,我刚刚开始寻找使用Spark Streaming进行有状态计算的解决方案。

我试图解决的问题: 10,000个传感器每分钟产生一个二进制值。

如果传感器报告的连续值彼此不同,我想将其标记并将其作为状态更改事件发送给Kafka。

我的假设是在这个例子中可以使用updateStateByKey(),但是我并不完全了解推荐的实现方法。

2 个答案:

答案 0 :(得分:1)

我假设您将从传感器获取(String,Int)对的流,其中String是传感器的ID,Int是传感器返回的二进制值。有了这个假设,你可以尝试这样的事情:

val sensorData: DStream[(String, Int)] = ???

val state = sensorData.updateStateByKey[(String, Int)](updateFunction _)

def updateFunction(newValues: Seq[(String, Int)], currentValues: Seq[(String, Int)]) = {
    val newValuesMap = newValues.toMap
    val currentValuesMap = currentValues.toMap

    currentValuesMap.keys.foreach ( (id) =>
            if(currrentValuesMap.get(id) != newValuesMap.getOrElse(id, -1)) {
                //send to Kafka
            }
    )       
    Some(newValues)
}

答案 1 :(得分:0)

有没有办法管理国家的生活/资源?或者它一直在增长?

例如在this sessionization example中,州会永远长大吗?有没有办法管理它,所以你可以清除/存档3个月只有汇总数据?