Я настроил конвейер для входящих событий из потока в Apache Kafka.
Spark подключается к Kafka, получает поток из темы и обрабатывает некоторые "простые" задачи агрегирования.
Поскольку я пытаюсь создать сервис, который должен иметь низкое время ожидания обновления (менее 1 секунды), я создал простое потоковое приложение Spark в Scala.
val windowing = events.window(Seconds(30), Seconds(1))
val spark = SparkSession
.builder()
.appName("Main Processor")
.getOrCreate()
import spark.implicits._
// Go into RDD of DStream
windowing.foreachRDD(rdd => {
// Convert RDD of JSON into DataFrame
val df = spark.read.json(rdd)
// Process only if received DataFrame is not empty
if (!df.head(1).isEmpty) {
// Create a view for Spark SQL
val rdf = df.select("user_id", "page_url")
rdf.createOrReplaceTempView("currentView")
val countDF = spark.sql("select count(distinct user_id) as sessions from currentView")
countDF.show()
}
Это работает, как и ожидалось.На данный момент я беспокоюсь о производительности.Spark работает на сервере Ubuntu с четырьмя процессорами для тестирования.
Загрузка ЦП постоянно составляет около 35%.Мне интересно, если поступающие данные из потока, скажем, 500 мсг / с, как изменится загрузка ЦП?Будет ли это расти эксп.или линейным образом?
Если бы вы могли поделиться своим опытом с Apache Spark в такой ситуации, я был бы признателен.
Последний открытый вопрос: если я установлю интервал скользящего окна на500 мс (как я хотел бы) это взорвется?Я имею в виду, кажется, что функции потоковой передачи Spark являются новыми, и архитектура пакетной обработки может быть ограничением в обработке данных в реальном времени, не так ли?