如何从多个kafka主题中读取数据并比较数据对象

时间:2018-02-12 09:54:47

标签: scala apache-spark apache-kafka spark-streaming

我想从两个主题中读取数据(一个用于现有应用程序主题,第二个用于具有性能优化的相同应用程序) 并在性能优化后测量数据是否相同。

我的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)
  1. 或者创建单个流并从两个主题中读取数据并进行比较
  2. 为了比较,我们需要使用任何窗口函数,bcz优化后kafka主题收到数据 比以前的申请更频繁。 或者还有其他机制可以比较两个对象吗?

    流程图。

    1. 应用程序==>卡夫卡主题(t1) 2.Optimized Application ==> Kafka主题(t2)
  3. 预期流程图     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中代码的工作原理? 我需要进行任何代码更改。请建议

0 个答案:

没有答案