Spark Streaming Cache和Transformations

时间:2014-10-20 06:21:34

标签: apache-spark spark-streaming

我是新手,我正在使用Kafka的Spark流媒体..

我的流媒体时长是1秒。

假设第一批获得100条记录,第二批获得120条记录,第三批获得80条记录

--> {sec 1   1,2,...100} --> {sec 2 1,2..120} --> {sec 3 1,2,..80}

我在第一批中应用我的逻辑并得到一个结果=> RESULT1

我想在处理第二批时使用result1,并将第二批的result1和120记录的组合结果作为=> RESULT2

我尝试缓存结果但是我无法在2s中获得缓存的result1 可能吗?或者说明如何实现我的目标?

 JavaPairReceiverInputDStream<String, String> messages =   KafkaUtils.createStream(jssc, String.class,String.class, StringDecoder.class,StringDecoder.class, kafkaParams, topicMap, StorageLevel.MEMORY_AND_DISK_SER_2());

我处理消息并查找结果为1秒的单词。

if(resultCp!=null){
                resultCp.print();
                result = resultCp.union(words.mapValues(new Sum()));

            }else{
                result = words.mapValues(new Sum());
            }

 resultCp =  result.cache();

当在第二批时,resultCp不应为null但它返回null值,所以在任何给定时间我只有那个特定的秒数据我想找到累积结果。有谁知道怎么做..

我了解到,一旦火花流开始jssc.start(),控制就不再是我们的结果,而是火花。那么是否可以将第一批结果发送到第二批以找到累计值?

非常感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找updateStateByKey,它通过将累积函数应用于提供的DStream和某些状态来创建新的DStream。 Spark示例包中的示例涵盖了问题中的案例:

首先,您需要一个更新函数,它接受新值和先前已知的值:

val updateFunc = (values: Seq[Int], state: Option[Int]) => {
  val currentCount = values.sum

  val previousCount = state.getOrElse(0)

  Some(currentCount + previousCount)
}

该函数用于创建一个Dstream,用于从源dstream中累积值。像这样:

// Create a NetworkInputDStream on target ip:port and count the
// words in input stream of \n delimited test (eg. generated by 'nc')
val lines = ssc.socketTextStream(args(0), args(1).toInt)
val words = lines.flatMap(_.split(" "))
val wordDstream = words.map(x => (x, 1))

// Update the cumulative count using updateStateByKey
// This will give a Dstream made of state (which is the cumulative count of the words)
val stateDstream = wordDstream.updateStateByKey[Int](updateFunc) 

来源:https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/streaming/StatefulNetworkWordCount.scala