Я просматриваю учебные материалы по Flink от dataArtisans и по какой-то причине, когда попадаю в файл примера PopularPlacesFromKafka.scala Я не получаю вывод на стандартный вывод.

...
// find popular places
val popularSpots = rides
  // match ride to grid cell and event type (start or end)
  .map(new GridCellMatcher)
  // partition by cell id and event type
  .keyBy( k => k )
  // build sliding window
  .timeWindow(Time.minutes(15), Time.minutes(5))
  // count events in window
  .apply{ (key: (Int, Boolean), window, vals, out: Collector[(Int, Long, Boolean, Int)]) =>
    out.collect( (key._1, window.getEnd, key._2, vals.size) )
  }

// print result on stdout
    popularSpots.print()
...

Я подтвердил, что данные извлекаются из Kafka нормально, и, кажется, что-то происходит, когда он пытается выполнить операцию timeWindow, но я не получаю вывод. Если я удалю операцию timeWindow, я увижу вывод данных keyBy. Есть ли что-то очевидное, чего мне не хватает?

1
AJC 19 Сен 2017 в 20:51

3 ответа

Лучший ответ

В случае, если у кого-то есть такая же проблема, это была моя проблема.

В моей теме kafka было несколько разделов, но я производил все тестовые данные в один раздел (0), как только у меня было> 1 потребителей Kafka, все потребители, кроме одного, назначенного разделу 0, не получают никаких данных, и, следовательно, отсутствие отправки водяных знаков по цепочке операторов - это приводит к тому, что оконные функции перестают излучать данные (именно поэтому в этих ситуациях он отлично работает с ProcessingTime). Вот соответствующая JIRA об этом:

https://issues.apache.org/jira/browse/FLINK-5479

1
AJC 9 Ноя 2017 в 16:15

Вы настроили соответствующее ускорение для источника? По умолчанию (без коэффициента ускорения) источник эмулирует исходные данные, то есть он генерирует записи с той же скоростью, с которой они были изначально созданы. Это означает, что получение 1 минуты данных занимает 1 минуту.

Оператор окна агрегирует каждые 5 минут последние 15 минут данных. Следовательно, потребуется 5 минут, пока оператор окна выдаст первый результат.

Если вы установите коэффициент ускорения 600, вы получите 10 минут данных за 1 секунду.

1
Fabian Hueske 19 Сен 2017 в 22:03

В целом, есть несколько причин, по которым задание Flink может не дать никакого результата, но очень распространенная причина связана с водяными знаками. Часы времени события Flink активируются только при достижении текущего водяного знака, и поэтому без водяных знаков окно времени события никогда не сработает.

В случае тренировочных упражнений Flink источники поездки на такси производят для вас водяные знаки. Но теперь, когда вы вместо этого работаете с источником Kafka, вам нужно будет реализовать экстрактор меток времени и генератор водяных знаков, а затем вызвать assignTimestampsAndWatermarks в своем потоке (см. документация ). BoundedOutOfOrdernessTimestampExtractor, где задержка соответствует задержке, настроенной заданием, записанным в Kafka, будет работать хорошо.

0
David Anderson 20 Сен 2017 в 07:35