Ingerir datos en OpenSearch usando Apache Kafka y Go

        ¿Necesita escribir una capa de integración personalizada para cumplir con requisitos específicos en su canal de datos? Aprenda cómo hacer esto con Kafka y OpenSearch usando Go.

        La ingesta de datos escalables es un aspecto clave de los motores de búsqueda y análisis distribuidos masivamente como OpenSearch. Una de las formas de crear un canal de ingesta de datos en tiempo real es utilizar Apache Kafka. Es una plataforma de transmisión de eventos de código abierto diseñada para manejar grandes volúmenes (y velocidades) de datos e integrarse con una variedad de fuentes, incluidas bases de datos relacionales y NoSQL. Por ejemplo, uno de los casos de uso canónicos es la sincronización en tiempo real de datos entre sistemas heterogéneos (componentes de origen) para garantizar que los índices de OpenSearch estén actualizados y puedan usarse para análisis o en aplicaciones posteriores a través de paneles y visualizaciones.
        Esta publicación de blog describe cómo crear una canalización de datos donde los datos escritos en Apache Kafka se ingieran en OpenSearch. Usaremos Amazon OpenSearch Serverless y Amazon Managed Streaming para Apache Kafka (Amazon MSK) Serverless. Kafka Connect es muy adecuado para tales necesidades. Proporciona conectores receptores para OpenSearch y ElasticSearch (que puede utilizar si decide utilizar el motor OSS ElasticSearch con Amazon OpenSearch). Pero a veces, existen requisitos o motivos específicos que pueden requerir una solución personalizada.
        Por ejemplo, es posible que esté utilizando una fuente de datos que Kafka Connect no admite (poco frecuente, pero posible) y no desee escribir la fuente de datos desde cero. O bien, podría tratarse de una integración única y se pregunta si vale la pena el esfuerzo de instalar y configurar Kafka Connect. Quizás haya otros problemas como licencias, etc.
        Afortunadamente, Kafka y OpenSearch proporcionan bibliotecas cliente en varios lenguajes de programación, lo que le permite escribir su propia capa de integración. ¡Eso es exactamente lo que cubre este blog! Usaremos una aplicación Go personalizada para ingerir datos a través de Kafka y el cliente Go de OpenSearch.

Aprenderás:

  • Una descripción general de cómo configurar los servicios de AWS necesarios: políticas y configuración de seguridad de OpenSearch Serverless, MSK Serverless, AWS Cloud9 e IAM
  • Tutorial avanzado de la aplicación
  • Ponga en funcionamiento su canal de ingesta de datos
  • Cómo consultar datos en OpenSearch

Antes de profundizar, brindemos una breve descripción general de OpenSearch Serverless y Amazon MSK Serverless.

Introducción a Amazon OpenSearch Serverless y Amazon MSK Serverless

OpenSearch es un motor de búsqueda y análisis de código abierto para análisis de registros, monitoreo en tiempo real y análisis de flujo de clics. Amazon OpenSearch Service es un servicio administrado que simplifica la implementación y el escalado de clústeres de OpenSearch en AWS.

Amazon OpenSearch Service admite OpenSearch y versiones anteriores de Elasticsearch OSS (hasta 7.10, la versión final de código abierto del software). Al crear un clúster, puede elegir qué motor de búsqueda utilizar.

Puede crear un dominio de servicio OpenSearch (sinónimo de clúster de OpenSearch) para representar un clúster donde cada instancia de Amazon EC2 actúa como un nodo. Sin embargo, OpenSearch Serverless elimina la complejidad operativa al proporcionar una configuración sin servidor bajo demanda para los servicios OpenSearch. Utiliza colecciones de índices para admitir cargas de trabajo específicas, separa los componentes de búsqueda e indexación de los clústeres tradicionales y utiliza Amazon S3 como almacenamiento principal para los índices. La arquitectura admite el escalamiento independiente de las capacidades de búsqueda e indexación.
Puede consultar Comparación de OpenSearch Service y OpenSearch Serverless para obtener más detalles.

OpenSearch/Amazon S3: indexación y búsqueda

Amazon MSK (Managed Streaming para Apache Kafka) es un servicio totalmente administrado para procesar datos de streaming con Apache Kafka. Maneja operaciones de administración de clústeres como crear, actualizar y eliminar. Puede utilizar operaciones de datos estándar de Apache Kafka para producir y consumir datos sin modificar su aplicación. Es compatible con la versión de código abierto Kafka, lo que garantiza la compatibilidad con herramientas, complementos y aplicaciones existentes.

MSK Serverless es un tipo de clúster en Amazon MSK que elimina la necesidad de administrar y escalar manualmente la capacidad del clúster. Configura y escala automáticamente los recursos según la demanda y se encarga de la gestión de particiones de temas. Con el precio de pago por uso, solo paga por lo que usa. MSK Serverless es ideal para aplicaciones que requieren capacidad de transmisión flexible y de escalamiento automático.

Primero analicemos la arquitectura de aplicaciones de alto nivel y luego analicemos las consideraciones arquitectónicas.

Descripción general de la aplicación y consideraciones arquitectónicas clave

Esta es una versión simplificada de la arquitectura de la aplicación, que describe los componentes y cómo interactúan entre sí.

Arquitectura de aplicaciones simplificada

La aplicación consta de componentes productores y consumidores, que son aplicaciones Go implementadas en instancias EC2:

  • Como sugiere el nombre, los productores envían datos al clúster MSK Serverless.
  • Las aplicaciones de consumo moviereciben datos (mensajes) de temas de MSK Serverless y utilizan el cliente OpenSearch Go para moviesindexar los datos de la colección.

centrarse en la simplicidad

Vale la pena señalar que esta publicación de blog está optimizada para brindar simplicidad y facilidad de comprensión, por lo que la solución no está adaptada para ejecutar cargas de trabajo de producción. A continuación se muestran algunas simplificaciones que se han realizado:

  • Las aplicaciones de productor y consumidor se ejecutan en la misma plataforma informática (instancia EC2).
  • Hay una instancia de aplicación de consumidor que procesa datos del tema MSK. Sin embargo, puede intentar ejecutar varias instancias de la aplicación de consumo y ver cómo se distribuyen los datos entre las instancias.
  • En lugar de utilizar la CLI de Kafka para generar datos, escriba una aplicación generadora personalizada en Go junto con un punto final REST para enviar los datos. Esto demuestra cómo escribir una aplicación de productor Kafka en Go e imita la CLI de Kafka.
  • La cantidad de datos utilizados es pequeña.
  • Las colecciones de OpenSearch Serverless tienen un tipo de acceso público .

Para cargas de trabajo de producción, estas son algunas cosas que debe considerar:
Elegir la plataforma informática adecuada para su aplicación de consumo en función del volumen de datos y los requisitos de escalabilidad; más información sobre esto a continuación.
Seleccione el tipo de acceso a VPC para su colección OpenSearch Serverless.
Considere la posibilidad de utilizar Amazon OpenSearch Ingestion para crear una canalización de datos.
Si aún necesita implementar una aplicación personalizada para crear una canalización de datos desde MSK a OpenSearch, esta es la gama de opciones informáticas entre las que puede elegir: Contenedores: puede empaquetar su aplicación de consumo como un contenedor Docker (Dockerfile está disponible en
GitHub repositorio Get) e implementarlo en Amazon EKS o Amazon ECS.
Si implementa su aplicación en Amazon EKS, también podría considerar usar KEDA para escalar automáticamente su aplicación de consumo en función de la cantidad de mensajes en el tema MSK.
Sin servidor: también puede utilizar MSK como origen de eventos para las funciones de AWS Lambda. Puede escribir aplicaciones de consumo como funciones Lambda y configurarlas para que se activen mediante eventos MSK o se ejecuten en AWS Fargate.
Dado que la aplicación productora es una API REST, puede implementarla en AWS App Runner.
Por último, puede aprovechar los grupos de Amazon EC2 Auto Scaling para escalar automáticamente flotas de EC2 para sus aplicaciones de consumo.
Hay suficiente material que analiza cómo utilizar una aplicación Kafka basada en Java para conectarse con MSK Serverless a través de IAM.
Tomemos un desvío para comprender cómo funciona Go.

¿Cómo puede una aplicación cliente Go utilizar IAM para autenticarse con MSK Serverless?

MSK Serverless requiere control de acceso de IAM para manejar la autenticación y autorización de los clústeres de MSK. Esto significa que sus aplicaciones cliente de MSK (productores y consumidores en este caso) deben usar IAM para autenticarse en MSK, en función de lo cual se les permitirá o denegará ciertas operaciones de Apache Kafka.

Lo bueno es que franz-gola biblioteca cliente de Kafka admite la autenticación IAM. A continuación se muestra un fragmento de una aplicación para consumidores que muestra cómo funciona en la práctica:

func init() {
//......
    cfg, err = config.LoadDefaultConfig(context.Background(), config.WithRegion("us-east-1"), config.WithCredentialsProvider(ec2rolecreds.New()))

  creds, err = cfg.Credentials.Retrieve(context.Background())
//....

func initializeKafkaClient() {

    opts := []kgo.Opt{
        kgo.SeedBrokers(strings.Split(mskBroker, ",")...),
        kgo.SASL(sasl_aws.ManagedStreamingIAM(func(ctx context.Context) (sasl_aws.Auth, error) {

            return sasl_aws.Auth{
                AccessKey:    creds.AccessKeyID,
                SecretKey:    creds.SecretAccessKey,
                SessionToken: creds.SessionToken,
                UserAgent:    "msk-ec2-consumer-app",
            }, nil
        })),
//.....

configuración de infraestructura

Esta sección le ayudará a configurar los siguientes componentes:

  • Rol de IAM requerido
  • Clúster sin servidor MSK
  • Colecciones sin servidor de OpenSearch
  • Entorno AWS Cloud9 EC2 para ejecutar la aplicación

Clúster sin servidor MSK

Puede seguir esta documentación para configurar un clúster sin servidor MSK mediante la consola de AWS. Después de hacer esto, tome nota de la siguiente información del clúster: VPC, subredes, grupos de seguridad (pestaña Propiedades) y puntos finales del clúster (haga clic en Ver información del cliente).

Rol de IAM de la aplicación

Este tutorial requiere una función de IAM diferente.

Primero cree una función de IAM para realizar los siguientes pasos y siga los permisos del Paso 1: Configurar permisos (en la documentación de Amazon OpenSearch) para usar OpenSearch Serverless.
Cree otra función de IAM para la aplicación cliente que interactuará con el clúster MSK Serverless y utilizará el cliente OpenSearch Go para indexar datos en la colección OpenSearch Serverless. Cree una política de IAM en línea como la siguiente: asegúrese de reemplazar los valores deseados.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:*"
            ],
            "Resource": [
                "<ARN of the MSK Serverless cluster>",
                "arn:aws:kafka:us-east-1:<AWS_ACCOUNT_ID>:topic/<MSK_CLUSTER_NAME>/*",
                "arn:aws:kafka:us-east-1:AWS_ACCOUNT_ID:group/<MSK_CLUSTER_NAME>/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "aoss:APIAccessAll"
            ],
            "Resource": "*"
        }
    ]
}

Utilice la siguiente política de confianza:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Finalmente, hay otra función de IAM a la que adjuntará la política de acceso a datos de OpenSearch Serverless; más información sobre esto en el siguiente paso.

Colecciones sin servidor de OpenSearch

Utilice la documentación para crear una colección OpenSearch Serverless. Al seguir el punto 8 en el Paso 2: Crear la colección, asegúrese de configurar dos políticas de datos; es decir, para cada rol de IAM creado en los pasos 2 y 3 de la sección anterior.

Nota: Para los fines de este tutorial, elegimos el tipo de acceso público . Se recomienda VPC para cargas de trabajo de producción .

Descripción general e información general

Entorno AWS Cloud9 EC2

Utilice este documento para crear un entorno de desarrollo AWS Cloud9 EC2. Asegúrese de utilizar la misma VPC que su clúster MSK Serverless .

Una vez completado, deberá hacer lo siguiente: Abra el entorno Cloud9. En Instancias EC2 , haga clic en Administrar instancias EC2 . En la instancia EC2, navegue hasta Seguridad y observe el grupo de seguridad adjunto.

Instancias EC2 > Administrar instancias EC2

Abra el grupo de seguridad asociado con el clúster MSK Serverless y agregue una regla de entrada para permitir que las instancias EC2 de Cloud9 se conecten a él. Seleccione el grupo de seguridad de la instancia Cloud9 EC2 como origen, 9098 como puerto y seleccione el protocolo TCP .

¡Ya está listo para ejecutar la aplicación!

Seleccione el entorno Cloud9 y seleccione Abrir en Cloud9 para iniciar el IDE. Abra una ventana de terminal, clone el repositorio de GitHub y cambie el directorio a esa carpeta.

git clone https://github.com/build-on-aws/opensearch-using-kafka-golang

cd opensearch-using-kafka-golang

Inicie la aplicación de productor:

cd msk-producer

export MSK_BROKER=<enter MSK Serverless cluster endpoint>
export MSK_TOPIC=movies

go run main.go

Deberías ver los siguientes registros en tu terminal:

MSK_BROKER <MSK Serverless cluster endpoint>
MSK_TOPIC movies
starting producer app
http server ready

Para enviar datos al clúster sin servidor de MSK, use un script bash que llamará al HTTPpunto final expuesto por la aplicación que acaba de iniciar y movies.txtenviará los datos de la película (desde un archivo) usando el siguiente formato:JSONcurl

./send-data.sh

En los registros del terminal de la aplicación del productor, debería ver un resultado similar al siguiente:

producing data to topic
payload {"directors": ["Joseph Gordon-Levitt"], "release_date": "2013-01-18T00:00:00Z", "rating": 7.4, "genres": ["Comedy", "Drama"], "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQxNTc3NDM2MF5BMl5BanBnXkFtZTcwNzQ5NTQ3OQ@@._V1_SX400_.jpg", "plot": "A New Jersey guy dedicated to his family, friends, and church, develops unrealistic expectations from watching porn and works to find happiness and intimacy with his potential true love.", "title": "Don Jon", "rank": 1, "running_time_secs": 5400, "actors": ["Joseph Gordon-Levitt", "Scarlett Johansson", "Julianne Moore"], "year": 2013}
record produced successfully to offset 2 in partition 0 of topic movies

producing data to topic
payload {"directors": ["Ron Howard"], "release_date": "2013-09-02T00:00:00Z", "rating": 8.3, "genres": ["Action", "Biography", "Drama", "Sport"], "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg", "plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.", "title": "Rush", "rank": 2, "running_time_secs": 7380, "actors": ["Daniel Br\u00c3\u00bchl", "Chris Hemsworth", "Olivia Wilde"], "year": 2013}
record produced successfully to offset 4 in partition 1 of topic movies

.....

Para los fines de este tutorial y para que sea sencillo, la cantidad de datos se limitó intencionalmente a 1500 registros y el script se suspende intencionalmente durante 1 segundo después de enviar cada registro al productor. Deberías poder seguirlo fácilmente.

Mientras la aplicación productora está ocupada moviesenviando datos al tema, puede iniciar la aplicación consumidora y comenzar a procesar datos del clúster MSK Serverless e indexarlos en la colección OpenSearch Serverless.

cd msk-consumer

export MSK_BROKER=<enter MSK Serverless cluster endpoint>
export MSK_TOPIC=movies
export OPENSEARCH_INDEX_NAME=movies-index
export OPENSEARCH_ENDPOINT_URL=<enter OpenSearch Serverless endpoint>

go run main.go

Debería ver el siguiente resultado en la terminal, que indica que efectivamente comenzó a recibir datos del clúster MSK Serverless y a indexarlos en la colección OpenSearch Serverless.

using default value for AWS_REGION - us-east-1
MSK_BROKER <MSK Serverless cluster endpoint>
MSK_TOPIC movies
OPENSEARCH_INDEX_NAME movies-index
OPENSEARCH_ENDPOINT_URL <OpenSearch Serverless endpoint>
using credentials from: EC2RoleProvider
kafka consumer goroutine started. waiting for records
paritions ASSIGNED for topic movies [0 1 2]

got record from partition 1 key= val={"directors": ["Joseph Gordon-Levitt"], "release_date": "2013-01-18T00:00:00Z", "rating": 7.4, "genres": ["Comedy", "Drama"], "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQxNTc3NDM2MF5BMl5BanBnXkFtZTcwNzQ5NTQ3OQ@@._V1_SX400_.jpg", "plot": "A New Jersey guy dedicated to his family, friends, and church, develops unrealistic expectations from watching porn and works to find happiness and intimacy with his potential true love.", "title": "Don Jon", "rank": 1, "running_time_secs": 5400, "actors": ["Joseph Gordon-Levitt", "Scarlett Johansson", "Julianne Moore"], "year": 2013}
movie data indexed
committing offsets
got record from partition 2 key= val={"directors": ["Ron Howard"], "release_date": "2013-09-02T00:00:00Z", "rating": 8.3, "genres": ["Action", "Biography", "Drama", "Sport"], "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg", "plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.", "title": "Rush", "rank": 2, "running_time_secs": 7380, "actors": ["Daniel Br\u00c3\u00bchl", "Chris Hemsworth", "Olivia Wilde"], "year": 2013}
movie data indexed
committing offsets

.....

Una vez completado el proceso, debería tener 1500 películas indexadas en la colección OpenSearch Serverless. Sin embargo, no es necesario esperar a que se complete. Una vez que tenga cientos de registros, puede proceder a navegar a las herramientas de desarrollador en el panel de OpenSearch para ejecutar la siguiente consulta.

Consultar datos de películas en OpenSearch

ejecutar una consulta sencilla

Comencemos con una consulta simple para enumerar todos los documentos en el índice (sin parámetros ni filtros).

GET movies-index/_search

Obtener datos solo para campos específicos

De forma predeterminada, las solicitudes de búsqueda recuperan el objeto JSON completo proporcionado cuando se indexó el documento. Utilice esta _sourceopción para recuperar fuentes de campos seleccionados. Por ejemplo, para recuperar solo los titlecampos ploty genres, ejecute la siguiente consulta:

GET movies-index/_search
{
  "_source": {
  "includes": [
    "title",
    "plot",
    "genres"
    ]
  }
}

Obtener datos para que coincidan con el término de búsqueda exacto para la consulta de términos

Puede utilizar una consulta de términos para lograr esto. Por ejemplo, para buscar christmaspelículas con ese término en el campo title, ejecute la siguiente consulta:

GET movies-index/_search
{
  "query": {
    "term": { 
      "title": {
        "value": "christmas"
      }
    }
  }
}

** Combine la selección selectiva de campos con la búsqueda de términos.

Puede utilizar esta consulta para recuperar solo ciertos campos, pero le interesan términos específicos:

GET movies-index/_search
{
  "_source": {
    "includes": [
      "title",
      "actors"
    ]
  },
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "harry"
    }
  }
}

polimerización

Utilice la agregación para calcular valores resumidos basándose en valores agrupados en un campo específico. Por ejemplo, puede agregar campos como ratings, , genrey year, para buscar resultados basados ​​en los valores de esos campos. La agregación nos permite responder preguntas como: "¿Cuántas películas hay de cada género?"

GET movies-index/_search
{
  "size":0,
  "aggs": {
    "genres": {
      "terms":{"field": "genres.keyword"}
    }
  }
}

en conclusión

En resumen, implementó una canalización que utiliza Kafka para ingerir datos en OpenSearch Serverless y luego los consulta de manera diferente. A lo largo del camino, también aprendió sobre consideraciones arquitectónicas y opciones informáticas a tener en cuenta para cargas de trabajo de producción, además de trabajar con aplicaciones Kafka basadas en Go y autenticación MSK IAM. También recomiendo leer el artículo Creación de una aplicación CRUD para Amazon OpenSearch en Go, especialmente si está buscando un tutorial centrado en realizar operaciones de OpenSearch con Go SDK.

Guess you like

Origin blog.csdn.net/qq_28245905/article/details/132333966