При искровом потоке каждый пакетный интервал данных всегда генерирует один и только один RDD, почему мы используем foreachRDD()
для foreach RDD? RDD - это только один, не требуется.
В моем тестировании я никогда больше не вижу RDD.
Что означает функция DStream.foreachRDD?
Ответ 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 будет распространять работу через баристы, чтобы мы могли распараллелить кофе и ускорить подачу кофе.