Я разработал потоковое потоковое воспроизведение (подход с приемником), которое считывает данные из kafka, обрабатывает данные и записывает их вasticsearch.
Тот же код был разработан в 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)
}
// ниже объединения улучшает производительность в соответствии с документацией по искру 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).
Из-за этой низкой производительности партии накапливаются и увеличиваются задержки в пакетном планировании.