Componente Iceberg opcional do Dataproc

Pode instalar componentes adicionais, como o Iceberg, quando cria um cluster do Dataproc através da funcionalidade Componentes opcionais. Esta página descreve como pode instalar opcionalmente o componente Iceberg num cluster do Dataproc.

Vista geral

O Apache Iceberg é um formato de tabela aberto para grandes conjuntos de dados analíticos. Oferece a fiabilidade e a simplicidade das tabelas SQL aos Big Data, ao mesmo tempo que permite que motores como o Spark, o Trino, o PrestoDB, o Flink e o Hive funcionem em segurança com as mesmas tabelas.

Quando instalado num cluster do Dataproc, o componente Apache Iceberg instala bibliotecas do Iceberg e configura o Spark e o Hive para funcionarem com o Iceberg no cluster.

Principais funcionalidades do Iceberg

As funcionalidades do Iceberg incluem o seguinte:

  • Evolução do esquema: adicione, remova ou mude o nome das colunas sem reescrever a tabela inteira.
  • Viagem no tempo: consulte as capturas instantâneas históricas de tabelas para fins de auditoria ou reversão.
  • Partição oculta: otimize a disposição dos dados para consultas mais rápidas sem expor os detalhes da partição aos utilizadores.
  • Transações ACID: garantem a consistência dos dados e evitam conflitos.

Versões de imagens do Dataproc compatíveis

Pode instalar o componente Iceberg em clusters do Dataproc criados com as versões de imagem 2.2.47 e posteriores. A versão do Iceberg instalada no cluster está listada na página Versões de lançamento 2.2.

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

Ficheiro de configuração Propriedade Valor predefinido
/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

Instale o componente opcional Iceberg

Instale o componente Iceberg quando criar um cluster do Dataproc. As páginas da lista de versões de imagens de clusters do Dataproc mostram a versão do componente Iceberg incluída nas versões de imagens de clusters do Dataproc mais recentes.

Google Cloud consola

Para criar um cluster do Dataproc que instale o componente Iceberg, conclua os seguintes passos na Google Cloud consola:

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

CLI do Google Cloud

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 o seguinte:

API REST

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

Use tabelas Iceberg com o Spark e o Hive

Depois de criar um cluster do Dataproc com o componente opcional do Iceberg instalado no cluster, pode usar o Spark e o Hive para ler e escrever dados de tabelas do Iceberg.

Spark

Configure uma sessão do Spark para o Iceberg

Pode usar o comando gcloud CLI localmente ou os spark-shell ou pyspark REPLs (Read-Eval-Print Loops) executados no nó principal 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 seguinte exemplo da CLI gcloud numa janela de terminal local ou no Cloud Shell para enviar uma tarefa 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 o seguinte:

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

spark-shell

Para configurar uma sessão do Spark para o Iceberg através do spark-shellREPL no cluster do Dataproc, conclua os seguintes passos:

  1. Use o SSH para se ligar ao nó principal do cluster do Dataproc.

  2. Execute o seguinte comando 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 o seguinte:

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

shell pyspark

Para configurar uma sessão do Spark para o Iceberg através do pysparkREPL no cluster do Dataproc, conclua os seguintes passos:

  1. Use o SSH para se ligar ao nó principal do cluster do Dataproc.

  2. Execute o seguinte comando 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 o seguinte:

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

Escreva dados numa tabela Iceberg

Pode escrever dados numa tabela Iceberg através do Spark. Os seguintes fragmentos de código criam um DataFrame com dados de amostra, criam uma tabela Iceberg no Cloud Storage e, em seguida, escrevem 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()

Leia dados de uma tabela Iceberg

Pode ler dados de uma tabela Iceberg através do Spark. Os seguintes fragmentos de código leem a tabela e, em seguida, apresentam o respetivo conteúdo.

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

Crie uma tabela Iceberg no Hive

Os clusters do Dataproc pré-configuram o Hive para funcionar com o Iceberg.

Para executar os fragmentos de código nesta secção, conclua os seguintes passos:

  1. Use o SSH para estabelecer ligação ao nó principal do cluster do Dataproc.

  2. Apresente beeline na janela do terminal SSH.

    beeline -u jdbc:hive2://
    

Pode 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 numa tabela Iceberg no Hive

Pode inserir dados numa tabela Iceberg através de declarações INSERT padrão do Hive.

SET hive.execution.engine=mr;

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

Limitações

  • Apenas o motor de execução MR (MapReduce) é suportado para operações DML (linguagem de manipulação de dados).
  • A execução de MR está descontinuada no Hive 3.1.3.

Ler dados de uma tabela Iceberg no Hive

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

SELECT * FROM my_table;

Largue uma tabela Iceberg no Hive.

Para eliminar uma tabela Iceberg no Hive, use a declaração DROP TABLE.

DROP TABLE my_table;

O que se segue?