我想从两个主题中读取数据(一个用于现有应用程序主题,第二个用于具有性能优化的相同应用程序) 并在性能优化后测量数据是否相同。
我的Kafka主题包含
形式的数据case class Json(id: String, event: String,ingestion_ts: Long, data: Map[String, String])
处理工作正在Spark Streaming中进行。 1.创建两个流作业并使用join
比较数据是否是个好主意val windowedStream1 = stream1.window(Seconds(30))
val windowedStream2 = stream2.window(Minutes(1))
val joinedStream = windowedStream1.join(windowedStream2)
为了比较,我们需要使用任何窗口函数,bcz优化后kafka主题收到数据 比以前的申请更频繁。 或者还有其他机制可以比较两个对象吗?
流程图。
预期流程图 3. kafka主题(t1,t2)=> Spark Streaming(Data Comparision)=> HDFS
我在这里遵循了选项2,代码如下。
message1.foreachRDD(rdd => {
var af = new HashSet[JsonOnj]
var af2 = new HashSet[JsonOnj]
val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
rdd.foreachPartition(iter => {
val offsets = offsetRanges(TaskContext.getPartitionId())
if (offsets.topic.equalsIgnoreCase("myTopic2")) {
iter.foreach(x => {
af += jsonParser(x._2)
})
} else {
iter.foreach(x => {
af2 += jsonParser(x._2)
})
}
})
if (af.size == af2.size)
log.info(s":: :: :: $af.isEmpty :::: $af2.isEmpty :: " + af.sameElements(af2))
else
log.info(s"########:: :: :: count does not match" + af.size + " " + af2.size)
}
})
在foreachPartition下的上面代码中,我可以将Json解析对象添加到HashSet中。 虽然在foreachPartition中我已经将解析的对象添加到可变集(两个kafka主题各一个),并且foreachPartition外部是空的。
我无法理解foreachRDD中代码的工作原理? 我需要进行任何代码更改。请建议