tutorial spark kafka data apache-spark rdd spark-streaming

apache-spark - kafka - spark streaming twitter



¿Cómo actualizar un RDD? (2)

Estamos desarrollando el marco Spark en el que estamos trasladando datos históricos a conjuntos RDD.

Básicamente, el RDD es inmutable, solo lee el conjunto de datos en el que hacemos operaciones. En base a eso, hemos trasladado datos históricos a RDD y hacemos cálculos como filtrado / mapeo, etc. en dichos RDD.

Ahora hay un caso de uso donde un subconjunto de los datos en el RDD se actualiza y tenemos que recalcular los valores.

HistoricalData tiene forma de RDD. Creo otro RDD basado en el alcance de la solicitud y guardo la referencia de ese RDD en una ScopeCollection

Hasta ahora he podido pensar en enfoques a continuación:

Método1: transmitir el cambio:

  1. Para cada solicitud de cambio, mi servidor busca el RDD específico del alcance y genera un trabajo
  2. En un trabajo, aplique una fase de mapa en ese RDD -

    2.a. para cada nodo en el RDD haga una búsqueda en la transmisión y cree un nuevo valor que esté actualizado, creando así un nuevo RDD
    2.b. ahora hago todos los cálculos nuevamente en este nuevo RDD en el paso2.a. como multiplicación, reducción, etc.
    2.c. Guardo esta referencia RDDs en mi ScopeCollection

Approach2: crea un RDD para las actualizaciones

  1. Para cada solicitud de cambio, mi servidor busca el RDD específico del alcance y genera un trabajo
  2. En cada RDD, únase con el nuevo RDD que tiene cambios
  3. ahora hago todos los cálculos nuevamente en este nuevo RDD en el paso 2 como multiplicación, reducción, etc.

Enfoque 3:

Pensé en crear RDD de transmisión continuando con la actualización del mismo RDD y haciendo recálculos. Pero, por lo que yo entiendo, puede tomar transmisiones de Flume o Kafka. Mientras que en mi caso los valores se generan en la propia aplicación en función de la interacción del usuario. Por lo tanto, no puedo ver ningún punto de integración de transmisión de RDD en mi contexto.

Cualquier sugerencia sobre qué enfoque es mejor o cualquier otro enfoque adecuado para este escenario.

TIA!


El caso de uso presentado aquí es una buena coincidencia para Spark Streaming. Las otras dos opciones llevan la pregunta: "¿Cómo presentas un recálculo del RDD?"

Spark Streaming ofrece un marco para enviar trabajos continuamente a Spark en función de un flujo de datos entrantes y preservar esos datos en formato RDD. Kafka y Flume son solo dos posibles fuentes de Stream.

Puede usar la comunicación de Socket con SocketInputDStream , leer archivos en un directorio usando FileInputDStream o incluso usar la cola compartida con QueueInputDStream . Si ninguna de esas opciones se ajusta a su aplicación, podría escribir su propia InputDStream .

En este caso de uso, utilizando Spark Streaming, leerá su RDD base y usará el flujo entrante para transformar los datos existentes y mantener un estado en evolución en memoria. dstream.transform le permitirá combinar el RDD base con los datos recopilados durante un intervalo de lote dado, mientras que la operación updateStateByKey podría ayudarlo a construir un estado en memoria dirigido por claves. Consulte la documentación para obtener más información.

Sin más detalles sobre la aplicación es difícil subir al nivel del código sobre lo que es posible con Spark Streaming. Te sugiero que explores este camino y hagas nuevas preguntas para cualquier tema específico.


Sugiero echar un vistazo a la implementación de IndexedRDD , que proporciona RDD actualizable de pares clave de valores. Eso podría darte algunas ideas.

La idea se basa en el conocimiento de la clave y le permite comprimir el fragmento actualizado de datos con las mismas claves del RDD ya creado. Durante la actualización, es posible filtrar la versión anterior de los datos.

Al tener datos históricos, diría que tiene que tener un tipo de identidad de un evento.

Con respecto a la transmisión y el consumo, es posible usar el puerto TCP. De esta forma, el controlador puede abrir una conexión TCP que espera leer de allí y envía actualizaciones allí.