O Iceberg é um formato de tabela aberto para data lakes. Com ele, você constrói rapidamente um service de armazenamento de data lake no Hadoop Distributed File System (HDFS) ou no Alibaba Cloud Object Storage Service (OSS). Este tópico descreve como ler e gravar tabelas Iceberg no EMR Serverless Spark.
Pré-requisitos
Crie um workspace. Create a workspace.
Procedimento
Tanto o SparkSQL quanto os notebooks permitem leitura e gravação em tabelas Iceberg. O exemplo a seguir utiliza um job SparkSQL.
Etapa 1: Criar um recurso de sessão
-
Acesse a página Sessions.
Faça logon no console EMR.
No painel de navegação à esquerda, escolha EMR Serverless > Spark.
Na página Spark, clique em nome do workspace desejado.
Na página EMR Serverless Spark, clique em Sessions no painel de navegação à esquerda.
Na página SQL Session, clique em Connect to SQL Session.
-
Na página Connect to SQL Session, configure os parâmetros abaixo na seção Spark Configuration e clique em Create. Para mais informações, consulte Manage SQL sessions.
O Spark lê e grava tabelas Iceberg por meio de um catalog. Escolha um catalog conforme seu caso de uso. Para mais detalhes sobre catalogs, consulte Manage data catalogs.
Data catalog
Ao utilizar um data catalog, não é necessário configurar parâmetros na sessão. Na página Catalog, clique em Add Catalog. Em seguida, selecione o data catalog diretamente no ambiente de desenvolvimento SparkSQL.
NotaPara acessar o Iceberg no DLF (anteriormente DLF 2.5), utilize a versão do mecanismo esr-4.7.0, esr-3.6.0 ou superior.
Para acessar o Iceberg no DLF 1.0 (anteriormente DLF-Legacy) ou Hive Metastore, utilize a versão do mecanismo esr-4.3.0, esr-3.3.0, esr-2.7.0 ou superior.
Custom catalog
DLF (formerly DLF 2.5)
NotaRequisito de versão do mecanismo: esr-4.7.0, esr-3.6.0 ou superior.
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.iceberg_catalog org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.iceberg_catalog.catalog-impl org.apache.iceberg.rest.RESTCatalog spark.sql.catalog.iceberg_catalog.uri http://<regionID>-vpc.dlf.aliyuncs.com spark.sql.catalog.iceberg_catalog.warehouse <catalog_name> spark.sql.catalog.iceberg_catalog.io-impl org.apache.iceberg.rest.DlfFileIO spark.sql.catalog.iceberg_catalog.rest.auth.type sigv4 spark.sql.catalog.iceberg_catalog.rest.auth.sigv4.delegate-auth-type none spark.sql.catalog.iceberg_catalog.rest.signing-region <regionID> spark.sql.catalog.iceberg_catalog.rest.signing-name DlfNext spark.sql.catalog.iceberg_catalog.rest.access-key-id <access_key_id> spark.sql.catalog.iceberg_catalog.rest.secret-access-key <access_key_secret>A tabela a seguir descreve os parâmetros.
Parâmetro
Descrição
Valor de exemplo
spark.sql.extensionsAtiva as extensões Spark do Iceberg.
Valor fixo:
org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsspark.sql.catalog.iceberg_catalogRegistra um catalog Spark chamado
iceberg_catalog.Valor fixo:
org.apache.iceberg.spark.SparkCatalogspark.sql.catalog.iceberg_catalog.catalog-implDefine a implementação subjacente do catalog como o catalog REST do Iceberg.
org.apache.iceberg.rest.RESTCatalogspark.sql.catalog.iceberg_catalog.uriEndpoint da API REST para o service DLF Iceberg. O formato é
http://<regionID>-vpc.dlf.aliyuncs.com.http://cn-hangzhou-vpc.dlf.aliyuncs.comspark.sql.catalog.iceberg_catalog.warehouseNome do catalog DLF associado.
NotaNão associe um catalog DLF criado a partir de um compartilhamento de dados.
<catalog_name>spark.sql.catalog.iceberg_catalog.io-implUtiliza a implementação FileIO personalizada do DLF.
Valor fixo:
org.apache.iceberg.rest.DlfFileIOspark.sql.catalog.iceberg_catalog.rest.auth.typeHabilita o mecanismo de assinatura AWS Signature Version 4 (SigV4) para autenticar requisições REST.
sigv4spark.sql.catalog.iceberg_catalog.rest.auth.sigv4.delegate-auth-typeDesativa a autenticação delegada. O cliente deve fornecer um AccessKey ID e AccessKey Secret para assinar as requisições.
nonespark.sql.catalog.iceberg_catalog.rest.signing-regionRegião utilizada para assinatura. Este valor deve corresponder à região onde o service DLF está implantado.
cn-hangzhouspark.sql.catalog.iceberg_catalog.rest.signing-nameNome do service usado para assinatura.
Valor fixo:
DlfNextspark.sql.catalog.iceberg_catalog.rest.access-key-idAccessKey ID da sua conta Alibaba Cloud ou usuário RAM.
<access_key_id>spark.sql.catalog.iceberg_catalog.rest.secret-access-keyAccessKey Secret da sua conta Alibaba Cloud ou usuário RAM.
<access_key_secret>DLF 1.0 (formerly DLF-Legacy)
NotaRequisito de versão do mecanismo: esr-4.3.0, esr-3.3.0, esr-2.7.0 ou superior.
Os metadados são armazenados no DLF 1.0 (anteriormente DLF-Legacy).
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.<catalogName> org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.<catalogName>.catalog-impl org.apache.iceberg.aliyun.dlf.hive.DlfCatalog spark.sql.catalog.<catalogName>.dlf.catalog.id <catalog_name>A tabela a seguir descreve os parâmetros.
Parâmetro
Descrição
Valor de exemplo
spark.sql.extensionsAtiva as extensões Spark do Iceberg.
Valor fixo:
org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsspark.sql.catalog.<catalogName>Registra um catalog chamado
<catalogName>.Valor fixo:
org.apache.iceberg.spark.SparkCatalogspark.sql.catalog.<catalogName>.catalog-implEspecifica a implementação compatível com Hive do Alibaba Cloud DLF 1.0, que se conecta ao service de metadados do DLF 1.0.
Valor fixo:
org.apache.iceberg.aliyun.dlf.hive.DlfCatalogspark.sql.catalog.<catalogName>.dlf.catalog.idDefine o nome do catalog DLF associado.
<catalog_name>Hive Metastore
Os metadados ficam armazenados em um Hive Metastore específico.
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.<catalogName> org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.<catalogName>.catalog-impl org.apache.iceberg.hive.HiveCatalog spark.sql.catalog.<catalogName>.uri thrift://<yourHMSUri>:<port>A tabela a seguir descreve os parâmetros.
Parâmetro
Descrição
Valor de exemplo
spark.sql.extensionsAtiva as extensões Spark do Iceberg.
Valor fixo:
org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsspark.sql.catalog.<catalogName>Registra um catalog chamado
<catalogName>.Valor fixo:
org.apache.iceberg.spark.SparkCatalogspark.sql.catalog.<catalogName>.catalog-implIndica que o catalog usa a implementação oficial
HiveCatalogdo Iceberg para gerenciar metadados no Hive Metastore.Valor fixo:
org.apache.iceberg.hive.HiveCatalogspark.sql.catalog.<catalogName>.uriURI do Hive Metastore. O formato é
thrift://<Hive metastore IP address>:9083.<Hive metastore IP address>corresponde ao endereço IP interno do service HMS. Caso precise especificar um service de metastore externo, consulte Connect to an external Hive Metastore Service.thrift://192.168.**.**:9083File system
Os metadados residem em um sistema de arquivos.
spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.<catalogName> org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.<catalogName>.type hadoop spark.sql.catalog.<catalogName>.warehouse oss://<yourBucketName>/warehouseA tabela a seguir descreve os parâmetros.
Parâmetro
Descrição
Valor de exemplo
spark.sql.extensionsAtiva as extensões Spark do Iceberg.
Valor fixo:
org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensionsspark.sql.catalog.<catalogName>Registra um catalog chamado
<catalogName>.Valor fixo:
org.apache.iceberg.spark.SparkCatalogspark.sql.catalog.<catalogName>.typeDefine o tipo de catalog como
hadoop. O HadoopCatalog armazena metadados diretamente no sistema de arquivos, sem exigir um Hive Metastore.hadoopspark.sql.catalog.<catalogName>.warehouseEspecifica o caminho para armazenamento de metadados. Neste caminho,
<yourBucketName>representa o nome do bucket OSS.oss://<yourBucketName>/warehouse
Etapa 2: Ler e gravar tabelas Iceberg****
-
Acesse a página Data Development.
Na página EMR Serverless Spark, clique em Development no painel de navegação à esquerda.
Na aba Development, clique em ícone
.Na caixa de diálogo Create, insira um nome como users_task, mantenha o Type como SparkSQL (padrão) e clique em OK.
-
Copie o código abaixo para a nova aba SparkSQL (users_task).
NotaSe nenhum banco de dados for especificado, a tabela será criada no banco
defaultdo catalog. Também é possível criar e indicar um banco de dados diferente.-- Create a database. CREATE DATABASE IF NOT EXISTS iceberg_catalog.db; -- Create a non-partitioned table. CREATE TABLE iceberg_catalog.db.tbl ( id BIGINT NOT NULL COMMENT 'unique id', data STRING ) USING iceberg; -- Insert data into the non-partitioned table. INSERT INTO iceberg_catalog.db.tbl VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie'); -- Query all data from the non-partitioned table. SELECT * FROM iceberg_catalog.db.tbl; -- Query the non-partitioned table with a condition. SELECT * FROM iceberg_catalog.db.tbl WHERE id = 2; -- Update data in the non-partitioned table. UPDATE iceberg_catalog.db.tbl SET data = 'David' WHERE id = 3; -- Query again to confirm the update. SELECT * FROM iceberg_catalog.db.tbl WHERE id = 3; -- Delete data from the non-partitioned table. DELETE FROM iceberg_catalog.db.tbl WHERE id = 1; -- Query again to confirm the deletion. SELECT * FROM iceberg_catalog.db.tbl; -- Create a partitioned table. CREATE TABLE iceberg_catalog.db.part_tbl ( id BIGINT, data STRING, category STRING, ts TIMESTAMP, dt DATE ) USING iceberg PARTITIONED BY (dt, category); -- Insert data into the partitioned table. INSERT INTO iceberg_catalog.db.part_tbl VALUES (1 , 'data-01', 'A', timestamp'2026-01-01 10:00:00', date'2026-01-01'), (2 , 'data-02', 'A', timestamp'2026-01-01 11:00:00', date'2026-01-01'), (3 , 'data-03', 'A', timestamp'2026-01-02 09:30:00', date'2026-01-02'), (4 , 'data-04', 'B', timestamp'2026-01-02 12:15:00', date'2026-01-02'), (5 , 'data-05', 'B', timestamp'2026-01-03 08:05:00', date'2026-01-03'), (6 , 'data-06', 'B', timestamp'2026-01-03 14:20:00', date'2026-01-03'), (7 , 'data-07', 'C', timestamp'2026-01-04 16:45:00', date'2026-01-04'), (8 , 'data-08', 'C', timestamp'2026-01-04 18:10:00', date'2026-01-04'), (9 , 'data-09', 'C', timestamp'2026-01-05 07:55:00', date'2026-01-05'), (10, 'data-10', 'A', timestamp'2026-01-05 13:35:00', date'2026-01-05'); -- Query all data from the partitioned table. SELECT * FROM iceberg_catalog.db.part_tbl; -- Query data from the partition where dt='2026-01-01'. SELECT * FROM iceberg_catalog.db.part_tbl WHERE dt='2026-01-01'; -- Query data for a specific category. SELECT * FROM iceberg_catalog.db.part_tbl WHERE category = 'A'; -- Perform a query with multiple conditions (day + category). SELECT * FROM iceberg_catalog.db.part_tbl WHERE dt='2026-01-01' AND category = 'A'; -- Aggregate and count the number of records in each category. SELECT category, COUNT(*) AS count FROM iceberg_catalog.db.part_tbl GROUP BY category; -- Drop the database (use with caution). Before you drop the database, make sure that it contains no tables. -- DROP DATABASE iceberg_catalog.db; Na lista suspensa de sessões, selecione a instância de sessão SQL criada e clique em Execute. Após a conclusão da consulta de agregação, a saída exibirá: categoria B (3), categoria C (3) e categoria A (4).
Referências
Para mais informações sobre o uso e a configuração do Iceberg, consulte Apache Iceberg.
Para obter detalhes sobre a criação de um recurso de sessão SQL, consulte Manage SQL sessions.
Para obter detalhes sobre a criação de um recurso de sessão de notebook, consulte Manage notebook sessions.