Migrar para a Instância Gerenciada do Azure para Apache Cassandra usando o Apache Spark

Sempre que possível, recomendamos usar a replicação nativa do Apache Cassandra para migrar dados do cluster existente para a Instância Gerenciada do Azure para Apache Cassandra configurando um cluster híbrido. Essa abordagem usará o protocolo gossip do Apache Cassandra para replicar dados do data center de origem para seu novo datacenter de instância gerenciada. No entanto, pode haver alguns cenários em que a versão do banco de dados de origem não é compatível ou uma configuração de cluster híbrido não é viável.

Este tutorial descreve como migrar dados para a Instância Gerenciada do Azure para Apache Cassandra em estado offline usando o Conector do Cassandra Spark e o Azure Databricks para Apache Spark.

Pré-requisitos

Provisionar um cluster do Azure Databricks

Recomendamos a seleção do Databricks runtime versão 7.5, que oferece suporte ao Spark 3.0.

Captura de tela que mostra a localização da versão de runtime do Databricks.

Adicionar dependências

Adicione a biblioteca do Conector do Apache Spark Cassandra ao cluster para se conectar aos pontos de extremidade nativos e do Cassandra do Azure Cosmos DB. No cluster, selecione Bibliotecas>Instalar novo>Maven e, em seguida, adicione com.datastax.spark:spark-cassandra-connector-assembly_2.12:3.0.0 nas coordenadas do Maven.

Captura de tela que mostra a pesquisa de pacotes do Maven no Databricks.

Selecione Instalar e reinicie o cluster quando a instalação for concluída.

Observação

Certifique-se de reiniciar o cluster Databricks após a instalação da biblioteca do Conector do Cassandra.

Criar um Notebook Scala para migração

Crie um Notebook Scala no Databricks. Substitua as configurações do Cassandra de origem e de destino pelas credenciais correspondentes, e keyspaces e tabelas de origem e de destino. Em seguida, execute o código a seguir:

import com.datastax.spark.connector._
import com.datastax.spark.connector.cql._
import org.apache.spark.SparkContext

// source cassandra configs
val sourceCassandra = Map( 
    "spark.cassandra.connection.host" -> "<Source Cassandra Host>",
    "spark.cassandra.connection.port" -> "9042",
    "spark.cassandra.auth.username" -> "<USERNAME>",
    "spark.cassandra.auth.password" -> "<PASSWORD>",
    "spark.cassandra.connection.ssl.enabled" -> "false",
    "keyspace" -> "<KEYSPACE>",
    "table" -> "<TABLE>"
)

//target cassandra configs
val targetCassandra = Map( 
    "spark.cassandra.connection.host" -> "<Source Cassandra Host>",
    "spark.cassandra.connection.port" -> "9042",
    "spark.cassandra.auth.username" -> "<USERNAME>",
    "spark.cassandra.auth.password" -> "<PASSWORD>",
    "spark.cassandra.connection.ssl.enabled" -> "true",
    "keyspace" -> "<KEYSPACE>",
    "table" -> "<TABLE>",
    //throughput related settings below - tweak these depending on data volumes. 
    "spark.cassandra.output.batch.size.rows"-> "1",
    "spark.cassandra.output.concurrent.writes" -> "1000",
    "spark.cassandra.connection.remoteConnectionsPerExecutor" -> "10",
    "spark.cassandra.concurrent.reads" -> "512",
    "spark.cassandra.output.batch.grouping.buffer.size" -> "1000",
    "spark.cassandra.connection.keep_alive_ms" -> "600000000"
)

//Read from source Cassandra
val DFfromSourceCassandra = sqlContext
  .read
  .format("org.apache.spark.sql.cassandra")
  .options(sourceCassandra)
  .load
  
//Write to target Cassandra
DFfromSourceCassandra
  .write
  .format("org.apache.spark.sql.cassandra")
  .options(targetCassandra)
  .mode(SaveMode.Append) // only required for Spark 3.x
  .save

Observação

Se você tem a necessidade de preservar o original writetime de cada linha, consulte a amostra de migrador do Cassandra.

Próximas etapas