我是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年的演出。
答案 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)中阅读结构化流媒体(它关于阅读,但也支持写作)。