Hola colegas Le recordamos que no hace mucho tiempo publicamos un
libro sobre Spark , y ahora mismo un
libro sobre Kafka est谩 siendo revisado.
Esperamos que estos libros tengan el 茅xito suficiente para continuar con el tema, por ejemplo, para la traducci贸n y publicaci贸n de literatura sobre Spark Streaming. Quer铆amos ofrecerle una traducci贸n sobre la integraci贸n de esta tecnolog铆a con Kafka hoy.
1. Justificaci贸nApache Kafka + Spark Streaming es una de las mejores combinaciones para crear aplicaciones en tiempo real. En este art铆culo, discutiremos en detalle los detalles de dicha integraci贸n. Adem谩s, veremos un ejemplo con Spark Streaming-Kafka. Luego discutimos el "enfoque del destinatario" y la opci贸n de integraci贸n directa de Kafka y Spark Streaming. Entonces, comencemos a integrar Kafka y Spark Streaming.
2. Integraci贸n de Kafka y Spark StreamingAl integrar Apache Kafka y Spark Streaming, hay dos enfoques posibles para configurar Spark Streaming para recibir datos de Kafka, es decir, dos enfoques para integrar Kafka y Spark Streaming. En primer lugar, puede usar Destinatarios y la API de Kafka de alto nivel. El segundo enfoque (m谩s nuevo) es trabajar sin destinatarios. Existen diferentes modelos de programaci贸n para ambos enfoques, que difieren, por ejemplo, en t茅rminos de rendimiento y garant铆as sem谩nticas.

Consideremos estos enfoques con m谩s detalle.
a. Enfoque basado en el destinatarioEn este caso, el destinatario proporciona la recepci贸n de datos. Entonces, utilizando la API de consumo de alto nivel proporcionada por Kafka, implementamos el Destinatario. Adem谩s, los datos recibidos se almacenan en Spark Artists. Luego, se inician trabajos en Kafka - Spark Streaming, dentro de los cuales se procesan los datos.
Sin embargo, cuando se utiliza este enfoque, el riesgo de p茅rdida de datos en caso de falla (con la configuraci贸n predeterminada) permanece. En consecuencia, ser谩 necesario incluir adicionalmente un registro de escritura anticipada en Kafka - Spark Streaming para eliminar la p茅rdida de datos. Por lo tanto, todos los datos recibidos de Kafka se almacenan sincr贸nicamente en el registro de escritura anticipada en un sistema de archivos distribuido. Es por eso que, incluso despu茅s de una falla del sistema, todos los datos se pueden restaurar.
A continuaci贸n, veremos c贸mo utilizar este enfoque con destinatarios en una aplicaci贸n con Kafka - Spark Streaming.
yo. VinculanteAhora conectaremos nuestra aplicaci贸n de transmisi贸n con el siguiente artefacto para aplicaciones Scala / Java, usaremos las definiciones de proyecto para SBT / Maven.
groupId = org.apache.spark artifactId = spark-streaming-kafka-0-8_2.11 version = 2.2.0
Sin embargo, al implementar nuestra aplicaci贸n, tendremos que agregar la biblioteca antes mencionada y sus dependencias, esto ser谩 necesario para las aplicaciones Python.
ii. ProgramacionLuego, cree una
DStream
entrada
DStream
importando
KafkaUtils
en el c贸digo de la aplicaci贸n de secuencia:
import org.apache.spark.streaming.kafka._ val kafkaStream = KafkaUtils.createStream(streamingContext, [ZK quorum], [consumer group id], [per-topic number of Kafka partitions to consume])
Adem谩s, utilizando las opciones de createStream, puede especificar clases clave y clases de valor, as铆 como las clases correspondientes para su decodificaci贸n.
iii) DespliegueComo con cualquier aplicaci贸n Spark, el comando spark-submit se usa para iniciar. Sin embargo, los detalles son ligeramente diferentes en las aplicaciones Scala / Java y en las aplicaciones Python.
Adem谩s, con
鈥損ackages
puede agregar
spark-streaming-Kafka-0-8_2.11
y sus dependencias directamente a
spark-submit
, esto es 煤til para aplicaciones Python donde es imposible administrar proyectos usando SBT / Maven.
./bin/spark-submit --packages org.apache.spark:spark-streaming-kafka-0-8_2.11:2.2.0 ...
Tambi茅n puede descargar el archivo JAR del
spark-streaming-Kafka-0-8-assembly
del artefacto Maven
spark-streaming-Kafka-0-8-assembly
desde el repositorio de Maven. Luego agr茅guelo a
spark-submit
con -
jars
.
b. Enfoque directo (sin destinatarios)Despu茅s del enfoque utilizando destinatarios, se desarroll贸 un enfoque m谩s nuevo, el "directo". Proporciona garant铆as confiables de extremo a extremo. En este caso, peri贸dicamente le preguntamos a Kafka sobre las compensaciones de las compensaciones para cada tema / secci贸n, y no organizamos la entrega de datos a trav茅s de los destinatarios. Adem谩s, se determina el tama帽o del fragmento de lectura, esto es necesario para el procesamiento correcto de cada paquete. Finalmente, se usa una API de consumo simple para leer rangos con datos de Kafka con los desplazamientos dados, especialmente cuando se inician los trabajos de procesamiento de datos. Todo el proceso es como leer archivos de un sistema de archivos.
Nota: Esta caracter铆stica apareci贸 en Spark 1.3 para Scala y la API de Java, as铆 como en Spark 1.4 para la API de Python.
Ahora analicemos c贸mo aplicar este enfoque en nuestra aplicaci贸n de transmisi贸n.
La API del consumidor se describe con m谩s detalle en el siguiente enlace:
Apache Kafka Consumer | Ejemplos de Kafka Consumeryo. Vinculante
Es cierto que este enfoque solo es compatible con aplicaciones Scala / Java. Con el siguiente artefacto, construya el proyecto SBT / Maven.
groupId = org.apache.spark artifactId = spark-streaming-kafka-0-8_2.11 version = 2.2.0
ii. ProgramacionA continuaci贸n, importe KafkaUtils y cree un
DStream
entrada en el c贸digo de la aplicaci贸n de transmisi贸n:
import org.apache.spark.streaming.kafka._ val directKafkaStream = KafkaUtils.createDirectStream[ [key class], [value class], [key decoder class], [value decoder class] ]( streamingContext, [map of Kafka parameters], [set of topics to consume])
En los par谩metros de Kafka, deber谩 especificar
metadata.broker.list
o
bootstrap.servers
. Por lo tanto, de manera predeterminada, consumiremos datos a partir del 煤ltimo desplazamiento en cada secci贸n de Kafka. Sin embargo, si desea que la lectura comience desde el fragmento m谩s peque帽o, entonces en los par谩metros de Kafka debe establecer la opci贸n de configuraci贸n
auto.offset.reset
.
Adem谩s, trabajando con las opciones
KafkaUtils.createDirectStream
, puede comenzar a leer desde un desplazamiento arbitrario. Luego haremos lo siguiente, que nos permitir谩 acceder a los fragmentos de Kafka consumidos en cada paquete.
Si queremos organizar el monitoreo de Kafka basado en Zookeeper utilizando herramientas especiales, podemos actualizar Zookeeper nosotros mismos con su ayuda.
iii) DespliegueEl proceso de implementaci贸n en este caso se asemeja al proceso de implementaci贸n en la variante con el destinatario.
3. Los beneficios de un enfoque directoEl segundo enfoque para integrar Spark Streaming con Kafka supera al primero por las siguientes razones:
a. Simultaneidad Simult谩neaEn este caso, no necesita crear muchas secuencias de entrada de Kafka y combinarlas. Sin embargo, Kafka - Spark Streaming crear谩 tantos segmentos de RDD como segmentos de Kafka para consumo. Todos estos datos de Kafka se leer谩n en paralelo. Por lo tanto, podemos decir que tendremos una correspondencia uno a uno entre los segmentos de Kafka y RDD, y ese modelo es m谩s comprensible y m谩s f谩cil de configurar.
b. EfectividadPara eliminar por completo la p茅rdida de datos durante el primer enfoque, la informaci贸n deb铆a almacenarse en un registro de registros principales y luego replicarse. De hecho, esto es ineficiente porque los datos se replican dos veces: la primera vez por el propio Kafka y la segunda por el registro de escritura anticipada. En el segundo enfoque, este problema se elimina, ya que no hay destinatario y, por lo tanto, no se necesita un diario de escritura l铆der. Si tenemos un almacenamiento de datos suficientemente largo en Kafka, puede recuperar mensajes directamente desde Kafka.
s Sem谩ntica de una sola vezB谩sicamente, utilizamos la API Kafka de alto nivel en el primer enfoque para almacenar fragmentos de lectura consumidos en Zookeeper. Sin embargo, esta es la costumbre de consumir datos de Kafka. Si bien la p茅rdida de datos se puede eliminar de manera confiable, existe una peque帽a posibilidad de que, en algunos casos, los registros individuales se consuman dos veces. El punto es la inconsistencia entre el mecanismo confiable de transferencia de datos en Kafka - Spark Streaming y la lectura de fragmentos que ocurre en Zookeeper. Por lo tanto, en el segundo enfoque, usamos la API Kafka simple, que no requiere recurrir a Zookeeper. Aqu铆, los fragmentos le铆dos se rastrean en Kafka - Spark Streaming, para esto, se utilizan puntos de control. En este caso, se elimina la inconsistencia entre Spark Streaming y Zookeeper / Kafka.
Por lo tanto, incluso en caso de fallas, Spark Streaming recibe cada registro estrictamente una vez. Aqu铆 debemos asegurarnos de que nuestra operaci贸n de salida, en la que los datos se almacenan en almacenamiento externo, sea idempotente o una transacci贸n at贸mica en la que se almacenan tanto los resultados como las compensaciones. As铆 es como se logra exactamente la sem谩ntica en la derivaci贸n de nuestros resultados.
Aunque, hay un inconveniente: las compensaciones en Zookeeper no se actualizan. Por lo tanto, las herramientas de monitoreo de Kafka basadas en Zookeeper no le permiten seguir el progreso.
Sin embargo, todav铆a podemos referirnos a las compensaciones, si el procesamiento se organiza de esta manera: recurrimos a cada paquete y actualizamos Zookeeper nosotros mismos.
Eso es todo lo que quer铆amos hablar sobre la integraci贸n de Apache Kafka y Spark Streaming. Esperamos que lo hayas disfrutado.