web-dev-qa-db-fra.com

Quelle est la signification de la fonction DStream.foreachRDD?

Dans spark streaming, chaque intervalle de lots de données génère toujours un et un seul RDD, pourquoi utilisons-nous foreachRDD() pour foreach RDD? RDD est un seul, inutile foreach Dans mes tests, je n'en vois jamais plus d'un RDD.

24
Guo

Un DStream ou "flux discrétisé" est une abstraction qui divise un flux continu de données en petits morceaux. C'est ce qu'on appelle le "microbatching". Chaque microbatch devient un RDD qui est donné à Spark pour un traitement ultérieur. Il y a un et un seul RDD produit pour chaque DStream à chaque intervalle de lot.

Un RDD est une collection distribuée de données. Considérez-le comme un ensemble de pointeurs vers l'emplacement des données réelles dans un cluster.

DStream.foreachRDD est un "opérateur de sortie" dans Spark Streaming. Il vous permet d'accéder aux RDD sous-jacents du DStream pour exécuter des actions qui font quelque chose de pratique avec les données. Par exemple, en utilisant foreachRDD vous pouvez écrire des données dans une base de données.

Le petit tour de l'esprit ici est de comprendre qu'un DStream est une collection limitée dans le temps. Permettez-moi de comparer cela avec une collection classique: prenez une liste d'utilisateurs et appliquez-y un foreach:

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

Cela appliquera la fonction d'effet secondaire doSomeSideEffect à chaque élément de la collection userList.

Maintenant, disons que nous ne connaissons pas tous les utilisateurs maintenant, donc nous ne pouvons pas en créer une liste. Au lieu de cela, nous avons un flux d'utilisateurs, comme des personnes arrivant dans un café pendant la ruée vers le matin:

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

Notez que:

  • les DStream.foreachRDD vous donne un RDD[User], pas un seul utilisateur. Pour revenir à notre exemple de café, c'est la collection d'utilisateurs qui sont arrivés pendant un certain intervalle de temps.
  • pour accéder à des éléments uniques de la collection, nous devons continuer à opérer sur le RDD. Dans ce cas, j'utilise un rdd.foreach pour servir du café à chaque utilisateur.

Penser à l'exécution: nous pourrions avoir un groupe de baristas faisant du café. Ce sont nos exécuteurs testamentaires. Spark Le streaming s'occupe de faire un petit lot d'utilisateurs (ou de commandes) et Spark répartira le travail entre les baristas, afin que nous puissions paralléliser le café faire et accélérer le service de café.

46
maasg