Shivansh Srivastava é um desenvolvedor poliglota e um aficionado por Scala e Spark Ele gosta de contribuir para projetos de código aberto e contribuiu para vários projetos, como Apache Iota, Apache Spark e Apache Carbondata, Couchbase-Spark-ConnectorAkka, Alpakka e muitos outros projetos. Ele tem um grande interesse em tecnologias futuras, como IoT, DeepLearning etc. CAtualmente, ele ocupa o cargo de engenheiro de software sênior na Chirpanywhere Inc., uma startup baseada em IoT, onde gerencia muitas coisas, desde a programação de hardware até o projeto de toda a solução e sua implementação.
Há muitos Bancos de dados NoSQL no mercado, como Cassandra, MongoDB, Couchbase e outros, e cada um deles tem prós e contras.
Tipos de bancos de dados NoSQL
Há principalmente quatro tipos de bancos de dados NoSQL, a saber:
-
Orientado para colunas
-
Armazenamento de valores-chave
-
Orientado a documentos
-
Gráfico
Os bancos de dados que oferecem suporte a mais de um formato são chamados de "multimodelos", como o Couchbase, que oferece suporte a bancos de dados orientados a documentos e a valores-chave.
Às vezes, escolhemos o banco de dados errado para o nosso aplicativo e percebemos essa dura verdade em um estágio posterior.
E depois? O que devemos fazer?
Esse é o caso da nossa experiência, em que estávamos usando o Cassandra como nosso banco de dados e, mais tarde, descobrimos que ele não estava atendendo a todas as nossas necessidades. Precisávamos encontrar um novo banco de dados e descobrimos que o Couchbase era a opção certa.
A principal dificuldade foi descobrir como deveríamos transferir nossos dados de Cassandra para Couchbaseporque esse plug-in não estava disponível.
Nesta postagem do blog, descreverei o código que escrevi para transferir dados do Cassandra para o Couchbase usando o Spark.
Todo o código está disponível aqui: cassandra-couchbase-transfer-plugin
Explicação do código
Aqui, estou lendo dados do Cassandra e gravando-os de volta no Couchbase. Esse código simples resolve nosso problema.
As etapas envolvidas são:
-
Leitura da configuração:
val configuração = ConfigFactory.carregar()
//Configuração doouchbase
val bucketName = configuração.getString("couchbase.bucketName")
val couchbaseHost = configuração.getString("couchbase.host")
//Configuração do Cassandra
val keyspaceName = configuração.getString("cassandra.keyspaceName")
val tableName = configuração.getString("cassandra.tableName")
val idFeild = configuração.getString("cassandra.idFeild")
val cassandraHost = configuração.getString("cassandra.host")
val cassandraPort = configuração.getInt("cassandra.port") -
Definição da configuração do Spark e criação da sessão do Spark:
val conf = novo SparkConf()
.setAppName(s "CouchbaseCassandraTransferPlugin")
.setMaster("local[*]")
.set(s "com.couchbase.bucket.$bucketName“, “”)
.set("com.couchbase.nodes", couchbaseHost)
.set("spark.cassandra.connection.host", cassandraHost)
.set("spark.cassandra.connection.port", cassandraPort.toString)
val faísca = SparkSession.construtor().config(conf).getOrCreate()
val sc = faísca.sparkContext -
Leitura de dados do Cassandra:
val cassandraRDD = faísca.leia
.format("org.apache.spark.sql.cassandra")
.opções(Mapa("tabela" -> tableName, "espaço-chave" -> keyspaceName))
.load() -
Verificando o campo id:
O campo id está sendo verificado para ver se ele existe. Em seguida, use-o também como id no Couchbase ou gere um id aleatório e atribua-o ao documento.
importação org.apache.spark.sql.functions._
val uuidUDF = udf(CouchbaseHelper.getUUID _)
val rddToBeWritten = se (cassandraRDD.columns.contains(idFeild)) {
cassandraRDD.withColumn("META_ID", cassandraRDD(idFeild))
} mais {
cassandraRDD.withColumn("META_ID", uuidUDF())
}
Em um arquivo diferente:
objeto CouchbaseHelper {
def getUUID: Cordas = UUID.UUUID aleatório().toString
} -
Gravação no Couchbase:
rddToBeWritten.write.couchbase()
Você pode executar esse código diretamente para transferir dados do Cassandra para o Couchbase - Tudo o que você precisa fazer é uma configuração.
Configurações
Todas as configurações podem ser feitas definindo o parâmetro variáveis de ambiente.
-
Configuração do Couchbase:
|
Nome da configuração |
Valor padrão |
Descrição |
|
COUCHBASE_URL |
"localhost" |
O nome do host do Couchbase. |
|
COUCHBASE_BUCKETNAME |
"foobar" |
O nome do bucket para o qual os dados precisam ser transferidos. |
-
Configuração do Cassandra:
|
Nome da configuração |
Valor padrão |
Descrição |
|
CASSANDRA_URL |
"localhost" |
O nome do host do Cassandra. |
|
CASSANDRA_PORT |
9042 |
A porta para o Cassandra. |
|
CASSANDRA_KEYSPACENAME |
"foobar" |
O nome do espaço de chave para o Cassandra |
|
CASSANDRA_TABLENAME |
"testcouchbase" |
O nome da tabela que precisa ser transferido. |
|
CASSANDRA_ID_FEILD_NAME |
"id" |
O nome do campo que deve ser usado como id do documento do Couchbase; se o nome do campo não corresponder a nenhuma coluna, ele dará um id aleatório ao documento. |
Código em ação
Lado Cassandra:
Esta é a aparência dos dados no lado do Cassandra.
Lado do Couchbase:
Caso 1: Quando o id existe e pode ser usado como id do documento do Couchbase.
Caso 2: Quando o nome do ID não existe e precisamos atribuir um ID aleatório aos documentos.
Como executar o plug-in de transferência Cassandra-Couchbase
Etapas para executar o código:
-
Baixe o código do repositório.
-
Configure as variáveis de ambiente de acordo com a configuração.
-
Execute o projeto usando execução do sbt
Deseja escrever sobre o Couchbase e participar de nosso programa de redação da comunidade? Saiba mais!
Olá,
Você pode me informar onde e como especificar a opção para autenticação do cassandra e do couchbase?
Tanto o cassandra quanto o couchbase têm a autenticação ativada.
Observações
Hi,
Pessoalmente, não estou familiarizado com o Cassandra, mas se você quiser se autenticar com o Couchbase, poderá adicionar algo como:
.set("spark.couchbase.username", "")
.set("spark.couchbase.password", "")
Isso é definido na documentação encontrada aqui:
https://developer.couchbase.com/documentation/server/5.1/connectors/spark-2.2/getting-started.html
Melhor,