Это 8-й день моего участия в августовском испытании обновлений, узнайте подробности события:Испытание августовского обновления
текст
Ранее в этой колонке мы представили Вы можете использовать окно для подсчета числовой статистики за каждый период времени или количество фрагментов данных.
Пожалуйста, обратитесь к этому моему блогу -Статья для понимания окна Flink
Но есть и другая проблема, а именно, как решить проблему, если данные задерживаются.Например, окно определено для подсчета каждые пять минут.Мы должны считать результирующее значение данных с 9:00 утра до 9:05 утра, но из-за сетевой задержки определенного фрагмента данных время генерации данных составляет 9:03, а данные достигают нашего фреймворка flink в 10:03 Как решить эту проблему?
Другой пример: Оригинальный журнал выглядит следующим образом: логировать время
2020-10-10 10:00:01,134 INFO executor.Executor: Finished task in state 0.0
Данные поступают во время кадра flink: Время ввода этих данных во Flink: 2020-10-10 20:00:00,102 Данные обрабатываются окном window: Время обработки окна: 2020-10-10 20:00:01,100
Кто такие три брата Времени?
Чтобы решить эту проблему, при обработке в реальном времени flink планирует время в данных на следующие три типа. По времени в потоковых данных его можно разделить на следующие три типа.
Время события: время создания события, которое обычно описывается временной меткой в событии.
Время приема: время, когда событие попало в Flink.
Время обработки: Текущее системное время, когда событие было обработано.
Время события относится к точке во времени, когда фактически генерируется часть данных, и время обработки относится к точке времени, когда архитектура системы, которая обрабатывает данные, фактически получает данные.
1. Подробное объяснение событий времени
- Время генерации события, существующее до входа во Flink, можно извлечь из поля события.
- Необходимо указать, как генерируются водяные знаки.
- Преимущества: детерминированные, неупорядоченные, задержка или воспроизведение данных и т. д. могут давать правильные результаты.
- Слабые стороны: производительность и задержка снижаются при работе с нестандартными событиями.
2. Время приема
- Время входа события в flink, то есть время текущей системы, полученное в источнике, которое единообразно используется для последующих операций.
- Не нужно указывать, как генерируются водяные знаки (генерируются автоматически)
- Слабые стороны: не может обрабатывать неупорядоченные события и задержанные данные.
3. Время обработки
- Текущее системное время машины, выполняющей операцию (разное для каждого оператора)
- Не требуется координации между потоками и машинами
- Преимущества: Лучшая производительность и минимальная задержка
- Слабость: Неопределенность, на которую легко влияют различные факторы (скорость генерации событий, скорость достижения flink, скорость передачи между операторами и т. д.), вне зависимости от порядка и задержки
4. Всестороннее сравнение трех времен
Производительность: ProcessingTime > IngestTime > EventTime. Задержка: ProcessingTime IngestTime > ProcessingTime.
5. Как установить тип времени
Когда мы создаем StreamExecutionEnvironment, мы можем установить тип времени. Если мы не установим тип времени, по умолчанию будет processingTime. Если тип времени установлен на eventTime, мы должны явно указать Timestamp Assigner & Watermark Generator после нашего источника.
// 设置时间特性
val environment: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
// 不设置Time 类型,默认是processingTime。
// 如果使用EventTime则需要在source之后明确指定Timestamp Assigner & Watermark Generator
environment.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)