Componente opcional do Managed Service for Apache Spark Iceberg

É possível instalar componentes adicionais, como o Iceberg, ao criar um cluster do Serviço Gerenciado para Apache Spark usando o recurso Componentes opcionais. Nesta página, descrevemos como instalar o componente Iceberg em um cluster do Serviço Gerenciado para Apache Spark.

Visão geral

O Apache Iceberg é um formato de tabela aberta 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 as mesmas tabelas ao mesmo tempo.

Quando instalado em um cluster do Serviço Gerenciado para Apache Spark, o componente Apache Iceberg instala 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 o seguinte:

  • Evolução do esquema:adicione, remova ou renomeie colunas sem reescrever a tabela inteira.
  • Viagem no tempo:consulte snapshots históricos de tabelas 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 Serviço Gerenciado para Apache Spark

É possível instalar o componente Iceberg em clusters do Serviço Gerenciado para Apache Spark criados com 2.2.47 e versões de imagem mais recentes. A versão do Iceberg instalada no cluster está listada na página de versões 2.2.

Ao criar um Serviço Gerenciado para Apache Spark com cluster do Iceberg, as seguintes propriedades do Spark e do Hive são configuradas para funcionar com o Iceberg.

Versão de imagem 2.x

As seguintes propriedades do Spark e do Hive são configuradas em clusters `2.x` do Serviço Gerenciado para Apache Spark quando o componente Iceberg está instalado:

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

Versão de imagem 3.0

As seguintes propriedades do Spark e do Hive são configuradas em clusters `3.0` do Serviço Gerenciado para Apache Spark quando o componente Iceberg está instalado:

Arquivo de configuração Propriedade Valor padrão
/etc/spark/conf/spark-defaults.conf spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.catalog.default_iceberg org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.default_iceberg.type rest
spark.sql.catalog.default_iceberg.uri env:ICEBERG_REST_CATALOG_URI
/etc/hive/conf/hive-site.xml iceberg.engine.hive.enabled true

Instalar o componente opcional do Iceberg

Instale o componente Iceberg ao criar um cluster do Serviço Gerenciado para Apache Spark. As páginas da lista de versões de imagem do cluster do Serviço Gerenciado para Apache Spark mostram a versão do componente Iceberg incluída nas versões de imagem mais recentes do Serviço Gerenciado para Apache Spark cluster.

Google Cloud Console do

Para criar um cluster do Serviço Gerenciado para Apache Spark que instala o componente Iceberg, conclua as etapas a seguir no Google Cloud console:

  1. Abra a página Criar cluster.
  2. Clique em Configuração adicional para expandir essa seção.
  3. Edite Componentes opcionais.
  4. No painel que é aberto, selecione a caixa de seleção Iceberg.
  5. Clique em Salvar.

CLI gcloud

Para criar um cluster do Serviço Gerenciado para Apache Spark que instala o componente Iceberg, use o gcloud dataproc clusters create comando com a --optional-components flag.

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

Substitua:

API REST

Para criar um cluster do Serviço Gerenciado para Apache Spark que instala o componente opcional do Iceberg, especifique o Iceberg SoftwareConfig.Component como parte de uma clusters.create solicitação.

Usar tabelas do Iceberg com o Spark e o Hive

Depois de criar um cluster do Serviço Gerenciado para Apache Spark que tenha o componente opcional do Iceberg instalado no cluster, é possível usar o Spark e o Hive para ler e gravar dados da tabela 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 em execução 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 da CLI gcloud a seguir em uma janela de terminal local ou em Cloud Shell para enviar um job do Spark e definir as 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: o 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 o Iceberg usando o REPL spark-shell no cluster do Serviço Gerenciado para Apache Spark, conclua as etapas a seguir:

  1. Use SSH para se conectar ao nó mestre do cluster do Serviço Gerenciado para Apache Spark.

  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: o nome do catálogo do Iceberg.
  • BUCKET e FOLDER: o local do catálogo do Iceberg no Cloud Storage.

Shell do pyspark

Para configurar uma sessão do Spark para o Iceberg usando o REPL pyspark no cluster do Serviço Gerenciado para Apache Spark, conclua as etapas a seguir:

  1. Use SSH para se conectar ao nó mestre do cluster do Serviço Gerenciado para Apache Spark.

  2. Execute o comando a seguir 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: o nome do catálogo do Iceberg.
  • BUCKET e FOLDER: o local do catálogo do Iceberg no Cloud Storage.

Gravar dados em uma tabela do 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 do Iceberg no Cloud Storage, e gravam os dados na tabela do 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 do Iceberg

É possível ler dados de uma tabela do Iceberg usando o Spark. Os snippets de código a seguir leem 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 do Iceberg no Hive

Os clusters do Serviço Gerenciado para Apache Spark pré-configuram o Hive para trabalhar com o Iceberg.

Para executar os snippets de código nesta seção, conclua as etapas a seguir:

  1. Use SSH para se conectar ao nó mestre do cluster do Serviço Gerenciado para Apache Spark.

  2. Abra beeline na janela do terminal SSH.

    beeline -u jdbc:hive2://
    

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

Tabela não particionada

Crie uma tabela do 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 do 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 do Iceberg no Hive

É possível inserir dados em uma tabela do 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 MR (MapReduce) só tem suporte para operações de DML (linguagem de manipulação de dados).
  • A execução do MR foi descontinuada no Hive 3.1.3.

Ler dados de uma tabela do Iceberg no Hive

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

SELECT * FROM my_table;

Soltar uma tabela do Iceberg no Hive

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

DROP TABLE my_table;

A seguir