Насколько хорош параллелизм потоковых систем обработки? - PullRequest
0 голосов
/ 29 июня 2019

Учтите, что мы собираемся вычислить среднее число датчиков температуры за данный период времени, и это вычисление будет выполнено параллельно с использованием SPE. Обычно это вычисление выполняется как минимум четырьмя UDF:

map -> keyBy -> window -> aggregate

Если мой оператор keyBy отвечает за получение идентификатора каждого датчика, и у меня есть только 2 датчика, параллелизма 2 достаточно для моего приложения (отказ от ответственности: я не хочу учитывать, насколько велико окно или кортежи, которые должны быть в памяти на данный момент). Если у меня 1000 датчиков, было бы очень приятно увеличить параллельность. Скажем, до 100 узлов. Но что, если мой параллелизм установлен на 100, и я обрабатываю кортежи только из 2 датчиков. Буду ли я иметь 98 бездействующих узлов? Знают ли Spark, Flink или Storm, что им не нужно перетасовывать данные на 98 узлов?

Мотивация для моего вопроса - это другой вопрос.

  • Какое приложение и сценарий можно реализовать, который показывает, что текущие потоковые процессоры (Storm, Flink, Spark) не знают, как оптимизировать параллелизм внутри, чтобы перетасовать меньше данных по сети?
  • Могут ли они предсказать какую-либо характеристику объема или разновидности данных? или ресурсы под капотом?

Спасибо

1 Ответ

1 голос
/ 29 июня 2019

Суть из keyBy() состоит в том, чтобы распределять предметы с одним и тем же ключом одному и тому же оператору. Если у вас есть 2 ключа, ваши элементы буквально разделяются на 2 группы, и ваш максимальный параллелизм для этого потока равен 2. Элементы с ключом A будут отправлены одному оператору, а элементы с ключом B будут отправлены другому оператору. .

В Flink, если вы хотите просто распределить обработку ваших элементов среди всех параллельных операторов, вы можете использовать DataStream :: shuffle () .

...