Что происходит внутри, когда мы соединяем два DStream, сгруппированных по ключам?

Я новичок в искре (потоковая передача искр в Python), и, если я правильно понял, DStream - это последовательность RDD.

Представьте, что в нашем коде есть:

ssc = StreamingContext(sc, 5)

Таким образом, каждые 5 секунд создается объект DSTream, который представляет собой последовательность RDD.

Представьте, что у меня есть два DStreams DS1 и DS2 (каждый по 5 секунд). Мой код:

DGS1 = DS1.groupByKey()
DGS2 = DS2.groupByKey()
FinalStream = DS1.join(DS2)

Что происходит внутри, когда я вызываю groupByKey и Join (на уровне RDD)?

Спасибо !


person Aimene Belfodil    schedule 16.03.2016    source источник


Ответы (1)


Когда вы используете groupByKey и join, вы вызываете перемешивание. Картинка для иллюстрации:

Перемешивание данных

Предположим, у вас есть поток входящих RDD (называемых DStream), которые являются кортежами String, Int. Вы хотите сгруппировать их по ключу (это слово в этом примере). Но все ключи не доступны локально в одном и том же исполнителе, они потенциально распределены между многими рабочими, которые ранее выполняли работу над указанным RDD.

Теперь искра должна сказать: «Привет, ребята, теперь мне нужны все ключи, значения которых равны X, чтобы перейти к рабочему 1, и все ключи, значения которых равны Y, чтобы перейти к рабочему 2 и т. Д.», Чтобы вы могли иметь все значения данного ключа в одном рабочем узле, который затем может продолжить работу над каждым RDD, который теперь имеет тип (String, Iterator[Int]) как причину группировки.

Соединение похоже по своему поведению на groupByKey, поскольку оно должно иметь все ключи, доступные для сравнения каждых двух потоков ключей RDD.

За кулисами Spark должен сделать несколько вещей, чтобы это сработало:

  • Перераспределение данных: поскольку все ключи могут быть недоступны для одного рабочего.
  • Сериализация / десериализация и сжатие данных: поскольку Spark должен потенциально передавать данные между узлами, они должны быть сериализованы, а затем десериализованы.
  • Дисковый ввод-вывод: как причина перетасовки, поскольку один рабочий может не иметь возможности хранить все данные в памяти.

Для получения дополнительной информации см. это введение в перемешивание.

person Yuval Itzchakov    schedule 17.03.2016
comment
Спасибо за это объяснение. Я неправильно понял тот факт, что DStream можно рассматривать как один RDD в момент t. У меня есть еще один вопрос: знаете ли вы, скоро ли mapWithState будет реализован в Python (PySpark). Он был представлен здесь databricks.com/blog/2016/02/01/ - person Aimene Belfodil; 17.03.2016
comment
@AimeneBelfodil Я не знаю. Хорошим местом, чтобы спросить, был бы список пользователей Apache Spark. - person Yuval Itzchakov; 17.03.2016
comment
Я пытаюсь подписаться на список пользователей, но безуспешно @Yuval Haha - person Aimene Belfodil; 17.03.2016