2016-06-29 2 views
4

У меня есть приложение для потоковой передачи, которое потребляет сообщения кафки. И я хочу обработать все сообщения, приходящие последние 10 минут вместе. Похоже, есть два подхода, чтобы сделать работу:Spark streaming: пакетный интервал против окна

val ssc = new StreamingContext(new SparkConf(), Minutes(10)) 
val dstream = .... 

и

val ssc = new StreamingContext(new SparkConf(), Seconds(1)) 
val dstream = .... 
dstream.window(Minutes(10), Minutes(10)) 

, и я просто хочу, чтобы выяснить, есть ли разница в производительности между ними

+2

Вы можете сделать быстрый тест и узнать! Но, поскольку «val ssc = новый StreamingContext (новый SparkConf(), Minutes (10))« доза обработки один раз в 10 минут, это будет лучше всего с точки зрения обработки. Версия окна создаст задание, чтобы получать последнюю информацию от kafka каждые 1 сек и суммировать каждые 10 минут !!! – rakesh

ответ

4

Иногда нам нужно знать, что произошло за последние n секунд каждые m секунд. В качестве простого примера предположим, что интервал между партиями составляет 10 секунд, и нам нужно знать, что произошло за последние 60 секунд каждые 30 секунд. Здесь 60 секунд называется длиной окна и интервалом 30 секунд слайдов. Предположим, что первые 6 партий - это A, B, C, D, E, F, которые являются частью первого окна. Через 30 секунд появится второе окно, которое будет иметь D, E, F, G, H, I. Как вы можете видеть, между первым и вторым окнами распространены 3 партии.

Одна вещь, о которой нужно помнить о окне, это то, что Spark удерживает все окно в памяти. В первом окне он будет комбинировать RDD A с F с помощью оператора union для создания одного большого RDD. Он будет занимать 6-кратную память, и это нормально, если это вам нужно. В некоторых случаях, хотя вам может потребоваться перенос какой-либо государственной партии в пакет. Это может быть выполнено с помощью updateStateByKey.