我目前正在编写Spark Streaming。我的任务非常简单,只需从kafka接收json消息并进行一些文本过滤(包含TEXT1,TEXT2,TEXT3,TEXT4)。代码如下:
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
ssc, kafkaParams, topics)
messages.foreachRDD { rdd =>
val originrdd = rdd.count()
val record = rdd.map(_._2).filter(x=>x.contains(TEXT1)).filter( x=>x.contains(TEXT2)).filter(x=>x.contains(TEXT3)).filter(x=>x.contains(TEXT4))
val afterrdd = record.count()
println("original number of record: ", originrdd)
println("after filtering number of records:", afterrdd)
}
每个JSON消息大约4 kb,每1秒大约50000条来自Kafka的记录。
对于上述任务,每个批次的处理时间需要3秒,因此无法实现实时性能。我有同样的任务风暴,它执行得更快。
答案 0 :(得分:1)
嗯,你在这个过程中做了3个不必要的RDD。
val record = rdd.map(_._2).filter(x => {
x.contains(TEXT1) &&
x.contains(TEXT2) &&
x.contains(TEXT3) &&
x.contains(TEXT4)
}
另外,值得一读。 https://spark.apache.org/docs/latest/streaming-programming-guide.html#performance-tuning