spark que overview kafka example ejemplo apache-spark spark-streaming

apache spark - que - ¿Cuál es el significado de la función DStream.foreachRDD?



spark streaming overview (1)

Un DStream o "flujo discretizado" es una abstracción que rompe un flujo continuo de datos en pequeños fragmentos. Esto se llama "microbatching". Cada microbatch se convierte en un RDD que se entrega a Spark para su posterior procesamiento. Hay un solo RDD producido para cada DStream en cada intervalo de lote.

Un RDD es una colección distribuida de datos. Piense en ello como un conjunto de indicadores hacia donde se encuentran los datos reales en un clúster.

DStream.foreachRDD es un "operador de salida" en Spark Streaming. Le permite acceder a los RDDs subyacentes de DStream para ejecutar acciones que hacen algo práctico con los datos. Por ejemplo, utilizando foreachRDD puede escribir datos en una base de datos.

El pequeño giro mental aquí es entender que un DStream es una colección con límite de tiempo. Permítame contrastar esto con una colección clásica: tome una lista de usuarios y aplíquele un foreach:

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

Esto aplicará la función de efecto secundario doSomeSideEffect a cada elemento de la colección userList .

Ahora, digamos que no conocemos a todos los usuarios ahora, por lo que no podemos crear una lista de ellos. En cambio, tenemos un flujo de usuarios, como personas que llegan a una cafetería durante las horas de la mañana:

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

Tenga en cuenta que:

  • DStream.foreachRDD le brinda un RDD[User] , no un solo usuario . Volviendo a nuestro ejemplo de café, esa es la colección de usuarios que llegaron durante algún intervalo de tiempo.
  • Para acceder a elementos individuales de la colección, necesitamos seguir operando en el RDD. En este caso, estoy usando un rdd.foreach para servir café a cada usuario.

Para pensar en la ejecución: podríamos tener un grupo de baristas haciendo café. Esos son nuestros ejecutores. Spark Streaming se encarga de hacer un pequeño lote de usuarios (o pedidos) y Spark distribuirá el trabajo entre los baristas, de modo que podamos paralelizar la preparación del café y acelerar la porción del café.

En la transmisión de chispas, cada intervalo de lotes de datos siempre genera uno y solo un RDD, ¿por qué usamos foreachRDD() para foreach RDD? RDD es solo uno, no es necesario para cada uno. En mis pruebas, nunca veo RDD más de uno.