#apache-flink #flink-streaming
#apache-flink #flink-потоковая передача
Вопрос:
В настоящее время я использую FsStateBackend для проверки состояния. Я использую интервал 10 секунд, как показано ниже. Но я вижу, что стоимость пакета передачи, который использует checkpoint, составляет примерно 20 долларов в день, а стоимость aws transfer s3: 0,005 доллара за 1000 запросов => (я использую ~ 4000000 запросов / день @@). У меня есть 7 заданий, которые:
- 6 заданий с использованием интервала контрольных точек = 10000 (мс)
- 1 задание с использованием интервала контрольных точек = 1000 (мс)
И запустите flink на AWS EMR. Средний размер состояния для каждой контрольной точки от (8 КБ -> 30 М). Что произошло за контрольной точкой?
// set up checkpoint
env.enableCheckpointing(1000 or 10000);
// advanced options:
// make sure 500 ms of progress happen between checkpoints
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
// checkpoints have to complete within one minute, or are discarded
// env.getCheckpointConfig().setCheckpointTimeout(60000);
// allow only one checkpoint to be in progress at the same time
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
// enable externalized checkpoints which are retained after job cancellation
env.getCheckpointConfig().enableExternalizedCheckpoints(
CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
// folder to checkpoint
StateBackend backend = new FsStateBackend(checkpointPath, true);
env.setStateBackend(backend);
Ответ №1:
Какую реализацию S3 вы используете для контрольной точки? Это имеет большое значение.
Хотя вы должны использовать реализацию hadoop для S3 с StreamingFileSink
, это может быть плохим выбором для контрольной точки. Hadoop S3 FS пытается имитировать файловую систему поверх S3:
- перед записью ключа он проверяет, существует ли «родительский каталог», проверяя наличие ключа с префиксом до последнего «/»
- он создает пустые файлы-маркеры, чтобы отметить существование такого родительского каталога
- все эти запросы «существования» являются дорогостоящими запросами S3 HEAD
В результате у Hadoop S3 FS очень высокая задержка «создания файла», и он быстро сталкивается с ограничениями скорости запросов (у запросов HEAD очень низкие ограничения скорости запросов на S3).
Presto S3 не пытается творить эту магию; он просто выполняет операции PUT / GET без всего остального. Поскольку контрольная точка Flink не предполагает ничего большего, она более эффективна и последовательна.
Кроме того, с Hadoop S3 вы можете столкнуться с ситуацией, когда вы не выполняете операции восстановления, потому что похоже, что файла состояния там нет (запрос HEAD приводит к ложному кэшированию в балансировщике нагрузки S3). Только через некоторое время файл будет виден, и только тогда восстановление будет успешным.
Однако обратите внимание, что существуют также проблемы с использованием Presto S3 для контрольных точек. См. FLINK-24392. Ни одна из реализаций не идеальна.
Можно, кстати, использовать как версию hadoop для приемника, так и версию presto для контрольных точек. В этом случае вы должны явно использовать s3a:// в качестве схемы для приемника (Hadoop) и s3p:// для контрольной точки (Вуаля).
Комментарии:
1. О, я использую s3://, я думаю, что это hadoop S3 FS. Если я переключусь на опцию Presto, это повлияет на производительность?
2. Вы должны увидеть улучшение производительности и снижение стоимости, поскольку больше не будут выполняться лишние запросы HEAD.
3. Я попробую. Спасибо за вашу поддержку!
4. @DavidAnderson Если я использую S3 в качестве точки сохранения, что я должен использовать для точки сохранения при использовании s3a:// для приемника? Все еще s3p:// или не имеет значения для точки сохранения?
5. Обе реализации hadoop и presto S3 имеют свои проблемы — см. FLINK-24392 о проблемах с Presto. Я бы, вероятно, сначала попробовал hadoop для сохранения точек.