Подтвердить что ты не робот

Что означает функция DStream.foreachRDD?

При искровом потоке каждый пакетный интервал данных всегда генерирует один и только один RDD, почему мы используем foreachRDD() для foreach RDD? RDD - это только один, не требуется. В моем тестировании я никогда больше не вижу RDD.

4b9b3361

Ответ 1

A DStream или "дискретизированный поток" представляет собой абстракцию, которая прерывает непрерывный поток данных на небольшие куски. Это называется "микрообработка". Каждая микропакета становится RDD, которая предоставляется Spark для дальнейшей обработки. Там один и только один RDD, созданный для каждого DStream за каждый интервал пакета.

RDD - это распределенный сбор данных. Подумайте об этом как о наборе указателей на то, где фактические данные находятся в кластере.

DStream.foreachRDD является "оператором вывода" в Spark Streaming. Он позволяет получить доступ к базовым RDD файлам DStream для выполнения действий, которые делают что-то практическое с данными. Например, используя foreachRDD, вы можете записать данные в базу данных.

Маленький поворот ума заключается в том, чтобы понять, что DStream представляет собой сборник по времени. Позвольте мне сравнить это с классической коллекцией: возьмите список пользователей и примените foreach к нему:

val userList: List[User] = ???
userList.foreach{user => doSomeSideEffect(user)}

Это применит функцию side-effecting doSomeSideEffect к каждому элементу коллекции userList.

Теперь скажем, что мы не знаем всех пользователей сейчас, поэтому мы не можем создать список из них. Вместо этого у нас есть поток пользователей, таких как люди, прибывающие в кафе во время утренней спешки:

val userDStream: DStream[User] = ???
userDstream.foreachRDD{usersRDD => 
    usersRDD.foreach{user => serveCoffee(user)}
}

Обратите внимание, что:

  • DStream.foreachRDD предоставляет RDD[User], не один пользователь. Возвращаясь к нашему примеру с кофе, это коллекция пользователей, которые прибыли в течение некоторого промежутка времени.
  • для доступа к отдельным элементам коллекции нам необходимо дополнительно работать с RDD. В этом случае я использую rdd.foreach для подачи кофе каждому пользователю.

Чтобы подумать о выполнении: у нас может быть кластер баристов, делающих кофе. Это наши исполнители. Spark Streaming заботится о том, чтобы сделать небольшую партию пользователей (или заказов), и Spark будет распространять работу через баристы, чтобы мы могли распараллелить кофе и ускорить подачу кофе.