Spark通过json文件中的块处理rdd块并发布到Kafka主题

时间:2017-05-19 06:53:56

标签: scala apache-spark rdd

我是Spark&的新手斯卡拉。我要求从s3位置处理多个json文件。这些数据基本上是批量数据,可以在以后的某个时间保留用于重新加载。现在我的spark工作应该处理这些文件,它应该选择5个原始json记录并且应该向Kafka主题发送消息。选择5条记录的原因是kafka主题同时处理同一主题的实时和批量数据。所以批处理不应该延迟实时处理。

我需要按顺序处理整个json文件,因此我一次只能选择5条记录并向kafka发送消息并选择json文件的下5条记录等等......

我编写了一段代码,可以从json文件中读取并将其发布到kafka主题。

        val jsonRDD = sc.textFile(s3Location)

        var count = 0

        val buf = new StringBuilder

        jsonRDD.collect().foreach(line => {
            count += 1
                    buf ++= line
                    if (count > 5) {
                        println(s"Printing 5 jsons $buf")
                        count = 0
                        buf.setLength(0)
                        SendMessagetoKakfaTopic(buf) // psuedo cod for sending message to kafkatopic 
                        Thread.sleep(10000)
                    }
        })
        if (buf != null) {
            println(s"Printing remaining jsons $buf")
            SendMessagetoKakfaTopic(buf)
        }

我相信在Spark中有一种更有效的JSON处理方式。

此外,我还应该寻找任何其他参数,如内存,资源等。因为数据可能会超过100年的演出。

1 个答案:

答案 0 :(得分:0)

这似乎是Spark Streaming或(推荐)Spark Structured Streaming的情况。

在任何一种情况下,您都会监视目录并在每个批处理间隔处理新文件(可配置)。

您可以使用<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>(使用通配符)或SparkContext.textFile来处理它。在任何一种情况下,您最终都会以SparkContext.wholeTextFiles结束以表示JSON文件中的行(每个JSON文件一行)。

如果您的要求是按顺序处理文件,按5行块处理5行块,则可以使用RDD[String]使转换管道更有效:

  

RDD.toLocalIterator

     

返回包含此RDD中所有元素的迭代器。迭代器将消耗与此RDD中最大分区一样多的内存。

请参阅RDD API。

使用Iterator个JSON,您可以使用5个元素toLocalIterator: Iterator[T]

这会给你非常有效的管道。

我再一次强烈建议在Structured Streaming + Kafka Integration Guide (Kafka broker version 0.10.0 or higher)中阅读结构化流媒体(它关于阅读,但也支持写作)。