2016-07-01 2 views
2

Мы очень простой Спарк 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 (т. Е. Масштабируемость имеет решающее значение для нас).

+0

Ваш прецедент делает полный перетасовка данных в файле reduceByKey, который, я полагаю, становится все более и более дорогим, когда вы масштабируете свой кластер. По крайней мере, глобальная производительность ограничивается производительностью одного худшего исполнения исполнителя, что может только ухудшиться при добавлении исполнителей. Можете ли вы попытаться использовать секвенсор Kafka, чтобы иметь все сообщения для данного идентификатора в одном разделе? Думаю, это должно позволить почти линейную шкалу. – C4stor

+1

Сколько серверов kafka у вас есть в кластере? Есть ли у вас настройка репликации разделов между ними? –

+0

В число факторов входит много разных факторов.Сколько разделов имеет ваш кластер Kafka? Насколько велика ваша контрольная точка? –

ответ

3

Мы решили это путем:

  • увеличения пропускной способности Кафка кластера
    • более мощность процессора - увеличено количество узлов для Кафки (1 Кафка узла за 2 искру exectur узлы, казалась, штраф)
    • больше брокеров - в основном 1 брокер за исполнитель дали нам лучшие результаты
  • настройки правильные параллельно по умолчанию ism (количество ядер в кластере * 2)
  • обеспечение всех узлов будет иметь ок. такое же количество работы
    • размер партии/BLOCKSIZE должна быть ~ равна или кратна числу исполнителей

В конце концов, мы смогли достичь 1 100 000 событий/обработанный искровым кластером с 10 узлами-исполнителями. Кроме того, настройка позволила повысить производительность при конфигурациях с меньшим количеством узлов -> мы достигли практически линейной масштабируемости при масштабировании от 2 до 10 узлов-исполнителей (m4.xlarge на AWS).

В начале процессор на узле Kafka не приближался к лимитам, однако он не смог ответить на требования исполнителей Spark.

Thnx для всех предложений, особенно для @ArturBiesiadowski, который предположил, что кластер Kafka неверный размер.

Смежные вопросы