Мы очень простой Спарк Streaming работа (реализована в Java), который:Кафка + Спарк масштабируемость
- чтение JSONs из Кафки через DirectStream (ACKs на сообщения Кафки отключены)
- разборе JSONs в POJO (с использованием GSON - наши сообщения только ~ 300 байт)
- отображающие POJO для кортежа ключ-значение (значение = объекта)
- reduceByKey (выборочная уменьшить функцию - всегда сравнивая 1 поле - качество - от объектов и оставляет экземпляр объекта более качественным)
- сохраняет результат в состоянии (с помощью mapWithState сохраняет объект с высоким качеством на ключ)
- сохранение результата в HDFS
В JSONs генерируются с множеством 1000 идентификаторов (ключей) и всех событий случайным образом распределяются по разделам разделов Kafka. Это также означает, что результирующий набор объектов не превышает 1000, поскольку задание хранит только объект с самым высоким качеством для каждого идентификатора.
Мы были запущены тесты производительности на AWS ОГО (m4.xlarge = 4 ядра, 16 Гб памяти) со следующими параметрами:
- числа исполнителей = числом узлов (т.е. 1 исполнителя на узел)
- количество разделов Кафки = число узлов (то есть в нашем случае также исполнители)
- размер партии = 10 (с)
- скользящего окна = 20 (с)
- размер окна = 600 (с)
- размер блока = 2000 (мс)
- по умолчанию параллелизм - пробовал разные настройки, однако лучшие результаты получать, когда параллелизм по умолчанию = количество узлов/исполнителях
Кафка кластер содержит только 1 брокера, который используется до максимума ~ 30-40% во время пиковой нагрузки (мы предварительно заполняем данные по теме, а затем независимо выполняем тест). Мы попытались увеличить число num.io.threads и num.network.threads, но без значительного улучшения.
Затем он результатами тестов производительности (около 10 минут непрерывной нагрузки) были (мастер ПРЯЖИ и узлы драйверов находятся на вершине графов узлов сильфонный):
- 2 - узлы, способных обрабатывать макс.150 000 событий/с без какой-либо задержки обработки
- 5 узлов - 280 000 событий/с =>25% штрафных по сравнению с ожидать "почти линейной масштабируемости"
- 10 узлов - 380 000 событий/с =>50% штраф по сравнению с ожидаемым «почти линейной масштабируемости» использование
ЦП в случае 2 узлов был ~
Мы также играли вокруг других настроек, включая: - тестирование низкое/высокое число разделов - тестирование низкого/высокого/стандартного значения по умолчаниюParallelism - тестирование с большим количеством исполнителей (т. разделить ресурсы, например. 30 исполнителей вместо 10) , но приведенные выше настройки дали нам наилучшие результаты.
Итак - вопрос - это Kafka + Spark (почти) линейно масштабируемый? Если он должен быть масштабируемым намного лучше, чем показали наши тесты - как его можно улучшить. Наша цель - поддерживать сотни/тысячи исполнителей Spark (т. Е. Масштабируемость имеет решающее значение для нас).
Ваш прецедент делает полный перетасовка данных в файле reduceByKey, который, я полагаю, становится все более и более дорогим, когда вы масштабируете свой кластер. По крайней мере, глобальная производительность ограничивается производительностью одного худшего исполнения исполнителя, что может только ухудшиться при добавлении исполнителей. Можете ли вы попытаться использовать секвенсор Kafka, чтобы иметь все сообщения для данного идентификатора в одном разделе? Думаю, это должно позволить почти линейную шкалу. – C4stor
Сколько серверов kafka у вас есть в кластере? Есть ли у вас настройка репликации разделов между ними? –
В число факторов входит много разных факторов.Сколько разделов имеет ваш кластер Kafka? Насколько велика ваша контрольная точка? –