Este tema describe cómo utilizar el conector de Apache Iceberg.
Contexto
Apache Iceberg es un formato de tabla de data lake abierto. Puede usar Apache Iceberg para crear rápidamente su propio servicio de almacenamiento de data lake en HDFS o en OSS en la nube, y utilizar motores de cómputo del ecosistema de big data de código abierto, como Flink, Spark, Hive y Presto, para realizar análisis de data lake.
|
Categoría |
Descripción |
|
Tipos compatibles |
Tabla de origen, tabla de destino y destino de ingesta de datos |
|
Modos de ejecución |
Modo por lotes y modo streaming |
|
Formato de datos |
No aplica |
|
Métricas específicas |
Ninguna |
|
Tipos de API |
SQL, trabajo YAML de ingesta de datos |
|
Admite actualización o eliminación de datos en tablas de destino |
Sí |
Funciones
El conector de Apache Iceberg ofrece las siguientes funciones:
Crea un servicio de almacenamiento de data lake ligero y de bajo costo basado en HDFS o object storage.
Proporciona semántica ACID completa.
Admite consultas de viaje en el tiempo para acceder a versiones históricas de los datos.
Permite un filtrado eficiente de datos.
Admite la evolución de esquemas.
Admite la evolución de particiones.
Utilice las capacidades de tolerancia a fallos y procesamiento de flujos de Flink para importar grandes volúmenes de datos de registros a un data lake de Apache Iceberg en tiempo real. Posteriormente, puede usar Flink u otros motores de análisis para extraer valor de los datos.
Límites
El conector de Apache Iceberg solo es compatible con Realtime Compute for Apache Flink que utiliza Ververica Runtime (VVR) 4.0.8 o posterior. El conector de Apache Iceberg debe usarse con un catálogo de Data Lake Formation (DLF). Para obtener más información, consulte Manage DLF-Legacy catalogs.
-
El conector de Apache Iceberg admite los formatos de tabla v1 y v2 de Apache Iceberg. Para obtener más información, consulte la Especificación de tabla de Iceberg.
NotaSolo Realtime Compute for Apache Flink con VVR 8.0.7 o posterior admite el formato de tabla v2.
En el modo de lectura streaming, solo puede usar tablas de Iceberg de tipo append-only como tablas de origen.
Sintaxis
CREATE TABLE iceberg_table (
id BIGINT,
data STRING
PRIMARY KEY(`id`) NOT ENFORCED
)
PARTITIONED BY (data)
WITH (
'connector' = 'iceberg',
...
);
Opciones WITH
Opciones comunes
|
Parámetro |
Descripción |
Tipo |
Obligatorio |
Predeterminado |
Observaciones |
|
connector |
El tipo de conector. |
String |
Sí |
Ninguna |
El valor debe ser |
|
catalog-name |
El nombre del catálogo. |
String |
Sí |
Ninguna |
Introduzca un nombre personalizado en inglés. |
|
catalog-database |
El nombre de la base de datos. |
String |
Sí |
default |
El nombre de su base de datos en Data Lake Formation (DLF), por ejemplo, dlf_db. Nota
Si no cuenta con una base de datos de Data Lake Formation (DLF), cree una primero. |
|
io-impl |
La clase de implementación para el sistema de archivos distribuido. |
String |
Sí |
Ninguna |
El valor debe ser |
|
oss.endpoint |
El endpoint de Object Storage Service (OSS) de Alibaba Cloud. |
String |
No |
Ninguna |
Para obtener más información, consulte Regions and Endpoints. Nota
|
|
El ID de AccessKey de su cuenta de Alibaba Cloud. |
String |
Sí |
Ninguna |
Para obtener más información, consulte How do I view the AccessKey ID and AccessKey secret? Importante
Para evitar que su información de AccessKey se filtre, se recomienda utilizar variables para especificar los valores de AccessKey. Para obtener más información, consulte Project variables. |
|
El secreto de AccessKey de su cuenta de Alibaba Cloud. |
String |
Sí |
Ninguna |
|
|
catalog-impl |
El nombre de la clase del catálogo. |
String |
Sí |
Ninguna |
El valor debe ser |
|
warehouse |
La ruta de OSS para almacenar los datos de la tabla. |
String |
Sí |
Ninguna |
Ninguna |
|
dlf.catalog-id |
El ID de su cuenta de Alibaba Cloud. |
String |
Sí |
Ninguna |
Puede obtener el ID de la cuenta en la página User Information. |
|
dlf.endpoint |
El endpoint de Data Lake Formation (DLF). |
String |
Sí |
Ninguna |
. Nota
|
|
dlf.region-id |
La región de Data Lake Formation (DLF). |
String |
Sí |
Ninguna |
. Nota
Asegúrese de que la región coincida con la región especificada en el parámetro dlf.endpoint. |
Opciones exclusivas de destino
|
Parámetro |
Descripción |
Tipo |
Obligatorio |
Predeterminado |
Observaciones |
|
write.operation |
El modo de operación de escritura. |
String |
No |
upsert |
|
|
hive_sync.enable |
Especifica si se deben sincronizar los metadatos con Hive. |
Boolean |
No |
false |
Valores válidos:
|
|
hive_sync.mode |
El modo de sincronización de metadatos de Hive. |
String |
No |
hms |
|
|
hive_sync.db |
El nombre de la base de datos de Hive con la que se sincronizan los datos. |
String |
No |
El nombre de la base de datos de la tabla actual en el catálogo. |
Ninguna |
|
hive_sync.table |
El nombre de la tabla de Hive con la que se sincronizan los datos. |
String |
No |
El nombre de la tabla actual. |
Ninguna |
|
dlf.catalog.region |
La región de Data Lake Formation (DLF). |
String |
No |
Ninguna |
. Nota
|
|
dlf.catalog.endpoint |
El endpoint de Data Lake Formation (DLF). |
String |
No |
Ninguna |
. Nota
|
Mapeo de tipos de datos
|
Tipo de Iceberg |
Tipo de Flink |
|
BOOLEAN |
BOOLEAN |
|
INT |
INT |
|
LONG |
BIGINT |
|
FLOAT |
FLOAT |
|
DOUBLE |
DOUBLE |
|
DECIMAL(P,S) |
DECIMAL(P,S) |
|
DATE |
DATE |
|
TIME |
TIME Nota
Las marcas de tiempo de Iceberg tienen precisión de microsegundos, mientras que las de Flink tienen precisión de milisegundos. Cuando usa Flink para leer datos de Iceberg, Flink convierte la precisión temporal a milisegundos. |
|
TIMESTAMP |
TIMESTAMP |
|
TIMESTAMPTZ |
TIMESTAMP_LTZ |
|
STRING |
STRING |
|
FIXED(L) |
BYTES |
|
BINARY |
VARBINARY |
|
STRUCT<...> |
ROW |
|
LIST<E> |
LIST |
|
MAP<K,V> |
MAP |
Ejemplos
Asegúrese de contar con un bucket de OSS y una base de datos de Data Lake Formation (DLF). Para obtener más información, consulte Create a bucket y Databases, tables, and functions.
Cuando especifique una path para su base de datos de Data Lake Formation (DLF), se recomienda seguir el formato ${warehouse}/${database_name}.db. Por ejemplo, si la dirección del almacén es oss://iceberg-test/warehouse y el nombre de la base de datos es dlf_db, establezca la ruta de OSS de dlf_db como oss://iceberg-test/warehouse/dlf_db.db.
Ejemplo de tabla de destino
Este ejemplo utiliza el conector Datagen para generar datos streaming aleatorios y escribirlos en una tabla de Iceberg.
CREATE TEMPORARY TABLE datagen(
id BIGINT,
data STRING
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE dlf_iceberg (
id BIGINT,
data STRING
) WITH (
'connector' = 'iceberg',
'catalog-name' = '<yourCatalogName>',
'catalog-database' = '<yourDatabaseName>',
'io-impl' = 'org.apache.iceberg.aliyun.oss.OSSFileIO',
'oss.endpoint' = '<yourOSSEndpoint>',
'access.key.id' = '${secret_values.ak_id}',
'access.key.secret' = '${secret_values.ak_secret}',
'catalog-impl' = 'org.apache.iceberg.aliyun.dlf.DlfCatalog',
'warehouse' = '<yourOSSWarehousePath>',
'dlf.catalog-id' = '<yourCatalogId>',
'dlf.endpoint' = '<yourDLFEndpoint>',
'dlf.region-id' = '<yourDLFRegionId>'
);
INSERT INTO dlf_iceberg SELECT * FROM datagen;
Ejemplos de tablas de origen
-
Use un catálogo DLF para escribir datos desde una tabla de origen de Iceberg hacia una tabla de destino de Iceberg.
CREATE TEMPORARY TABLE src_iceberg ( id BIGINT, data STRING ) WITH ( 'connector' = 'iceberg', 'catalog-name' = '<yourCatalogName>', 'catalog-database' = '<yourDatabaseName>', 'io-impl' = 'org.apache.iceberg.aliyun.oss.OSSFileIO', 'oss.endpoint' = '<yourOSSEndpoint>', 'access.key.id' = '${secret_values.ak_id}', 'access.key.secret' = '${secret_values.ak_secret}', 'catalog-impl' = 'org.apache.iceberg.aliyun.dlf.DlfCatalog', 'warehouse' = '<yourOSSWarehousePath>', 'dlf.catalog-id' = '<yourCatalogId>', 'dlf.endpoint' = '<yourDLFEndpoint>', 'dlf.region-id' = '<yourDLFRegionId>' ); CREATE TEMPORARY TABLE dst_iceberg ( id BIGINT, data STRING ) WITH ( 'connector' = 'iceberg', 'catalog-name' = '<yourCatalogName>', 'catalog-database' = '<yourDatabaseName>', 'io-impl' = 'org.apache.iceberg.aliyun.oss.OSSFileIO', 'oss.endpoint' = '<yourOSSEndpoint>', 'access.key.id' = '${secret_values.ak_id}', 'access.key.secret' = '${secret_values.ak_secret}', 'catalog-impl' = 'org.apache.iceberg.aliyun.dlf.DlfCatalog', 'warehouse' = '<yourOSSWarehousePath>', 'dlf.catalog-id' = '<yourCatalogId>', 'dlf.endpoint' = '<yourDLFEndpoint>', 'dlf.region-id' = '<yourDLFRegionId>' ); BEGIN STATEMENT SET; INSERT INTO src_iceberg VALUES (1, 'AAA'), (2, 'BBB'), (3, 'CCC'), (4, 'DDD'), (5, 'EEE'); INSERT INTO dst_iceberg SELECT * FROM src_iceberg; END;
Ingesta de datos
Puede utilizar el conector de Apache Iceberg como destino en un trabajo YAML para la ingesta de datos.
Sintaxis
sink:
type: iceberg
name: Iceberg Sink
catalog.properties.rest.signing-region: cn-beijing
catalog.properties.uri: http://cn-beijing-vpc.dlf.aliyuncs.com/iceberg
catalog.properties.warehouse: flink_iceberg
catalog.properties.type: rest
catalog.properties.io-impl: org.apache.iceberg.rest.DlfFileIO
Parámetros
|
Parámetro |
Descripción |
Obligatorio |
Tipo |
Predeterminado |
Observaciones |
|
type |
El tipo de conector. |
Sí |
STRING |
Ninguna |
El valor fijo es |
|
name |
El nombre del destino. |
No |
STRING |
Ninguna |
El nombre del destino. |
|
catalog.properties.rest.signing-region |
El ID de región de DLF. Para obtener más información, consulte Service endpoints. |
Sí |
STRING |
Ninguna |
Ninguna |
|
catalog.properties.uri |
La URI utilizada para acceder al catálogo REST de DLF. Para obtener más información, consulte Iceberg REST. |
Sí |
STRING |
Ninguna |
Ninguna |
|
catalog.properties.warehouse |
El directorio raíz para el almacenamiento de archivos. |
Sí |
STRING |
Ninguna |
Ninguna |
|
catalog.properties.warehouse |
El directorio raíz para el almacenamiento de archivos. |
No |
STRING |
Ninguna |
Ninguna |
|
catalog.properties.type |
El tipo de catálogo. El valor debe ser rest. |
Sí |
STRING |
rest |
Ninguna |
|
catalog.properties.io-impl |
El valor debe ser org.apache.iceberg.rest.DlfFileIO. |
Sí |
STRING |
org.apache.iceberg.rest.DlfFileIO |
Ninguna |
|
partition.key |
La clave de partición para cada tabla particionada. |
No |
STRING |
Ninguna |
Puede configurar claves de partición para varias tablas. Separe las definiciones de tabla con punto y coma ( Para las particiones que requieren transformaciones implícitas, agregue la función de transformación directamente al campo de partición. Ejemplo: |
|
table.properties.* |
Los parámetros para crear una tabla de Iceberg. |
No |
String |
Ninguna |
Para obtener más información, consulte Opciones de tabla de Iceberg. |
Reutilizar un catálogo existente
A partir de VVR 11.5, puede hacer referencia directa a un catálogo integrado de Iceberg creado en la página Data Management dentro de un trabajo de ingesta de datos de Flink CDC. Esto simplifica su configuración al reducir la cantidad de propiedades de conexión obligatorias.
sink:
type: iceberg
using.built-in-catalog: iceberg_catalog
Los trabajos de ingesta de datos pueden reutilizar automáticamente todos los parámetros del catálogo de Iceberg. Esto equivale a configurar manualmente los parámetros con el prefijo catalog.properties. en su trabajo YAML.
Si desea anular los parámetros reutilizados, puede especificar explícitamente los parámetros YAML correspondientes. Estos parámetros tendrán prioridad.
Ejemplo
A continuación se muestra un ejemplo de cómo usar un catálogo DLF como catálogo de Iceberg y escribir datos en Data Lake Formation (DLF):
-
Para obtener información sobre los parámetros con el prefijo catalog.properties, consulte Create an Iceberg DLF catalog.
source: type: mysql name: MySQL Source hostname: ${secret_values.mysql.hostname} port: ${mysql.port} username: ${secret_values.mysql.username} password: ${secret_values.mysql.password} tables: ${mysql.source.table} server-id: 8601-8604 sink: type: iceberg name: Iceberg Sink catalog.properties.rest.signing-region: cn-beijing catalog.properties.uri: http://cn-beijing-vpc.dlf.aliyuncs.com/iceberg catalog.properties.warehouse: flink_iceberg catalog.properties.type: rest catalog.properties.io-impl: org.apache.iceberg.rest.DlfFileIO
Cambios de esquema
Cuando se utiliza como destino de ingesta de datos, el conector de Apache Iceberg admite los siguientes cambios de esquema:
CREATE TABLE
ADD COLUMN
ALTER COLUMN TYPE (No se admite la modificación del tipo de una columna de clave principal).
RENAME COLUMN
DROP COLUMN
TRUNCATE TABLE
DROP TABLE
Si la tabla de Iceberg descendente ya existe, el trabajo utiliza el esquema de la tabla existente para las escrituras y no vuelve a crear la tabla.
Documentación relacionada
Para obtener más información sobre los conectores compatibles con Flink, consulte Supported connectors.