Apache Kafka es una plataforma de transmisión distribuida de código abierto para canalizaciones de datos en tiempo real y la integración de datos. Proporciona un sistema de transmisión eficiente y escalable para usar en una variedad de aplicaciones, incluidas las siguientes:
- Analítica en tiempo real
- Procesamiento de transmisión
- Agregación de registros
- Mensajería distribuida
- Transmisión de eventos
Objetivos
Instala Kafka en un clúster de alta disponibilidad de Managed Service para Apache Spark con ZooKeeper (en este instructivo, se lo denomina "clúster de Managed Service para Apache Spark Kafka").
Crea datos de clientes ficticios y, luego, publícalos en un tema de Kafka.
Crea tablas de Hive Parquet y ORC en Cloud Storage para recibir datos de temas de Kafka transmitidos.
Envía un trabajo de PySpark para suscribirte al tema de Kafka y transmitirlo a Cloud Storage en formato Parquet y ORC.
Ejecuta una consulta en los datos de la tabla de Hive transmitidos para contar los mensajes de Kafka transmitidos.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto,
usa la calculadora de precios.
Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.
Antes de comenzar
Si aún no lo hiciste, crea un proyecto Google Cloud .
- Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en cr��ditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc, Compute Engine, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc, Compute Engine, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.- En la consola de Google Cloud , ve a la página Buckets de Cloud Storage.
- Haz clic en Crear.
- En la página Crear un bucket, ingresa la información de tu bucket. Para ir al paso siguiente, haz clic en Continuar.
-
En la sección Primeros pasos, haz lo siguiente:
- Ingresa un nombre único a nivel global que cumpla con los requisitos de nombre de los buckets.
- Para agregar una
etiqueta de bucket,
expande la sección Etiquetas (),
haz clic en add_box
Agregar etiqueta y especifica una
keyy unvaluepara tu etiqueta.
-
En la sección Elige dónde almacenar tus datos, haz lo siguiente:
- Selecciona un tipo de ubicación
- Elige una ubicación en la que se almacenen de forma permanente los datos de tu bucket en el menú desplegable Tipo de ubicación.
- Si seleccionas el tipo de ubicación birregional, también puedes habilitar la replicación turbo con la casilla de verificación correspondiente.
- Para configurar la replicación bucket buckets, selecciona
Agregar replicación entre bucket a través del Servicio de transferencia de almacenamiento y
sigue estos pasos:
Configura la replicación entre buckets
- En el menú Bucket, selecciona un bucket.
En la sección Configuración de replicación, haz clic en Configurar para configurar los parámetros del trabajo de replicación.
Aparecerá el panel Configurar la replicación entre buckets.
- Para filtrar los objetos que se replicarán por prefijo de nombre de objeto, ingresa un prefijo con el que quieras incluir o excluir objetos y, luego, haz clic en Agregar un prefijo.
- Para establecer una clase de almacenamiento para los objetos replicados, selecciona una clase de almacenamiento en el menú Clase de almacenamiento. Si omites este paso, los objetos replicados usarán la clase de almacenamiento del bucket de destino de forma predeterminada.
- Haz clic en Listo.
-
En la sección Elige cómo almacenar tus datos, haz lo siguiente:
- Selecciona una clase de almacenamiento predeterminada para el bucket o Autoclass para la administración automática de clases de almacenamiento de los datos de tu bucket.
- Para habilitar el espacio de nombres jerárquico, en la sección Optimizar el almacenamiento para cargas de trabajo con uso intensivo de datos, selecciona Habilitar el espacio de nombres jerárquico en este bucket.
- En la sección Elige cómo controlar el acceso a los objetos, selecciona si tu bucket aplica o no la prevención del acceso público y elige un método de control de acceso para los objetos del bucket.
-
En la sección Elige cómo proteger los datos de objetos, haz lo siguiente:
- Selecciona cualquiera de las opciones de Protección de datos que
desees configurar para tu bucket.
- Para habilitar la eliminación no definitiva, haz clic en la casilla de verificación Política de eliminación no definitiva (para la recuperación de datos) y especifica la cantidad de días que deseas conservar los objetos después de la eliminación.
- Para configurar el control de versiones de objetos, haz clic en la casilla de verificación Control de versiones de objetos (para el control de versión) y especifica la cantidad máxima de versiones por objeto y la cantidad de días después de los cuales vencen las versiones no actuales.
- Para habilitar la política de retención en objetos y buckets, haz clic en la casilla de verificación Retención (para cumplimiento) y, luego, haz lo siguiente:
- Para habilitar el bloqueo de retención de objetos, haz clic en la casilla de verificación Habilitar la retención de objetos.
- Para habilitar el Bloqueo del bucket, haz clic en la casilla de verificación Establecer política de retención del bucket y elige una unidad de tiempo y una duración para tu período de retención.
- Para elegir cómo se encriptarán los datos de tus objetos, expande la sección Encriptación de datos () y selecciona un método de encriptación de datos.
- Selecciona cualquiera de las opciones de Protección de datos que
desees configurar para tu bucket.
-
En la sección Primeros pasos, haz lo siguiente:
- Haz clic en Crear.
Pasos del instructivo
Sigue estos pasos para crear un clúster de Managed Service para Apache Spark Kafka y leer un tema de Kafka en Cloud Storage en formato Parquet O ORC.
Copia la secuencia de comandos de instalación de Kafka en Cloud Storage
La secuencia de comandos de la kafka.sh acción de inicialización instala Kafka en un clúster de Managed Service para Apache Spark.
Explora el código.
Copia la secuencia de comandos de la acción de inicialización
kafka.shen tu bucket de Cloud Storage. Con esta secuencia de comandos, se instala Kafka en un clúster de Managed Service para Apache Spark.Abre Cloud Shell y, luego, ejecuta el siguiente comando:
gcloud storage cp gs://goog-dataproc-initialization-actions-REGION/kafka/kafka.sh gs://BUCKET_NAME/scripts/
Realiza los siguientes reemplazos:
- REGION:
kafka.shse almacena en buckets públicos etiquetados regionalmente en Cloud Storage. Especifica una región de Compute Engine cercana geográficamente (por ejemplo,us-central1). - BUCKET_NAME: Es el nombre de tu bucket de Cloud Storage.
- REGION:
Crea un clúster de Managed Service para Apache Spark Kafka
Abre Cloud Shell y, luego, ejecuta el siguiente comando de
gcloud dataproc clusters createpara crear un clúster de clúster de AA de Managed Service para Apache Spark que instale los componentes de Kafka y ZooKeeper:gcloud dataproc clusters create KAFKA_CLUSTER \ --project=PROJECT_ID \ --region=REGION \ --image-version=2.1-debian11 \ --num-masters=3 \ --enable-component-gateway \ --initialization-actions=gs://BUCKET_NAME/scripts/kafka.sh
Notas:
- KAFKA_CLUSTER: Es el nombre del clúster, que debe ser único dentro de un proyecto. El nombre debe comenzar con una letra en minúscula y puede contener hasta 51 letras en minúscula, números y guiones. No puede terminar con un guion. Se puede reutilizar el nombre de un clúster borrado.
- PROJECT_ID: Es el proyecto que se asociará con este clúster.
- REGION: Es la región de Compute Engine en la que se ubicará el clúster, como
us-central1.- Puedes agregar la marca opcional
--zone=ZONEpara especificar una zona dentro de la región especificada, comous-central1-a. Si no especificas una zona, la función de colocación automática de zonas de Managed Service for Apache Spark selecciona una zona con la región especificada.
- Puedes agregar la marca opcional
--image-version: Se recomienda la versión de imagen del servicio administrado para Apache Spark2.1-debian11para este instructivo. Nota: Cada versión de imagen contiene un conjunto de componentes preinstalados, incluido el componente de Hive que se usa en este instructivo (consulta Versiones de imágenes compatibles de Managed Service for Apache Spark).--num-master: Los nodos principales de3crean un clúster de HA. El componente Zookeeper, que requiere Kafka, está preinstalado en un clúster de alta disponibilidad.--enable-component-gateway: Habilita la puerta de enlace de componentes del servicio administrado para Apache Spark.- BUCKET_NAME: Es el nombre de tu bucket de Cloud Storage que contiene el script de inicialización de
/scripts/kafka.sh(consulta Copia el script de instalación de Kafka en Cloud Storage).
Crea un tema de Kafka custdata
Para crear un tema de Kafka en el clúster de Kafka de Managed Service para Apache Spark, haz lo siguiente:
Usa la utilidad SSH para abrir una ventana de terminal en la VM instancia principal del clúster.
Crea un tema de Kafka
custdata./usr/lib/kafka/bin/kafka-topics.sh \ --bootstrap-server KAFKA_CLUSTER-w-0:9092 \ --create --topic custdata
Notas:
KAFKA_CLUSTER: Inserta el nombre de tu clúster de Kafka.
-w-0:9092significa el agente de Kafka que se ejecuta en el puerto9092en el nodoworker-0.Puedes ejecutar los siguientes comandos después de crear el tema
custdata:# List all topics. /usr/lib/kafka/bin/kafka-topics.sh \ --bootstrap-server KAFKA_CLUSTER-w-0:9092 \ --list
# Consume then display topic data. /usr/lib/kafka/bin/kafka-console-consumer.sh \ --bootstrap-server KAFKA_CLUSTER-w-0:9092 \ --topic custdata
# Count the number of messages in the topic. /usr/lib/kafka/bin/kafka-run-class.sh kafka.tools.GetOffsetShell \ --broker-list KAFKA_CLUSTER-w-0:9092 \ --topic custdata
# Delete topic. /usr/lib/kafka/bin/kafka-topics.sh \ --bootstrap-server KAFKA_CLUSTER-w-0:9092 \ --delete --topic custdata
Publica contenido en el tema custdata de Kafka
La siguiente secuencia de comandos usa la herramienta kafka-console-producer.sh de Kafka para generar datos de clientes ficticios en formato CSV.
Copia y pega la secuencia de comandos en la terminal SSH del nodo principal de tu clúster de Kafka. Presiona <return> para ejecutar la secuencia de comandos.
for i in {1..10000}; do \ custname="cust name${i}" uuid=$(dbus-uuidgen) age=$((45 + $RANDOM % 45)) amount=$(echo "$(( $RANDOM % 99999 )).$(( $RANDOM % 99 ))") message="${uuid}:${custname},${age},${amount}" echo ${message} done | /usr/lib/kafka/bin/kafka-console-producer.sh \ --broker-list KAFKA_CLUSTER-w-0:9092 \ --topic custdata \ --property "parse.key=true" \ --property "key.separator=:"Notas:
- KAFKA_CLUSTER: Es el nombre de tu clúster de Kafka.
Ejecuta el siguiente comando de Kafka para confirmar que el tema
custdatacontiene 10,000 mensajes./usr/lib/kafka/bin/kafka-run-class.sh kafka.tools.GetOffsetShell \ --broker-list KAFKA_CLUSTER-w-0:9092 \ --topic custdata
Notas:
- KAFKA_CLUSTER: Es el nombre de tu clúster de Kafka.
Resultado esperado:
custdata:0:10000
Crea tablas de Hive en Cloud Storage
Crea tablas de Hive para recibir los datos del tema de Kafka transmitidos.
Sigue estos pasos para crear tablas de Hive cust_parquet (Parquet) y cust_orc (ORC) en tu bucket de Cloud Storage.
Inserta tu BUCKET_NAME en la siguiente secuencia de comandos, luego, cópiala y pégala en la terminal de SSH del nodo principal de tu clúster de Kafka y, luego, presiona <return> para crear una secuencia de comandos de
~/hivetables.hql(lenguaje de consultas de Hive).Ejecutarás la secuencia de comandos
~/hivetables.hqlen el siguiente paso para crear tablas de Hive en formato Parquet y ORC en tu bucket de Cloud Storage.cat > ~/hivetables.hql <<EOF drop table if exists cust_parquet; create external table if not exists cust_parquet (uuid string, custname string, age string, amount string) row format delimited fields terminated by ',' stored as parquet location "gs://BUCKET_NAME/tables/cust_parquet"; drop table if exists cust_orc; create external table if not exists cust_orc (uuid string, custname string, age string, amount string) row format delimited fields terminated by ',' stored as orc location "gs://BUCKET_NAME/tables/cust_orc"; EOF
En la terminal SSH del nodo principal de tu clúster de Kafka, envía el trabajo de Hive
~/hivetables.hqlpara crear las tablas de Hivecust_parquet(Parquet) ycust_orc(ORC) en tu bucket de Cloud Storage.gcloud dataproc jobs submit hive \ --cluster=KAFKA_CLUSTER \ --region=REGION \ -f ~/hivetables.hql
Notas:
- El componente de Hive está preinstalado en el clúster de Managed Service para Apache Kafka Spark. Consulta las versiones de actualización 2.1.x para obtener una lista de las versiones del componente Hive incluidas en las imágenes 2.1 lanzadas recientemente.
- KAFKA_CLUSTER: Es el nombre de tu clúster de Kafka.
- REGION: Es la región en la que se encuentra tu clúster de Kafka.
Transmite Kafka custdata a tablas de Hive
- Ejecuta el siguiente comando en la terminal de SSH del nodo principal de tu clúster de Kafka para instalar la biblioteca
kafka-python. Se necesita un cliente de Kafka para transmitir datos de temas de Kafka a Cloud Storage.pip install kafka-python
Inserta tu BUCKET_NAME, luego copia y pega el siguiente código de PySpark en la terminal SSH del nodo principal de tu clúster de Kafka y, luego, presiona <return> para crear un archivo
streamdata.py.La secuencia de comandos se suscribe al tema
custdatade Kafka y, luego, transmite los datos a tus tablas de Hive en Cloud Storage. El formato de salida, que puede ser Parquet o ORC, se pasa a la secuencia de comandos como un parámetro.cat > streamdata.py <<EOF #!/bin/python import sys from pyspark.sql.functions import * from pyspark.sql.types import * from pyspark.sql import SparkSession from kafka import KafkaConsumer def getNameFn (data): return data.split(",")[0] def getAgeFn (data): return data.split(",")[1] def getAmtFn (data): return data.split(",")[2] def main(cluster, outputfmt): spark = SparkSession.builder.appName("APP").getOrCreate() spark.sparkContext.setLogLevel("WARN") Logger = spark._jvm.org.apache.log4j.Logger logger = Logger.getLogger(__name__) rows = spark.readStream.format("kafka") \ .option("kafka.bootstrap.servers", cluster+"-w-0:9092").option("subscribe", "custdata") \ .option("startingOffsets", "earliest")\ .load() getNameUDF = udf(getNameFn, StringType()) getAgeUDF = udf(getAgeFn, StringType()) getAmtUDF = udf(getAmtFn, StringType()) logger.warn("Params passed in are cluster name: " + cluster + " output format(sink): " + outputfmt) query = rows.select (col("key").cast("string").alias("uuid"),\ getNameUDF (col("value").cast("string")).alias("custname"),\ getAgeUDF (col("value").cast("string")).alias("age"),\ getAmtUDF (col("value").cast("string")).alias("amount")) writer = query.writeStream.format(outputfmt)\ .option("path","gs://BUCKET_NAME/tables/cust_"+outputfmt)\ .option("checkpointLocation", "gs://BUCKET_NAME/chkpt/"+outputfmt+"wr") \ .outputMode("append")\ .start() writer.awaitTermination() if __name__=="__main__": if len(sys.argv) < 2: print ("Invalid number of arguments passed ", len(sys.argv)) print ("Usage: ", sys.argv[0], " cluster format") print ("e.g.: ", sys.argv[0], " <cluster_name> orc") print ("e.g.: ", sys.argv[0], " <cluster_name> parquet") main(sys.argv[1], sys.argv[2]) EOFEn la terminal SSH del nodo principal de tu clúster de Kafka, ejecuta
spark-submitpara transmitir datos a tus tablas de Hive en Cloud Storage.Inserta el nombre de tu KAFKA_CLUSTER y la salida FORMAT. Luego, copia y pega el siguiente código en la terminal SSH del nodo principal de tu clúster de Kafka y, luego, presiona <return> para ejecutar el código y transmitir los datos de
custdatade Kafka en formato Parquet a tus tablas de Hive en Cloud Storage.spark-submit --packages \ org.apache.spark:spark-streaming-kafka-0-10_2.12:3.1.3,org.apache.spark:spark-sql-kafka-0-10_2.12:3.1.3 \ --conf spark.history.fs.gs.outputstream.type=FLUSHABLE_COMPOSITE \ --conf spark.driver.memory=4096m \ --conf spark.executor.cores=2 \ --conf spark.executor.instances=2 \ --conf spark.executor.memory=6144m \ streamdata.py KAFKA_CLUSTER FORMATNotas:
- KAFKA_CLUSTER: Inserta el nombre de tu clúster de Kafka.
- FORMAT: Especifica
parquetoorccomo el formato de salida. Puedes ejecutar el comando de forma sucesiva para transmitir ambos formatos a las tablas de Hive. Por ejemplo, en la primera invocación, especificaparquetpara transmitir el temacustdatade Kafka a la tabla de Hive en formato Parquet. Luego, en la segunda invocación, especifica el formatoorcpara transmitircustdataa la tabla de Hive en formato ORC.
Después de que se detenga la salida estándar en la terminal SSH, lo que indica que se transmitió todo el contenido de
custdata, presiona <control-c> en la terminal SSH para detener el proceso.Enumera las tablas de Hive en Cloud Storage.
gcloud storage ls gs://BUCKET_NAME/tables/* --recursive
Notas:
- BUCKET_NAME: Inserta el nombre del bucket de Cloud Storage que contiene tus tablas de Hive (consulta Cómo crear tablas de Hive).
Consulta datos transmitidos
En la terminal de SSH del nodo principal de tu clúster de Kafka, ejecuta el siguiente comando
hivepara contar los mensajescustdatade Kafka transmitidos en las tablas de Hive en Cloud Storage.hive -e "select count(1) from TABLE_NAME"
Notas:
- TABLE_NAME: Especifica
cust_parquetocust_orccomo el nombre de la tabla de Hive.
Fragmento del resultado esperado:
- TABLE_NAME: Especifica
...
Status: Running (Executing on YARN cluster with App id application_....)
----------------------------------------------------------------------------------------------
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
Map 1 .......... container SUCCEEDED 1 1 0 0 0 0
Reducer 2 ...... container SUCCEEDED 1 1 0 0 0 0
----------------------------------------------------------------------------------------------
VERTICES: 02/02 [==========================>>] 100% ELAPSED TIME: 9.89 s
----------------------------------------------------------------------------------------------
OK
10000
Time taken: 21.394 seconds, Fetched: 1 row(s)
Realiza una limpieza
Borra el proyecto
Borra un Google Cloud proyecto:
gcloud projects delete PROJECT_ID
Borrar los recursos
-
Borra el bucket:
gcloud storage buckets delete BUCKET_NAME
- Borra tu clúster de Kafka:
gcloud dataproc clusters delete KAFKA_CLUSTER \ --region=${REGION}