我开发了Spark Streaming(River方法),该方法从kafka读取数据并处理数据并写入elasticsearch。
相同的代码是用Java开发的(现在我们正在用spark scala编写相同的代码),当与Java性能进行比较时,spark效果不佳。
我观察到的是,当我们写ES时,需要花费时间。
这是我的高级代码:
val kafkaStreams: util.List[DStream[String]] = new util.ArrayList[DStream[String]]
for(i <- 0 until topic_threads){
var data = KafkaUtils.createStream(ssc,kafkaConf,topic).map(line => line._2)
kafkaStreams.add(data)
}
//下面的union改善了spark 1.6.2的性能 文档
val unifiedStream = ssc.union(kafkaStreams)
unifiedStream.persist(StorageLevel.MEMORY_ONLY)
if(flagY){
val dataES = unifiedStream.map(rdd => processData(rdd))
dataES.foreachRDD(rdd => {
ElasticUtils.saveToEs(rdd, index_Name, index_Type)
})
在processData方法中,我只是解析来自kafka的红色数据。
任何人都可以让我知道您的经验或建议,以改善火花蒸汽(scala)接收器进近性能。
由于性能低下,批次堆积起来,并且批次调度中的延迟增加。