Потоковая обработка данных и нано второе разрешение
Я только начинаю тему фреймворков обработки потоковых данных в реальном времени, и у меня есть вопрос, на который я до сих пор не смог найти окончательного ответа:
Поддерживают ли обычные подозреваемые (Apache's Spark, Kafka, Storm, Flink и т. Д.) Обработку данных с разрешением времени события наносекунд (или даже пикосекунд)?
Большинство людей и документация говорят о разрешении в миллисекундах или микросекундах, но я не смог найти однозначного ответа, если будет возможно большее разрешение или проблема. Единственная инфраструктура, на которую я полагаю, имеет такую возможность, - это структура Kapacitor от infxData, так как их база данных TSDB effxDB, похоже, хранит временные метки с наносекундным разрешением.
Может ли кто-нибудь здесь предложить некоторое понимание этого или даже некоторые информированные факты? Альтернативные решения / структуры, предлагающие эту возможность?
Все будет высоко ценится!
Спасибо и всего наилучшего,
Саймон
Предыстория моего вопроса: я работаю в среде с целым рядом запатентованных реализаций для хранения и обработки данных и думаю о некоторой организации / оптимизации в настоящее время. Мы проводим эксперименты по физике плазмы с множеством различных диагностических / измерительных систем с различной частотой дискретизации, в настоящее время до "выше гигабайтных выборок в секунду". Один общий факт / предположение в наших системах заключается в том, что каждый образец имеет записанное время события в наносекундном разрешении. При попытке использовать установленную потоковую (или также пакетную) среду обработки, мы должны будем сохранить это разрешение метки времени. Или пойти еще дальше, поскольку мы недавно нарушили порог 1 Gsps в некоторых системах. Отсюда и мой вопрос.
2 ответа
В случае, если это не ясно, вы должны знать разницу между временем события и временем обработки:
event time - время генерации события у источника
время обработки - время выполнения события в обработчике
src: Flink docs
AFAIK Storm не поддерживает время события, а Spark имеет ограниченную поддержку. Это оставляет Kafka Streams и Flink для рассмотрения.
Flink использует длинный тип для отметок времени. В документах упоминается, что это значение указано в миллисекундах с 1970-01-01T00:00:00Z, но AFAIK, когда вы используете временную характеристику события, единственным показателем прогресса являются временные метки события. Итак, если вы можете вписать свои значения в дальний диапазон, то это должно быть выполнимо.
редактировать:
Обычно водяные знаки (основанные на временных метках) используются для измерения хода времени события в окнах, триггерах и т. Д. Итак, если вы используете:
Затем AssignerWithPeriodicWatermarks генерирует новый водяной знак в интервалах, определенных в config (интервал автоматической пометки) во временной области обработки, даже когда используется характеристика времени события. Подробнее см. Например
org.apache.flink.streaming.runtime.operators.TimestampsAndPeriodicWatermarksOperator#open()
метод, где регистрируется таймер времени обработки. Так, если autowatermark установлен на 500 мс, то каждые 500 мс времени обработки (как взято изSystem.currentTimeMillis()
) новый водяной знак испускается, но отметка времени водяного знака основана на отметке времени от событий.AssignerWithPunctuatedWatermarks, то лучшее описание можно найти в документах для
org.apache.flink.streaming.api.datastream.DataStream#assignTimestampsAndWatermarks(org.apache.flink.streaming.api.functions.AssignerWithPunctuatedWatermarks<T>)
:
Назначает временные метки для элементов в потоке данных и создает водяные знаки, чтобы сигнализировать о прогрессе времени события на основе самих элементов.
Этот метод создает водяные знаки исключительно на основе элементов потока. Для каждого элемента, который обрабатывается с помощью
AssignerWithPunctuatedWatermarks#extractTimestamp(Object, long)
,AssignerWithPunctuatedWatermarks#checkAndGetNextWatermark(Object, long)
вызывается метод и генерируется новый водяной знак, если возвращенное значение водяного знака неотрицательно и больше, чем предыдущий водяной знак.Этот метод полезен, когда поток данных встраивает элементы водяного знака или некоторые элементы содержат маркер, который можно использовать для определения текущего водяного знака времени события. Эта операция дает программисту полный контроль над созданием водяного знака. Пользователи должны знать, что слишком агрессивное создание водяных знаков (то есть создание сотен водяных знаков каждую секунду) может стоить некоторой производительности.
Чтобы понять, как работают водяные знаки, это чтение настоятельно рекомендуется: Тайлер Акидау на Streaming 102
В то время как Kafka Streams использует миллисекундное разрешение, время выполнения на самом деле является своего рода агностиком. В конце концов, это просто долго.
Сказав это, "проблема" является определение временного окна. Если вы укажете временное окно в 1 минуту, но разрешение вашей временной метки будет меньше миллисекунды, ваше окно будет меньше 1 минуты. В качестве обходного пути вы можете увеличить окно, например, на 1000 минут или 1 000 000 минут для микро / нано-секундного разрешения.
Другая "проблема" заключается в том, что брокеры понимают разрешение только в миллисекундах, и на этом основано время удержания. Таким образом, вам нужно было бы установить гораздо большее время хранения, чтобы "обмануть" посредника и избежать слишком раннего удаления данных.