Creación de un lago de datos unificado en Amazon EMR con Apache Flink

0d1a615fa0fee30ccb45dff8a921d262.gif

Para construir una empresa basada en datos, es importante democratizar los activos de datos empresariales en un catálogo de datos. Con un catálogo de datos unificado, puede buscar rápidamente conjuntos de datos y determinar el esquema de datos, el formato de datos y la ubicación. Amazon Glue Data Catalog proporciona un repositorio unificado que permite que sistemas dispares almacenen y encuentren metadatos para rastrear datos en silos de datos.

Apache Flink es un motor de procesamiento de datos ampliamente utilizado para la transmisión escalable de ETL, análisis y aplicaciones basadas en eventos. La aplicación proporciona una gestión precisa del tiempo y el estado con tolerancia a fallos. Flink puede procesar flujos limitados (procesamiento por lotes) y flujos ilimitados (procesamiento de transmisión) utilizando una API o aplicación unificada. Después de procesar los datos con Apache Flink, las aplicaciones posteriores pueden acceder a los datos seleccionados mediante un catálogo de datos unificado. Con metadatos unificados, tanto las aplicaciones de procesamiento de datos como las que consumen datos pueden usar los mismos metadatos para acceder a las tablas.

Esta publicación le muestra cómo integrar Apache Flink en Amazon EMR con Amazon Glue Data Catalog para que pueda ingerir datos de transmisión en tiempo real y acceder a los datos casi en tiempo real para análisis de negocios.

Conector de Apache Flink y esquema de directorio

Apache Flink usa conectores y catálogos para interactuar con datos y metadatos. El siguiente diagrama muestra el conector Apache Flink para leer/escribir datos y el esquema de directorio para leer/escribir metadatos.

832edfb092a70f6271a6118d39685dic.png

Para leer/escribir datos, Flink proporciona la interfaz DynamicTableSourceFactory para operaciones de lectura y la interfaz DynamicTableSinkFactory para operaciones de escritura. También hay un conector Flink que implementa dos interfaces para acceder a datos en diferentes tiendas. Por ejemplo, el conector Flink FileSystem proporciona FileSystemTableFactory para leer/escribir datos en Hadoop Distributed File System (HDFS) o Amazon Simple Storage Service (Amazon S3); el conector Flink HBase proporciona HBase2DynamicTableFactory para lectura/escritura de datos HBase; mientras que el conector Flink Kafka proporciona KafkaDynamicTableFactory para leer/escribir datos en Kafka. Puede consultar Conectores de tabla y SQL (https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/table/overview/) para obtener más información.

Para leer/escribir metadatos, Flink proporciona una interfaz de directorio. Flink tiene tres implementaciones integradas de directorios. GenericInMemoryCatalog almacena datos de catálogo en la memoria. JdbcCatalog almacena datos de catálogo en una base de datos relacional respaldada por JDBC. A partir de ahora, el catálogo JDBC admite bases de datos MySQL y PostgreSQL. HiveCatalog almacena datos de catálogo en Hive Metastore. HiveCatalog usa HiveShim para brindar compatibilidad con diferentes versiones de Hive. Podemos configurar diferentes clientes de metastore para usar Hive metastore o Amazon Glue Data Catalog. En esta publicación, configuramos la propiedad de Amazon EMR (http://aws.amazon.com/emr) hive.metastore.client.factory.class en com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory (consulte Uso de datos de Amazon Glue Catalog como Metastore de Hive, https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html), por lo que podemos usar Amazon Glue Data Catalog para almacenar datos de directorio de Flink. Consulte los catálogos (https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/dev/table/catalogs/) para obtener más información.

La mayoría de los conectores integrados de Flink (como Kafka, Amazon Kinesis, Amazon DynamoDB, Elasticsearch o FileSystem) pueden usar Flink HiveCatalog para almacenar metadatos en Amazon Glue Data Catalog. Sin embargo, algunas implementaciones de conectores (como Apache Iceberg) tienen mecanismos de administración de directorios independientes. FlinkCatalog en Iceberg implementa la interfaz de catálogo en Flink. FlinkCatalog en Iceberg proporciona un mecanismo de encapsulación para su propia implementación de catálogo. El siguiente diagrama muestra la relación entre Apache Flink, conectores Iceberg y catálogos. Consulte Creación de catálogos y uso de catálogos (https://iceberg.apache.org/docs/latest/flink/#creating-catalogs-and-using-catalogs) y Catálogos para obtener más información.

e2de2ffd12936119c8a8f1e97fccece9.png

Apache Hudi también tiene sus propias capacidades de gestión de catálogos. Tanto HoodieCatalog como HoodieHiveCatalog implementan la interfaz de catálogo en Flink. HoodieCatalog almacena metadatos en un sistema de archivos como HDFS. HoodieHiveCatalog almacena metadatos en Hive Metastore o Amazon Glue Data Catalog, dependiendo de si configuró hive.metastore.client.factory.class para usar com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory. El siguiente diagrama muestra la relación entre Apache Flink, conectores Hudi y catálogos. Consulte Crear catálogo (https://hudi.apache.org/docs/table_management#create-catalog) para obtener más información.

88ebd91ccbf8e012b7b9c8fa703d8b18.png

Dado que Iceberg y Hudi tienen diferentes mecanismos de administración de catálogos, mostramos tres escenarios para integrar Flink con Amazon Glue Data Catalog en este artículo:

  • Lea/escriba tablas Iceberg en Flink usando metadatos de Glue Data Catalog

  • Lea/escriba tablas de Hudi en Flink usando metadatos de Glue Data Catalog

  • Lea/escriba otros formatos de almacenamiento en Flink utilizando metadatos del catálogo de datos de Glue

Descripción general de la solución

El siguiente diagrama muestra la arquitectura general de la solución descrita en este artículo.

62057826691f51c3b6aec23033a36a83.png

En esta solución, habilitamos el binlog de Amazon RDS para MySQL para extraer cambios transaccionales en tiempo real. El conector CDC de Amazon EMR Flink lee los datos binlog y los procesa. Los datos transformados se pueden almacenar en Amazon S3. Utilizamos el catálogo de datos de Amazon Glue para almacenar metadatos, como el esquema de la tabla y la ubicación de la tabla. Las aplicaciones de consumo de datos descendentes, como Amazon Athena o Amazon EMR Trino, acceden a los datos para el análisis comercial.

Estos son los pasos aproximados para configurar esta solución:

  1. Habilite binlog para Amazon RDS para MySQL e inicialice la base de datos.

  2. Cree un clúster de EMR con Amazon Glue Data Catalog.

  3. Ingiera datos de Change Data Capture (CDC, Change Data Capture) mediante Apache Flink CDC en Amazon EMR.

  4. Almacene datos procesados ​​en Amazon S3 y metadatos en Amazon Glue Data Catalog.

  5. Confirme que todos los metadatos de la tabla estén almacenados en el catálogo de datos de Amazon Glue.

  6. Use datos para análisis de negocios con Athena o Amazon EMR Trino.

  7. Actualice y elimine registros de origen en Amazon RDS para MySQL y verifique los cambios correspondientes en las tablas del lago de datos.

requisitos previos

Este artículo utiliza un rol de Amazon Identity and Access Management (IAM) con los siguientes permisos de servicio:

  • Amazon RDS para MySQL (5.7.40)

  • Amazon EMR (6.9.0)

  • amazona atena

  • Catálogo de datos de Amazon Glue

  • Amazonas S3

para Amazon RDS para MySQL 

Habilite binlog e inicialice la base de datos

Para habilitar CDC en Amazon RDS para MySQL, debemos configurar el registro binario para Amazon RDS para MySQL. Para obtener más información, consulte Configuración del registro binario de MySQL (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.MySQL.BinaryFormat.html). También creamos la base de datos salesdb en MySQL y creamos el cliente, la tabla de pedidos y otras tablas para configurar la fuente de datos.

1. En la consola de Amazon RDS, elija  Grupos de parámetros en el panel de navegación .

2. Cree un nuevo grupo de parámetros para MySQL.

3. Edite el grupo de parámetros que acaba de crear, configurando binlog_format=ROW .

b3dbe031c17152a58b5244725eff6557.png

4. Edite el grupo de parámetros que acaba de crear, configurando binlog_row_image=full .

7e9b637ce834dad662b9441cefd50b23.png

5. Cree una instancia de base de datos de RDS para MySQL utilizando el grupo de parámetros.

6. Tenga en cuenta los valores de nombre de host, nombre de usuario y contraseña, los usaremos más adelante.

7. Ejecute el siguiente comando para descargar el script de inicialización de la base de datos MySQL desde Amazon S3:

aws s3 cp s3://emr-workshops-us-west-2/glue_immersion_day/scripts/salesdb.sql ./salesdb.sql

Desliza hacia la izquierda para ver más

8. Conéctese a la base de datos RDS for MySQL y ejecute el comando salesdb.sql para inicializar la base de datos, proporcionando el nombre de host y el nombre de usuario de acuerdo con la configuración de su base de datos RDS for MySQL:

mysql -h <hostname> -u <username> -p
mysql> source salesdb.sql

Desliza hacia la izquierda para ver más

Uso del catálogo de datos de Amazon Glue 

Crear un clúster de EMR

A partir de Amazon EMR 6.9.0, la tabla API/SQL de Flink se puede integrar con Amazon Glue Data Catalog. Para usar la integración de Flink con Amazon Glue, debe crear Amazon EMR 6.9.0 o posterior.

1. Cree el archivo iceberg.properties para la integración de Amazon EMR Trino con Data Catalog. Cuando el formato de la tabla es Iceberg, su archivo debe contener algo como esto:

iceberg.catalog.type=glue
connector.name=iceberg

2. Cargue iceberg.properties en un depósito de S3, por ejemplo, DOC-EXAMPLE-BUCKET.

Para obtener más información sobre cómo integrar Amazon EMR Trino con Iceberg, consulte Uso de un clúster de Iceberg con Trino (https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-trino-cluster.html ).

3. Cree el archivo trino-glue-catalog-setup.sh para configurar la integración de Trino con Data Catalog. Utilice trino-glue-catalog-setup.sh como secuencia de comandos de arranque. Su archivo debe contener lo siguiente (reemplace DOC-EXAMPLE-BUCKET con el nombre de su depósito S3):

set -ex 
sudo aws s3 cp s3://DOC-EXAMPLE-BUCKET/iceberg.properties /etc/trino/conf/catalog/iceberg.properties

Desliza hacia la izquierda para ver más

4. Cargue trino-glue-catalog-setup.sh en el depósito de S3 (DOC-EXAMPLE-BUCKET).

Para ejecutar un script de arranque, consulte Creación de una acción de arranque para instalar software adicional (https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html).

5. Cree el archivo flink-glue-catalog-setup.sh para configurar la integración de Flink con Data Catalog.

6. Usando el ejecutor de secuencias de comandos, ejecute la secuencia de comandos flink-glue-catalog-setup.sh como una función de paso.

Su archivo debe contener lo siguiente (los nombres de archivo JAR aquí usan Amazon EMR 6.9.0; las versiones posteriores de los nombres JAR pueden variar, así que asegúrese de actualizar para su versión de Amazon EMR).

Tenga en cuenta que aquí usamos un paso de Amazon EMR en lugar de bootstrap para ejecutar este script. Una vez que se aprovisiona Amazon EMR Flink, se ejecuta el script de pasos de Amazon EMR.

set -ex


sudo cp /usr/lib/hive/auxlib/aws-glue-datacatalog-hive3-client.jar /usr/lib/flink/lib
sudo cp /usr/lib/hive/lib/antlr-runtime-3.5.2.jar /usr/lib/flink/lib
sudo cp /usr/lib/hive/lib/hive-exec.jar /lib/flink/lib
sudo cp /usr/lib/hive/lib/libfb303-0.9.3.jar /lib/flink/lib
sudo cp /usr/lib/flink/opt/flink-connector-hive_2.12-1.15.2.jar /lib/flink/lib
sudo chmod 755 /usr/lib/flink/lib/aws-glue-datacatalog-hive3-client.jar
sudo chmod 755 /usr/lib/flink/lib/antlr-runtime-3.5.2.jar
sudo chmod 755 /usr/lib/flink/lib/hive-exec.jar
sudo chmod 755 /usr/lib/flink/lib/libfb303-0.9.3.jar
sudo chmod 755 /usr/lib/flink/lib/flink-connector-hive_2.12-1.15.2.jar


sudo wget https://repo1.maven.org/maven2/com/ververica/flink-sql-connector-mysql-cdc/2.2.1/flink-sql-connector-mysql-cdc-2.2.1.jar -O /lib/flink/lib/flink-sql-connector-mysql-cdc-2.2.1.jar
sudo chmod 755 /lib/flink/lib/flink-sql-connector-mysql-cdc-2.2.1.jar


sudo ln -s /usr/share/aws/iceberg/lib/iceberg-flink-runtime.jar /usr/lib/flink/lib/
sudo ln -s /usr/lib/hudi/hudi-flink-bundle.jar /usr/lib/flink/lib/


sudo mv /usr/lib/flink/opt/flink-table-planner_2.12-1.15.2.jar /usr/lib/flink/lib/
sudo mv /usr/lib/flink/lib/flink-table-planner-loader-1.15.2.jar /usr/lib/flink/opt/

Desliza hacia la izquierda para ver más

7. Cargue flink-glue-catalog-setup.sh en el depósito de S3 (DOC-EXAMPLE-BUCKET).

Para obtener más información sobre cómo configurar Flink y Hive Metastore, consulte Configuración de Flink como Hive Metastore en Amazon EMR (https://docs.aws.amazon.com/emr/latest/ReleaseGuide/flink-configure.html).

Para obtener más detalles sobre la ejecución de scripts de pasos de Amazon EMR, consulte Ejecución de comandos y scripts en clústeres de Amazon EMR (https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-commandrunner.html).

8. Cree un clúster EMR 6.9.0 con aplicaciones Hive, Flink y Trino.

Puede crear un clúster de EMR mediante la interfaz de línea de comandos de Amazon (Amazon CLI) o la consola de administración de Amazon. Para obtener instrucciones, consulte la subsección correspondiente.

Cree un clúster de EMR con Amazon CLI

Para utilizar la CLI de Amazon, complete los siguientes pasos:

1. Cree el archivo emr-flink-trino-glue.json para configurar Amazon EMR para usar Data Catalog. Su archivo debe contener lo siguiente:

[
{
"Classification": "hive-site",
"Properties": {
"hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
}
},
{
"Classification": "trino-connector-hive",
"Properties": {
"hive.metastore": "glue"
}
}
]

Desliza hacia la izquierda para ver más

2. Ejecute el siguiente comando para crear un clúster de EMR. Proporcione la ruta de la carpeta principal local emr-flink-trino-glue.json, el depósito de S3, la región del clúster de EMR, el nombre de la clave de EC2 y el depósito de S3 donde se almacenan los registros de EMR.

aws emr create-cluster --release-label emr-6.9.0 \
--applications Name=Hive Name=Flink Name=Spark Name=Trino \
--region us-west-2 \
--name flink-trino-glue-emr69 \
--configurations "file:///<your configuration path>/emr-flink-trino-glue.json" \
--bootstrap-actions '[{"Path":"s3://DOC-EXAMPLE-BUCKET/trino-glue-catalog-setup.sh","Name":"Add iceberg.properties for Trino"}]' \
--steps '[{"Args":["s3://DOC-EXAMPLE-BUCKET/flink-glue-catalog-setup.sh"],"Type":"CUSTOM_JAR","ActionOnFailure":"CONTINUE","Jar":"s3://<region>.elasticmapreduce/libs/script-runner/script-runner.jar","Properties":"","Name":"Flink-glue-integration"}]' \
--instance-groups \
InstanceGroupType=MASTER,InstanceType=m6g.2xlarge,InstanceCount=1 \
InstanceGroupType=CORE,InstanceType=m6g.2xlarge,InstanceCount=2 \
--use-default-roles \
--ebs-root-volume-size 30 \
--ec2-attributes KeyName=<keyname> \
--log-uri s3://<s3-bucket-for-emr>/elasticmapreduce/

Desliza hacia la izquierda para ver más

Crear un clúster de EMR en la consola

Para usar la consola, complete los siguientes pasos:

1. En la consola de Amazon EMR, cree un clúster de EMR y luego  seleccione  Usar para los metadatos de la tabla de Hive en  la configuración del catálogo de datos de Amazon Glue (para los metadatos de la tabla de Hive).

2. Agregue los ajustes de configuración usando el siguiente código:

[
{
"Classification": "trino-connector-hive",
"Properties": {
"hive.metastore": "glue"
}
}
]

Desliza hacia la izquierda para ver más

8c39a9fc383c3d2b225593985286739c.png

3. En  la sección Pasos , agregue un  paso denominado JAR personalizado .

4.  Establezca la ubicación de JAR en s3://<región>.elasticmapreduce/libs/script-runner/script-runner.jar , donde <región> es la región donde reside el clúster de EMR.

5.  Establezca Argumentos en la ruta S3 que cargó anteriormente.

7dac3f0ddb04934b346c45c35d570f8a.png

6. En  la sección Acciones de arranque, elija Acción personalizada  .

7. Establezca  la ubicación de la secuencia de comandos en la ruta S3 que cargó.

c5bb96b1b93ca0a228f9415c47c3ea1f.png

8. Continúe con los siguientes pasos para completar la creación del clúster de EMR.

En Amazon EMR

Extraer datos de CDC usando Apache Flink CDC

El conector Flink CDC admite la lectura de instantáneas de bases de datos y la captura de actualizaciones en tablas configuradas. Hemos descargado flink-sql-connector-mysql-cdc-2.2.1.jar (https://repo1.maven.org/maven2/com/ververica/flink-sql-connector-mysql-cdc/2.2.1/flink -sql-connector-mysql-cdc-2.2.1.jar) y colóquelo en la biblioteca Flink al crear el clúster EMR, implementó el conector Flink CDC para MySQL. El conector Flink CDC puede usar el catálogo de Flink Hive para almacenar esquemas de tablas de Flink CDC en Hive Metastore o Amazon Glue Data Catalog. En esta publicación, usamos Data Catalog para almacenar nuestras tablas Flink CDC.

Complete los siguientes pasos para utilizar Flink CDC para extraer tablas y bases de datos de RDS para MySQL y almacenar metadatos en Data Catalog:

1. Conéctese al nodo maestro de EMR a través de SSH.

2. Inicie Flink en la sesión de YARN ejecutando el siguiente comando, proporcionando el nombre de su depósito S3:

flink-yarn-session -d -jm 2048 -tm 4096 -s 2 \
-D state.backend=rocksdb \
-D state.backend.incremental=true \
-D state.checkpoint-storage=filesystem \
-D state.checkpoints.dir=s3://<flink-glue-integration-bucket>/flink-checkponts/ \
-D state.checkpoints.num-retained=10 \
-D execution.checkpointing.interval=10s \
-D execution.checkpointing.mode=EXACTLY_ONCE \
-D execution.checkpointing.externalized-checkpoint-retention=RETAIN_ON_CANCELLATION \
-D execution.checkpointing.max-concurrent-checkpoints=1

Desliza hacia la izquierda para ver más

3. Ejecute el siguiente comando para iniciar la CLI del cliente Flink SQL:

/usr/lib/flink/bin/sql-client.sh embedded

Desliza hacia la izquierda para ver más

4. Cree un directorio Flink Hive especificando el tipo de directorio como hive y proporcionando el nombre de su depósito S3:

CREATE CATALOG glue_catalog WITH (
'type' = 'hive',
'default-database' = 'default',
'hive-conf-dir' = '/etc/hive/conf.dist'
);
USE CATALOG glue_catalog;
CREATE DATABASE IF NOT EXISTS flink_cdc_db WITH ('hive.database.location-uri'= 's3://<flink-glue-integration-bucket>/flink-glue-for-hive/warehouse/')
use flink_cdc_db;

Desliza hacia la izquierda para ver más

Debido a que configuramos el catálogo de EMR Hive con el catálogo de datos de Amazon Glue, todas las bases de datos y tablas creadas en el catálogo de Flink Hive se almacenan en el catálogo de datos.

5. Cree una tabla CDC de Flink, proporcionando el nombre de host, el nombre de usuario y la contraseña de la instancia de RDS para MySQL que creó anteriormente.

Tenga en cuenta que, dado que los nombres de usuario y las contraseñas para RDS para MySQL se almacenarán en el Catálogo de datos como atributos de tabla, debe habilitar la autorización de tabla/base de datos de Amazon Glue mediante Amazon Lake Formation para proteger sus datos confidenciales.

CREATE TABLE `glue_catalog`.`flink_cdc_db`.`customer_cdc` (
`CUST_ID` double NOT NULL,
`NAME` STRING NOT NULL,
`MKTSEGMENT` STRING NOT NULL,
PRIMARY KEY (`CUST_ID`) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '<hostname>',
'port' = '3306',
'username' = '<username>',
'password' = '<password>',
'database-name' = 'salesdb',
'table-name' = 'CUSTOMER'
);


CREATE TABLE `glue_catalog`.`flink_cdc_db`.`customer_site_cdc` (
`SITE_ID` double NOT NULL,
`CUST_ID` double NOT NULL,
`ADDRESS` STRING NOT NULL,
`CITY` STRING NOT NULL,
`STATE` STRING NOT NULL,
`COUNTRY` STRING NOT NULL,
`PHONE` STRING NOT NULL,
PRIMARY KEY (`SITE_ID`) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '<hostname>',
'port' = '3306',
'username' = '<username>',
'password' = '<password>',
'database-name' = 'salesdb',
'table-name' = 'CUSTOMER_SITE'
);


CREATE TABLE `glue_catalog`.`flink_cdc_db`.`sales_order_all_cdc` (
`ORDER_ID` int NOT NULL,
`SITE_ID` double NOT NULL,
`ORDER_DATE` TIMESTAMP NOT NULL,
`SHIP_MODE` STRING NOT NULL
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '<hostname>',
'port' = '3306',
'username' = '<username>',
'password' = '<password>',
'database-name' = 'salesdb',
'table-name' = 'SALES_ORDER_ALL',
'scan.incremental.snapshot.enabled' = 'FALSE'
);

Desliza hacia la izquierda para ver más

6. Consulta la tabla que acabas de crear:

SELECT count(O.ORDER_ID) AS ORDER_COUNT,
C.CUST_ID,
C.NAME,
C.MKTSEGMENT
FROM   customer_cdc C
JOIN customer_site_cdc CS
ON C.CUST_ID = CS.CUST_ID
JOIN sales_order_all_cdc O
ON O.SITE_ID = CS.SITE_ID
GROUP  BY C.CUST_ID,
C.NAME,
C.MKTSEGMENT;

Desliza hacia la izquierda para ver más

Obtendrá un resultado de consulta como se muestra en la siguiente captura de pantalla.

e6f019c793479c1b5d759155ca7098d7.png

Almacenar los datos procesados ​​en Amazon S3,

y almacenar metadatos en el catálogo de datos

Cuando extraemos datos de bases de datos relacionales en Amazon RDS para MySQL, los datos originales pueden actualizarse o eliminarse. Para admitir la actualización y eliminación de datos, podemos elegir una tecnología de lago de datos como Apache Iceberg o Apache Hudi para almacenar los datos procesados. Como mencionamos antes, Iceberg y Hudi tienen diferentes mecanismos de gestión de catálogos. Mostramos dos escenarios de uso de Flink para leer/escribir tablas Iceberg y Hudi que contienen metadatos en el catálogo de datos de Amazon Glue.

Para los que no son Iceberg ni Hudi, usamos archivos FileSystem Parquet para mostrar cómo los conectores integrados de Flink usan Data Catalog.

Usando metadatos del catálogo de datos de Glue,

Leer/escribir tablas Iceberg en Flink

El siguiente diagrama muestra la arquitectura de esta configuración.

60ee309fa435c8b8389efd3876af4696.png

1. Cree un catálogo de Flink Iceberg utilizando Data Catalog especificando catalog-impl como org.apache.iceberg.aws.glue.GlueCatalog.

Para obtener más información sobre la integración de Flink y Data Catalog de Iceberg, consulte Glue Catalog (https://iceberg.apache.org/docs/latest/aws/#glue-catalog).

2. En la CLI del cliente Flink SQL, ejecute el siguiente comando y proporcione el nombre de su depósito S3:

CREATE CATALOG glue_catalog_for_iceberg WITH (
'type'='iceberg',
'warehouse'='s3://<flink-glue-integration-bucket>/flink-glue-for-iceberg/warehouse/',
'catalog-impl'='org.apache.iceberg.aws.glue.GlueCatalog',
'io-impl'='org.apache.iceberg.aws.s3.S3FileIO',
'lock-impl'='org.apache.iceberg.aws.glue.DynamoLockManager',
'lock.table'='FlinkGlue4IcebergLockTable' );

Desliza hacia la izquierda para ver más

3. Cree una tabla Iceberg para almacenar los datos procesados:

USE CATALOG glue_catalog_for_iceberg;
CREATE DATABASE IF NOT EXISTS flink_glue_iceberg_db;
USE flink_glue_iceberg_db;
CREATE TABLE `glue_catalog_for_iceberg`.`flink_glue_iceberg_db`.`customer_summary` (
`CUSTOMER_ID` bigint,
`NAME` STRING,
`MKTSEGMENT` STRING,
`COUNTRY` STRING,
`ORDER_COUNT` BIGINT,
PRIMARY KEY (`CUSTOMER_ID`) NOT Enforced
)
WITH (
'format-version'='2',
'write.upsert.enabled'='true');

Desliza hacia la izquierda para ver más

4. Inserte los datos procesados ​​en Iceberg:

INSERT INTO `glue_catalog_for_iceberg`.`flink_glue_iceberg_db`.`customer_summary`
SELECT CAST(C.CUST_ID AS BIGINT) CUST_ID,
C.NAME,
C.MKTSEGMENT,
CS.COUNTRY,
count(O.ORDER_ID) AS ORDER_COUNT
FROM   `glue_catalog`.`flink_cdc_db`.`customer_cdc` C
JOIN `glue_catalog`.`flink_cdc_db`.`customer_site_cdc` CS
ON C.CUST_ID = CS.CUST_ID
JOIN `glue_catalog`.`flink_cdc_db`.`sales_order_all_cdc` O
ON O.SITE_ID = CS.SITE_ID
GROUP  BY C.CUST_ID,
C.NAME,
C.MKTSEGMENT,
CS.COUNTRY;

Desliza hacia la izquierda para ver más

Usando metadatos del catálogo de datos de Glue,

Leer/escribir tablas Hudi en Flink

El siguiente diagrama muestra la arquitectura de esta configuración.

445a341ddf5881ea61333c0cea860fb9.png

Complete los siguientes pasos:

1. Cree un directorio para Hudi que use el directorio de Hive especificando el modo como hms .

Debido a que configuramos Amazon EMR para usar Data Catalog cuando creamos el clúster de EMR, este catálogo de Hudi Hive usa Data Catalog en segundo plano. Para obtener más información sobre la integración de Flink y Data Catalog de Hudi, consulte Creación de un catálogo.

2. En la CLI del cliente Flink SQL, ejecute el siguiente comando y proporcione el nombre de su depósito S3:

CREATE CATALOG glue_catalog_for_hudi WITH (
'type' = 'hudi',
'mode' = 'hms',
'table.external' = 'true',
'default-database' = 'default',
'hive.conf.dir' = '/etc/hive/conf.dist',
'catalog.path' = 's3://<flink-glue-integration-bucket>/flink-glue-for-hudi/warehouse/'
);

Desliza hacia la izquierda para ver más

3. Cree una tabla de Hudi con Data Catalog y proporcione el nombre de su depósito S3:

USE CATALOG glue_catalog_for_hudi;
CREATE DATABASE IF NOT EXISTS flink_glue_hudi_db;
use flink_glue_hudi_db;
CREATE TABLE `glue_catalog_for_hudi`.`flink_glue_hudi_db`.`customer_summary` (
`CUSTOMER_ID` bigint,
`NAME` STRING,
`MKTSEGMENT` STRING,
`COUNTRY` STRING,
`ORDER_COUNT` BIGINT,
PRIMARY KEY (`CUSTOMER_ID`) NOT Enforced
)
WITH (
'connector' = 'hudi',
'write.tasks' = '4',
'path' = 's3://<flink-glue-integration-bucket>/flink-glue-for-hudi/warehouse/customer_summary',
'table.type' = 'COPY_ON_WRITE',
'read.streaming.enabled' = 'true',
'read.streaming.check-interval' = '1'
);

Desliza hacia la izquierda para ver más

4. Inserte los datos procesados ​​en Hudi:

INSERT INTO `glue_catalog_for_hudi`.`flink_glue_hudi_db`.`customer_summary`
SELECT CAST(C.CUST_ID AS BIGINT) CUST_ID,
C.NAME,
C.MKTSEGMENT,
CS.COUNTRY,
count(O.ORDER_ID) AS ORDER_COUNT
FROM   `glue_catalog`.`flink_cdc_db`.`customer_cdc` C
JOIN `glue_catalog`.`flink_cdc_db`.`customer_site_cdc` CS
ON C.CUST_ID = CS.CUST_ID
JOIN `glue_catalog`.`flink_cdc_db`.`sales_order_all_cdc` O
ON O.SITE_ID = CS.SITE_ID
GROUP  BY C.CUST_ID,
C.NAME,
C.MKTSEGMENT,
CS.COUNTRY;

Desliza hacia la izquierda para ver más

Usando metadatos del catálogo de datos de Glue,

Leer/escribir otros formatos de almacenamiento en Flink

El siguiente diagrama muestra la arquitectura de esta configuración.

0660f1596866a652b9dfb4594f600a98.png

Ya creamos el directorio Flink Hive en el paso anterior, así que lo reutilizaremos.

1. En la CLI del cliente Flink SQL, ejecute el siguiente comando:

USE CATALOG glue_catalog;
CREATE DATABASE IF NOT EXISTS flink_hive_parquet_db;
use flink_hive_parquet_db;

Desliza hacia la izquierda para ver más

Cambiamos el dialecto SQL a Hive para crear una tabla usando la sintaxis de Hive.

2. Cree una tabla con el siguiente SQL y proporcione el nombre de su depósito S3:

SET table.sql-dialect=hive;


CREATE TABLE `customer_summary` (
`CUSTOMER_ID` bigint,
`NAME` STRING,
`MKTSEGMENT` STRING,
`COUNTRY` STRING,
`ORDER_COUNT` BIGINT
)
STORED AS parquet
LOCATION 's3://<flink-glue-integration-bucket>/flink-glue-for-hive-parquet/warehouse/customer_summary';

Desliza hacia la izquierda para ver más

Dado que los archivos de Parquet no admiten filas actualizadas, no podemos usar datos de CDC. Sin embargo, podemos usar datos de Iceberg o Hudi.

3. Use el siguiente código para consultar la tabla Iceberg e insertar datos en la tabla Parquet:

SET table.sql-dialect=default;
SET execution.runtime-mode = batch;
INSERT INTO `glue_catalog`.`flink_hive_parquet_db`.`customer_summary`
SELECT * from `glue_catalog_for_iceberg`.`flink_glue_iceberg_db`.`customer_summary`;

Desliza hacia la izquierda para ver más

Confirmar todos los metadatos de la tabla

se almacenan en el catálogo de datos

Puede navegar a la consola de Amazon Glue para confirmar que todas las tablas están almacenadas en el catálogo de datos.

1. En la consola de Amazon Glue, elija  Bases de datos en el panel de navegación para enumerar todas las bases de datos que creamos.

0723c9431b5c5ae9bf40d101bec4f0ad.png

2. Abra una base de datos y verifique que todas las tablas existan en la base de datos.

ce26a13341ed6f12a435e22ac2691932.png

A través de Athena o Amazon EMR Trino 

Uso de datos para el análisis empresarial

Puede utilizar Athena o Amazon EMR Trino para acceder a los datos resultantes.

Consultar datos con Athena

Para acceder a los datos mediante Athena, complete los siguientes pasos:

1. Abra el Editor de consultas de Athena.

2. Seleccione flink_glue_iceberg_db para  Base de datos .

Debería ver la tabla customer_summary en la lista.

3. Ejecute el siguiente script SQL para consultar la tabla de resultados de Iceberg:

select * from customer_summary order by order_count desc limit 10

Desliza hacia la izquierda para ver más

Los resultados de la consulta se verán como la siguiente captura de pantalla.

e12ca46d8caa066a628e9ce26b81d904.png

4. Para la tabla Hudi, cambie  la base de datos a flink_glue_hudi_db y ejecute la misma consulta SQL.

ee7dab75dc0f91805aa4eed3c9d1e69d.png

5. Para las tablas de Parquet, cambie  la base de datos a flink_hive_parquet_db y ejecute la misma consulta SQL.

a6872afb7b2154838c3e0f55383349bf.png

Consultar datos con Amazon EMR Trino

Para acceder a Iceberg mediante Amazon EMR Trino, conéctese al nodo principal de EMR a través de SSH.

1. Ejecute el siguiente comando para iniciar Trino CLI:

trino-cli --catalog iceberg

Amazon EMR Trino ahora puede consultar tablas en el catálogo de datos de Amazon Glue.

2. Ejecute el siguiente comando para consultar la tabla de resultados:

show schemas;
use flink_glue_iceberg_db;
show tables;
select * from customer_summary order by order_count desc limit 10;

Desliza hacia la izquierda para ver más

El resultado de la consulta se parece a la siguiente captura de pantalla.

2453ad5dc5392baf43b1867093da0ed9.png

3. Salga de la CLI de Trino.

4. Inicie la CLI de Trino utilizando el catálogo de Hive para consultar las tablas de Hudi:

trino-cli --catalog hive

5. Ejecute el siguiente comando para consultar la tabla Hudi:

show schemas;
use flink_glue_hudi_db;
show tables;
select * from customer_summary order by order_count desc limit 10;

Desliza hacia la izquierda para ver más

Actualice y elimine registros de origen en Amazon RDS para MySQL y verifique los cambios correspondientes en las tablas del lago de datos

Podemos actualizar y eliminar algunos registros en la base de datos RDS for MySQL y luego verificar que los cambios se reflejen en las tablas Iceberg y Hudi.

1. Conéctese a la base de datos RDS para MySQL y ejecute el siguiente SQL:

update CUSTOMER set NAME = 'updated_name' where CUST_ID=7;


delete from CUSTOMER where CUST_ID=11;

Desliza hacia la izquierda para ver más

2. Utilice Athena o Amazon EMR Trino para consultar la tabla customer_summary.

Los registros actualizados y eliminados se reflejan en las tablas Iceberg y Hudi.

0c1cb8c2305ee6445909ffbb2e01d19c.png

limpiar

Después de completar este ejercicio, complete los siguientes pasos para eliminar su recurso y dejar de acumular cargos:

1. Elimine la base de datos RDS para MySQL.

2. Elimine el clúster de EMR.

3. Elimine la base de datos y las tablas creadas en Data Catalog.

4. Elimine el archivo en Amazon S3.

resumen

Esta publicación le muestra cómo integrar Apache Flink en Amazon EMR con Amazon Glue Data Catalog. Puede usar el conector Flink SQL para leer/escribir datos en diferentes áreas de almacenamiento como Kafka, CDC, HBase, Amazon S3, Iceberg o Hudi. También puede almacenar metadatos en Data Catalog. La API de tabla de Flink tiene el mismo mecanismo de implementación de conector y catálogo. En una sola sesión, podemos usar varias instancias de catálogos que apunten a diferentes tipos (como IcebergCatalog y HiveCatalog) y luego usarlos indistintamente en las consultas. También puede escribir código utilizando Flink Table API para desarrollar la misma solución integrando Flink y Data Catalog.

En nuestra solución, usamos RDS para registros binarios de MySQL directamente a través de Flink CDC. También puede usar registros binarios con MySQL Debezim usando Amazon MSK Connect y almacenar los datos en Amazon Managed Streaming para Apache Kafka (Amazon MSK). Para obtener más información, consulte Crear una canalización de fuente a lago de datos de baja latencia con Amazon MSK Connect, Apache Flink y Apache Hudi (https://aws.amazon.com/blogs/big-data/create-a-low -latency -source-to-data-lake-pipeline-using-amazon-msk-connect-apache-flink-and-apache-hudi/).

Con las capacidades unificadas de procesamiento de datos por lotes y transmisión por secuencias de Amazon EMR Flink, puede ingerir y procesar datos a través de un único motor de cómputo. Al integrar Apache Iceberg y Hudi en Amazon EMR, puede crear un lago de datos escalable y evolutivo. Con Amazon Glue Data Catalog, puede administrar de forma centralizada todos los catálogos de datos empresariales y consumir datos fácilmente.

Siga los pasos de esta publicación para crear una solución unificada de procesamiento por lotes y secuencias con Amazon EMR Flink y Amazon Glue Data Catalog. Si tiene alguna pregunta, por favor deje un comentario.

El autor de este artículo

238876249a7925f895e1e8dd4aeeb568.jpeg

jianwei li

Especialista en Analítica Avanzada en TAM. Asesora a los clientes de Amazon Enterprise Support sobre el diseño y la creación de plataformas de datos modernas.

ccb9384bf3265153ba9d0f35baf19556.jpeg

Deb Samrat

 Ingeniero de desarrollo de software en Amazon EMR. En su tiempo libre, disfruta explorando nuevos lugares, diferentes culturas y cocinas.

c9752d2e535ed6602fa02dd82713b4ed.jpeg

Prabhu Joseph Raj 

es ingeniero sénior de desarrollo de software en Amazon EMR. Se enfoca en liderar equipos que crean soluciones en Apache Hadoop y Apache Flink. En su tiempo libre, Prabhu disfruta pasar tiempo con su familia.

7989c2ede22d3a677b4760a491cb1944.gif

004646c8a930f53ea9fef8c52283861a.gif

Escuché, haga clic en los 4 botones a continuación

¡No encontrarás errores!

d08543b3bb7a57e8cc261e4b55b9ded9.gif

Supongo que te gusta

Origin blog.csdn.net/u012365585/article/details/131714777
Recomendado
Clasificación