SparkStreaming:阅读Kafka Stream并将其作为RDD提供,以便进一步处理

时间:2017-06-19 08:46:11

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

我目前有以下设置:

应用程序将数据写入Kafka - > SparkStreaming读取存储的数据(总是从最早的条目读取)并转换到流 - >应用程序需要此结果的RDD来训练mllib模型。

我想基本上实现与https://github.com/keiraqz/anomaly-detection类似的东西 - 但我的数据不是来自文件,而是来自kafka,需要在Spark中进行一些重新处理以从输入中提取训练数据。

读取数据并在流中处理它没有问题。但是将它提供给主线程进行进一步处理根本不起作用。

流是否有一种简单的方法可以在一段时间内使用数据,将此时读取的所有内容写入某种数据结构,然后使用此数据结构进行进一步处理?

我到目前为止尝试的是在流之外设置RDD,然后使用:

    spanDurationVectorStream.foreachRDD { rdd => 
      if(rdd.count()==0){
        flag = 1
      }
      bufferRdd.union(rdd)

     }

    Logger.getRootLogger.setLevel(rootLoggerLevel)
    ssc.start()

    while (flag == 0) {
      Thread.sleep(1)
    }
      Thread.sleep(1)

然而,缓冲区中没有添加任何东西 - 它仍然是我需要初始化它的单个条目。

我正在使用scala 2.11

在版本2.1.1上运行所有需要的Spark库

如果您需要任何进一步的信息,我会尽我所能为您提供所需的一切。

非常感谢任何帮助。

编辑: 快速总结@maasg的惊人提示 - 当他给我接受它们作为答案的可能性时,我会高兴地这样做:

第一:要解决RDD问题,可以将代码更改为以下内容:

spanDurationVectorStream.foreachRDD { rdd => 
      if(rdd.count()==0){
        flag = 1
      }
      bufferRdd = bufferRdd.union(rdd)

     }

    Logger.getRootLogger.setLevel(rootLoggerLevel)
    ssc.start()

    while (flag == 0) {

    }

由于RDD是不可变的,每个rdd.union将返回一个必须保存的新RDD(How history RDDs are preserved for further use in the given code)。 Thread.sleep(1)电话完全没必要。通过此设置,我可以使用RDD来训练模型。

然而@maasg补充说他会建议培训场景不要使用Spark Streaming,而是使用Read Kafka topic in a Spark batch job

中描述的基本Spark

目前我唯一不清楚的是如何有效地获取最早和最新的偏移量,以便在执行时接收存储在Kafka中的完整内容。

0 个答案:

没有答案