Componente opcional do Iceberg do Dataproc

É possível instalar outros componentes, como o Iceberg, ao criar um cluster do Dataproc usando o recurso Componentes opcionais. Nesta página, descrevemos como instalar o componente Iceberg em um cluster do Dataproc.

Visão geral

O Apache Iceberg é um formato de tabela aberto para grandes conjuntos de dados analíticos. Ele traz a confiabilidade e a simplicidade das tabelas SQL para o Big Data, permitindo que mecanismos como Spark, Trino, PrestoDB, Flink e Hive trabalhem com segurança com as mesmas tabelas ao mesmo tempo.

Quando instalado em um cluster do Dataproc, o componente Apache Iceberg instala as bibliotecas do Iceberg e configura o Spark e o Hive para trabalhar com o Iceberg no cluster.

Principais recursos do Iceberg

Os recursos do Iceberg incluem:

  • Evolução do esquema:adicione, remova ou renomeie colunas sem precisar reescrever a tabela inteira.
  • Viagem no tempo:consulte snapshots de tabelas históricas para fins de auditoria ou reversão.
  • Particionamento oculto:otimize o layout de dados para consultas mais rápidas sem expor detalhes da partição aos usuários.
  • Transações ACID:garanta a consistência dos dados e evite conflitos.

Versões de imagem compatíveis do Dataproc

É possível instalar o componente Iceberg em clusters do Dataproc criados com a versão 2.2.47 e versões mais recentes da imagem. A versão do Iceberg instalada no cluster é listada na página 2.2 release versions.

Quando você cria um cluster do Dataproc com o Iceberg, as seguintes propriedades do Spark e do Hive são configuradas para funcionar com o Iceberg.

Arquivo de configuração Propriedade Valor padrão
/etc/spark/conf/spark-defaults.conf spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.driver.extraClassPath /usr/lib/iceberg/lib/iceberg-spark-runtime-spark-version_scala-version.jar
spark.executor.extraClassPath /usr/lib/iceberg/lib/iceberg-spark-runtime-spark-version_scala-version.jar
/etc/hive/conf/hive-site.xml hive.aux.jars.path file:///usr/lib/iceberg/lib/iceberg-hive-runtime.jar
iceberg.engine.hive.enabled true

Instalar o componente opcional do Iceberg

Instale o componente Iceberg ao criar um cluster do Dataproc. As páginas da Lista de versões de imagem do cluster do Dataproc mostram a versão do componente Iceberg incluída nas versões mais recentes da imagem do cluster do Dataproc.

Console do Google Cloud

Para criar um cluster do Dataproc que instale o componente Iceberg, conclua as etapas a seguir no console do Google Cloud:

  1. Abra a página Criar um cluster do Dataproc. O painel Configurar cluster está selecionado.
  2. Na seção Componentes, em Componentes opcionais, selecione o componente Iceberg.
  3. Confirme ou especifique outras configurações do cluster e clique em Criar.

Google Cloud CLI

Para criar um cluster do Dataproc que instale o componente Iceberg, use o comando gcloud dataproc clusters create com a flag --optional-components.

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --optional-components=ICEBERG \
     other flags ...

Substitua:

API REST

Para criar um cluster do Dataproc que instale o componente opcional do Iceberg, especifique o Iceberg SoftwareConfig.Component como parte de uma solicitação clusters.create.

Usar tabelas Iceberg com o Spark e o Hive

Depois de criar um cluster do Dataproc com o componente opcional do Iceberg instalado, use o Spark e o Hive para ler e gravar dados de tabelas do Iceberg.

Spark

Configurar uma sessão do Spark para o Iceberg

É possível usar o comando da CLI gcloud localmente ou os REPLs (loops de leitura-avaliação-impressão) spark-shell ou pyspark executados no nó mestre do cluster do Dataproc para ativar as extensões do Spark do Iceberg e configurar o catálogo do Spark para usar tabelas do Iceberg.

gcloud

Execute o exemplo de CLI gcloud abaixo em uma janela de terminal local ou no Cloud Shell para enviar um job do Spark e definir propriedades do Spark para configurar a sessão do Spark para o Iceberg.

gcloud dataproc jobs submit spark  \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties="spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog" \
    --properties="spark.sql.catalog.CATALOG_NAME.type=hadoop" \
    --properties="spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER" \
     other flags ...

Substitua:

  • CLUSTER_NAME: o nome do cluster.
  • REGION: a região do Compute Engine.
  • CATALOG_NAME: nome do catálogo do Iceberg.
  • BUCKET e FOLDER: o local do catálogo do Iceberg no Cloud Storage.

spark-shell

Para configurar uma sessão do Spark para Iceberg usando o REPL spark-shell no cluster do Dataproc, siga estas etapas:

  1. Use o SSH para se conectar ao nó mestre do cluster do Dataproc.

  2. Execute o comando a seguir no terminal da sessão SSH para configurar a sessão do Spark para o Iceberg.

spark-shell \
    --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --conf "spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog" \
    --conf "spark.sql.catalog.CATALOG_NAME.type=hadoop" \
    --conf "spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER"

Substitua:

  • CLUSTER_NAME: o nome do cluster.
  • REGION: a região do Compute Engine.
  • CATALOG_NAME: nome do catálogo do Iceberg.
  • BUCKET e FOLDER: o local do catálogo do Iceberg no Cloud Storage.

Shell pyspark

Para configurar uma sessão do Spark para Iceberg usando o REPL pyspark no cluster do Dataproc, siga estas etapas:

  1. Use o SSH para se conectar ao nó mestre do cluster do Dataproc.

  2. Execute o comando abaixo no terminal da sessão SSH para configurar a sessão do Spark para o Iceberg:

pyspark \
    --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --conf "spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog" \
    --conf "spark.sql.catalog.CATALOG_NAME.type=hadoop" \
    --conf "spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER"

Substitua:

  • CLUSTER_NAME: o nome do cluster.
  • REGION: a região do Compute Engine.
  • CATALOG_NAME: nome do catálogo do Iceberg.
  • BUCKET e FOLDER: o local do catálogo do Iceberg no Cloud Storage.

Gravar dados em uma tabela Iceberg

É possível gravar dados em uma tabela do Iceberg usando o Spark. Os snippets de código a seguir criam um DataFrame com dados de amostra, criam uma tabela Iceberg no Cloud Storage e gravam os dados na tabela Iceberg.

PySpark

# Create a DataFrame with sample data.
data = spark.createDataFrame([(1, "Alice"), (2, "Bob")], ["id", "name"])

# Create an Iceberg table in Cloud Storage.
spark.sql("""CREATE TABLE IF NOT EXISTS CATALOG_NAME.NAMESPACE.TABLE_NAME (
    id integer,
    name string)
USING iceberg
LOCATION 'gs://BUCKET/FOLDER/NAMESPACE/TABLE_NAME'""")

# Write the DataFrame to the Iceberg table in Cloud Storage.
data.writeTo("CATALOG_NAME.NAMESPACE.TABLE_NAME").append()

Scala

// Create a DataFrame with sample data.
val data = Seq((1, "Alice"), (2, "Bob")).toDF("id", "name")

// Create an Iceberg table in Cloud Storage.
spark.sql("""CREATE TABLE IF NOT EXISTS CATALOG_NAME.NAMESPACE.TABLE_NAME (
    id integer,
    name string)
USING iceberg
LOCATION 'gs://BUCKET/FOLDER/NAMESPACE/TABLE_NAME'""")

// Write the DataFrame to the Iceberg table in Cloud Storage.
data.writeTo("CATALOG_NAME.NAMESPACE.TABLE_NAME").append()

Ler dados de uma tabela Iceberg

É possível ler dados de uma tabela Iceberg usando o Spark. Os snippets de código abaixo lêem a tabela e mostram o conteúdo dela.

PySpark

# Read Iceberg table data into a DataFrame.
df = spark.read.format("iceberg").load("CATALOG_NAME.NAMESPACE.TABLE_NAME")
# Display the data.
df.show()

Scala

// Read Iceberg table data into a DataFrame.
val df = spark.read.format("iceberg").load("CATALOG_NAME.NAMESPACE.TABLE_NAME")

// Display the data.
df.show()

Spark SQL

SELECT * FROM CATALOG_NAME.NAMESPACE.TABLE_NAME

Hive

Criar uma tabela Iceberg no Hive

Os clusters do Dataproc preconfiguram o Hive para funcionar com o Iceberg.

Para executar os snippets de código nesta seção, siga estas etapas:

  1. Use o SSH para se conectar ao nó mestre do cluster do Dataproc.

  2. Abra beeline na janela do terminal SSH.

    beeline -u jdbc:hive2://
    

É possível criar uma tabela Iceberg não particionada ou particionada no Hive.

Tabela não particionada

Crie uma tabela Iceberg não particionada no Hive.

CREATE TABLE my_table (
  id INT,
  name STRING,
  created_at TIMESTAMP
) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

Tabela particionada

Crie uma tabela Iceberg particionada no Hive especificando as colunas de partição na cláusula PARTITIONED BY.

CREATE TABLE my_partitioned_table (
  id INT,
  name STRING
) PARTITIONED BY (date_sk INT)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

Inserir dados em uma tabela Iceberg no Hive

É possível inserir dados em uma tabela Iceberg usando instruções INSERT padrão do Hive.

SET hive.execution.engine=mr;

INSERT INTO my_table
SELECT 1, 'Alice', current_timestamp();

Limitações

  • O mecanismo de execução do MapReduce tem suporte apenas para operações de DML (linguagem de manipulação de dados).
  • A execução de MR foi descontinuada no Hive 3.1.3.

Ler dados de uma tabela Iceberg no Hive

Para ler dados de uma tabela Iceberg, use uma instrução SELECT.

SELECT * FROM my_table;

Exclua uma tabela do Iceberg no Hive.

Para excluir uma tabela do Iceberg no Hive, use a instrução DROP TABLE.

DROP TABLE my_table;

Para mais informações