Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
O modelo do Apache Cassandra para o Bigtable copia uma tabela do Apache Cassandra para o Bigtable.
Esse modelo precisa de configuração mínima e
replica a estrutura da tabela no Cassandra da maneira mais semelhante possível no Bigtable.
O modelo do Apache Cassandra para Bigtable é útil para:
migrar o banco de dados do Apache Cassandra quando um tempo de inatividade curto é aceitável;
replicar periodicamente as tabelas do Cassandra no Bigtable para exibição global.
Requisitos de pipeline
A tabela de destino do Bigtable precisa existir antes da execução do pipeline.
Conexão de rede entre workers do Dataflow e nós do Apache Cassandra.
Conversão de tipo
O modelo do Apache Cassandra para Bigtable converte automaticamente os tipos de dados do Apache Cassandra para os tipos de dados do Bigtable.
A maioria dos primitivos é representada da mesma forma no Bigtable e no Apache Cassandra, mas estes são diferentes:
Date e Timestamp são convertidos em objetos DateTime
UUID é convertida em String
Varint é convertida em BigDecimal
O Apache Cassandra também é compatível nativamente com tipos mais complexos como Tuple, List, Set e Map.
As tuplas não são compatíveis com esse pipeline por que não há um tipo correspondente no Apache Beam.
Por exemplo, no Apache Cassandra, é possível ter uma coluna do tipo List chamada "mylist" e valores como os da tabela a seguir:
row
mylist
1
(a,b,c)
O pipeline expande a coluna de lista em três colunas diferentes, conhecidas no Bigtable como qualificadoras de colunas.
O nome das colunas é "mylist", mas o pipeline anexa o índice do item na lista, como "mylist [0]".
row
mylist[0]
mylist[1]
mylist[2]
1
a
b
c
O pipeline processa os conjuntos da mesma forma que as listas, mas adiciona um sufixo extra para indicar se a célula é uma chave ou um valor.
Após a transformação, a tabela aparece da seguinte maneira:
linha
mymap[0].key
mymap[0].value
mymap[1].key
mymap[1].value
1
first_key
first_value
another_key
different_value
Conversão de chave primária
No Apache Cassandra, uma chave primária é definida usando a linguagem de definição de dados. Ela pode ser simples, composta ou constituída por colunas de clustering.
O Bigtable é compatível com a construção de chave de linha manual, lexicograficamente ordenada em uma matriz de bytes.
O pipeline coleta automaticamente informações sobre o tipo de chave e cria uma chave com base nas práticas recomendadas para criar chaves de linha com base em diversos valores.
Parâmetros do modelo
Parâmetros obrigatórios
cassandraHosts: os hosts dos nós do Apache Cassandra em uma lista separada por vírgulas.
cassandraKeyspace: espaço de chaves do Apache Cassandra em que a tabela está localizada.
cassandraTable: a tabela do Apache Cassandra a ser copiada.
bigtableProjectId: o ID do projeto do Google Cloud associado à instância do Bigtable.
bigtableInstanceId: o ID da instância do Bigtable em que a tabela do Apache Cassandra é copiada.
bigtableTableId: o nome da tabela do Bigtable em que a tabela do Apache Cassandra é copiada.
Parâmetros opcionais
cassandraPort: a porta TCP a ser usada para acessar o Apache Cassandra nos nós. O valor padrão é 9042.
defaultColumnFamily: o nome do grupo de colunas da tabela do Bigtable. O valor padrão é o padrão.
rowKeySeparator: o separador usado para criar chaves de linha. O valor padrão é "#".
splitLargeRows: a sinalização para ativar a divisão de linhas grandes em várias solicitações mutateRows. Quando uma linha grande é dividida entre várias chamadas de API, as atualizações da linha não são atômicas. .
Executar o modelo
Console
Acesse a página Criar job usando um modelo do Dataflow.
o nome da versão, como 2023-09-12-00_RC00, para usar uma versão específica do
modelo, que pode ser aninhada na respectiva pasta mãe datada no bucket:
gs://dataflow-templates-REGION_NAME/
REGION_NAME:
a região em que você quer
implantar o job do Dataflow, por exemplo, us-central1
BIGTABLE_PROJECT_ID: o ID do projeto em que o Bigtable está localizado
BIGTABLE_INSTANCE_ID: o ID da instância do Bigtable.
BIGTABLE_TABLE_ID: o nome da tabela do
Bigtable
CASSANDRA_HOSTS: a lista de hosts do Apache Cassandra. Se forem fornecidos vários hosts, siga as instruções sobre como fazer escape de vírgulas.
CASSANDRA_KEYSPACE: o espaço de chaves do Apache Cassandra em que a tabela está localizada.
CASSANDRA_TABLE: a tabela do Apache Cassandra que precisa ser migrada
API
Para executar o modelo usando a API REST, envie uma solicitação HTTP POST. Para mais informações sobre a
API e os respectivos escopos de autorização, consulte
projects.templates.launch.
o nome da versão, como 2023-09-12-00_RC00, para usar uma versão específica do
modelo, que pode ser aninhada na respectiva pasta mãe datada no bucket:
gs://dataflow-templates-REGION_NAME/
LOCATION:
a região em que você quer
implantar o job do Dataflow, por exemplo, us-central1
BIGTABLE_PROJECT_ID: o ID do projeto em que o Bigtable está localizado
BIGTABLE_INSTANCE_ID: o ID da instância do Bigtable.
BIGTABLE_TABLE_ID: o nome da tabela do
Bigtable
CASSANDRA_HOSTS: a lista de hosts do Apache Cassandra. Se forem fornecidos vários hosts, siga as instruções sobre como fazer escape de vírgulas.
CASSANDRA_KEYSPACE: o espaço de chaves do Apache Cassandra em que a tabela está localizada.
CASSANDRA_TABLE: a tabela do Apache Cassandra que precisa ser migrada
Código-fonte do modelo
Java
/*
* Copyright (C) 2019 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.cloud.teleport.bigtable;
import com.datastax.driver.core.Session;
import com.google.cloud.teleport.bigtable.CassandraToBigtable.Options;
import com.google.cloud.teleport.metadata.Template;
import com.google.cloud.teleport.metadata.TemplateCategory;
import com.google.cloud.teleport.metadata.TemplateParameter;
import java.util.Arrays;
import java.util.List;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.coders.SerializableCoder;
import org.apache.beam.sdk.io.cassandra.CassandraIO;
import org.apache.beam.sdk.io.cassandra.Mapper;
import org.apache.beam.sdk.io.gcp.bigtable.BigtableIO;
import org.apache.beam.sdk.options.Default;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.options.ValueProvider;
import org.apache.beam.sdk.transforms.ParDo;
import org.apache.beam.sdk.transforms.SerializableFunction;
import org.apache.beam.sdk.values.Row;
/**
* This Dataflow Template performs a one off copy of one table from Apache Cassandra to Cloud
* Bigtable. It is designed to require minimal configuration and aims to replicate the table
* structure in Cassandra as closely as possible in Cloud Bigtable.
*
* <p>Check out <a
* href="https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/main/v1/README_Cassandra_To_Cloud_Bigtable.md">README</a>
* for instructions on how to use or modify this template.
*/
@Template(
name = "Cassandra_To_Cloud_Bigtable",
category = TemplateCategory.BATCH,
displayName = "Cassandra to Cloud Bigtable",
description = {
"The Apache Cassandra to Cloud Bigtable template copies a table from Apache Cassandra to Cloud Bigtable. "
+ "This template requires minimal configuration and replicates the table structure in Cassandra as closely as possible in Cloud Bigtable.",
"The Apache Cassandra to Cloud Bigtable template is useful for the following:\n"
+ "- Migrating Apache Cassandra database when short downtime is acceptable.\n"
+ "- Periodically replicating Cassandra tables to Cloud Bigtable for global serving."
},
optionsClass = Options.class,
documentation =
"https://cloud.google.com/dataflow/docs/guides/templates/provided/cassandra-to-bigtable",
contactInformation = "https://cloud.google.com/support",
requirements = {
"The target Bigtable table must exist before running the pipeline.",
"Network connection between Dataflow workers and Apache Cassandra nodes."
})
final class CassandraToBigtable {
/** TODO - refactor to extend BigtableCommonOptions.WriteOptions. */
public interface Options extends PipelineOptions {
@TemplateParameter.Text(
order = 1,
groupName = "Source",
regexes = {"^[a-zA-Z0-9\\.\\-,]*$"},
description = "Cassandra Hosts",
helpText = "The hosts of the Apache Cassandra nodes in a comma-separated list.")
ValueProvider<String> getCassandraHosts();
@SuppressWarnings("unused")
void setCassandraHosts(ValueProvider<String> hosts);
@TemplateParameter.Integer(
order = 2,
groupName = "Source",
optional = true,
description = "Cassandra Port",
helpText =
"The TCP port to use to reach Apache Cassandra on the nodes. The default value is 9042.")
@Default.Integer(9042)
ValueProvider<Integer> getCassandraPort();
@SuppressWarnings("unused")
void setCassandraPort(ValueProvider<Integer> port);
@TemplateParameter.Text(
order = 3,
groupName = "Source",
regexes = {"^[a-zA-Z0-9][a-zA-Z0-9_]{0,47}$"},
description = "Cassandra Keyspace",
helpText = "The Apache Cassandra keyspace where the table is located.")
ValueProvider<String> getCassandraKeyspace();
@SuppressWarnings("unused")
void setCassandraKeyspace(ValueProvider<String> keyspace);
@TemplateParameter.Text(
order = 4,
groupName = "Source",
regexes = {"^[a-zA-Z][a-zA-Z0-9_]*$"},
description = "Cassandra Table",
helpText = "The Apache Cassandra table to copy.")
ValueProvider<String> getCassandraTable();
@SuppressWarnings("unused")
void setCassandraTable(ValueProvider<String> cassandraTable);
@TemplateParameter.ProjectId(
order = 5,
groupName = "Target",
description = "Bigtable Project ID",
helpText = "The Google Cloud project ID associated with the Bigtable instance.")
ValueProvider<String> getBigtableProjectId();
@SuppressWarnings("unused")
void setBigtableProjectId(ValueProvider<String> projectId);
@TemplateParameter.Text(
order = 6,
groupName = "Target",
regexes = {"[a-z][a-z0-9\\-]+[a-z0-9]"},
description = "Target Bigtable Instance",
helpText = "The ID of the Bigtable instance that the Apache Cassandra table is copied to.")
ValueProvider<String> getBigtableInstanceId();
@SuppressWarnings("unused")
void setBigtableInstanceId(ValueProvider<String> bigtableInstanceId);
@TemplateParameter.Text(
order = 7,
groupName = "Target",
regexes = {"[_a-zA-Z0-9][-_.a-zA-Z0-9]*"},
description = "Target Bigtable Table",
helpText = "The name of the Bigtable table that the Apache Cassandra table is copied to.")
ValueProvider<String> getBigtableTableId();
@SuppressWarnings("unused")
void setBigtableTableId(ValueProvider<String> bigtableTableId);
@TemplateParameter.Text(
order = 8,
groupName = "Target",
optional = true,
regexes = {"[-_.a-zA-Z0-9]+"},
description = "The Default Bigtable Column Family",
helpText =
"The name of the column family of the Bigtable table. The default value is default.")
@Default.String("default")
ValueProvider<String> getDefaultColumnFamily();
@SuppressWarnings("unused")
void setDefaultColumnFamily(ValueProvider<String> defaultColumnFamily);
@TemplateParameter.Text(
order = 9,
groupName = "Target",
optional = true,
description = "The Row Key Separator",
helpText = "The separator used to build row-keys. The default value is '#'.")
@Default.String("#")
ValueProvider<String> getRowKeySeparator();
@SuppressWarnings("unused")
void setRowKeySeparator(ValueProvider<String> rowKeySeparator);
@TemplateParameter.Boolean(
order = 10,
groupName = "Target",
optional = true,
description = "If true, large rows will be split into multiple MutateRows requests",
helpText =
"The flag for enabling splitting of large rows into multiple MutateRows requests. Note that when a large row is split between multiple API calls, the updates to the row are not atomic. ")
ValueProvider<Boolean> getSplitLargeRows();
void setSplitLargeRows(ValueProvider<Boolean> splitLargeRows);
}
/**
* Runs a pipeline to copy one Cassandra table to Cloud Bigtable.
*
* @param args arguments to the pipeline
*/
public static void main(String[] args) {
Options options = PipelineOptionsFactory.fromArgs(args).withValidation().as(Options.class);
// Split the Cassandra Hosts value provider into a list value provider.
ValueProvider.NestedValueProvider<List<String>, String> hosts =
ValueProvider.NestedValueProvider.of(
options.getCassandraHosts(),
(SerializableFunction<String, List<String>>) value -> Arrays.asList(value.split(",")));
Pipeline p = Pipeline.create(PipelineUtils.tweakPipelineOptions(options));
// Create a factory method to inject the CassandraRowMapperFn to allow custom type mapping.
SerializableFunction<Session, Mapper> cassandraObjectMapperFactory =
new CassandraRowMapperFactory(options.getCassandraTable(), options.getCassandraKeyspace());
CassandraIO.Read<Row> source =
CassandraIO.<Row>read()
.withHosts(hosts)
.withPort(options.getCassandraPort())
.withKeyspace(options.getCassandraKeyspace())
.withTable(options.getCassandraTable())
.withMapperFactoryFn(cassandraObjectMapperFactory)
.withEntity(Row.class)
.withCoder(SerializableCoder.of(Row.class));
BigtableIO.Write sink =
BigtableIO.write()
.withProjectId(options.getBigtableProjectId())
.withInstanceId(options.getBigtableInstanceId())
.withTableId(options.getBigtableTableId());
p.apply("Read from Cassandra", source)
.apply(
"Convert Row",
ParDo.of(
BeamRowToBigtableFn.createWithSplitLargeRows(
options.getRowKeySeparator(),
options.getDefaultColumnFamily(),
options.getSplitLargeRows(),
BeamRowToBigtableFn.MAX_MUTATION_PER_REQUEST)))
.apply("Write to Bigtable", sink);
p.run();
}
}
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2024-07-17 UTC."],[],[]]