Shivansh Srivastava es un desarrollador políglota y aficionado a Scala y Spark. Le gusta contribuir a proyectos de código abierto, y ha contribuido a muchos proyectos como Apache Iota, Apache Spark, Apache Carbondata, Conector Couchbase-SparkAkka, Alpakka y muchos otros proyectos. Tiene un gran interés en las próximas tecnologías como IoT, DeepLearning, etc. Cn la actualidad ocupa el puesto de Ingeniero de Software Senior en Chirpanywhere Inc, una startup basada en IoT, donde gestiona muchos aspectos, desde la programación del hardware hasta el diseño de toda la solución y su despliegue.
Hay muchos Bases de datos NoSQL en el mercado como Cassandra, MongoDB, Couchbase y otros, y cada uno tiene pros y contras.
Tipos de bases de datos NoSQL
Existen principalmente cuatro tipos de bases de datos NoSQL, a saber:
-
Columna
-
Almacén de claves y valores
-
Orientación documental
-
Gráfico
Las bases de datos que admiten más de un formato se denominan "multimodelo", como Couchbase, que admite bases de datos clave-valor y orientadas a documentos.
A veces elegimos la base de datos equivocada para nuestra aplicación y nos damos cuenta de esta dura verdad más adelante.
¿Y después? ¿Qué debemos hacer?
Tal es el caso de nuestra experiencia, en la que utilizábamos Cassandra como base de datos y más tarde descubrimos que no satisfacía todas nuestras necesidades. Necesitábamos encontrar una nueva base de datos y descubrimos que Couchbase era la adecuada.
La principal dificultad fue averiguar cómo debíamos transferir nuestros datos de De Cassandra a Couchbaseporque no había ningún plugin disponible.
En esta entrada del blog voy a describir el código que escribí que transfiere datos de Cassandra a Couchbase usando Spark.
Todo el código está disponible aquí: cassandra-couchbase-transfer-plugin
Explicación del código
Aquí, estoy leyendo datos de Cassandra y escribiéndolos de nuevo en Couchbase. Este sencillo código resuelve nuestro problema.
Los pasos a seguir son:
-
Lectura de la configuración:
val config = ConfigFactory.carga()
//Configuración de la base de datos
val bucketName = config.getString("couchbase.bucketName")
val couchbaseHost = config.getString("couchbase.host")
//Configuración de Cassandra
val keypaceName = config.getString("cassandra.keyspaceName")
val tableName = config.getString("cassandra.tableName")
val idFeild = config.getString("cassandra.idFeild")
val cassandraHost = config.getString("cassandra.host")
val cassandraPort = config.getInt("cassandra.port") -
Establecimiento de la configuración de Spark y creación de la sesión de Spark:
val conf = nuevo 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 chispa = SparkSession.constructor().config(conf).getOrCreate()
val sc = chispa.sparkContext -
Lectura de datos de Cassandra:
val cassandraRDD = chispa.leer
.format("org.apache.spark.sql.cassandra")
.opciones(Mapa("mesa" -> tableName, "espacio clave" -> keypaceName))
.load() -
Comprobación del campo id:
El campo id se comprueba para ver si existe. Luego se usa como id en Couchbase o se genera un id aleatorio y se asigna al documento.
importar org.apache.spark.sql.functions._
val uuidUDF = udf(CouchbaseHelper.getUUID _)
val rddToBeWritten = si (cassandraRDD.columns.contains(idFeild)) {
cassandraRDD.withColumn("META_ID", cassandraRDD(idFeild))
} si no {
cassandraRDD.withColumn("META_ID", uuidUDF())
}
En otro archivo:
objeto CouchbaseHelper {
def getUUID: Cadena = UUID.randomUUID().toString
} -
Escribir en Couchbase:
rddToBeWritten.write.couchbase()
Puedes ejecutar este código directamente para transferir datos de Cassandra a Couchbase - todo lo que necesitas hacer es alguna configuración.
Configuraciones
Todas las configuraciones se pueden realizar mediante la configuración de los parámetros variables de entorno.
-
Configuración de Couchbase:
|
Nombre de la configuración |
Valor por defecto |
Descripción |
|
COUCHBASE_URL |
"localhost" |
El nombre de host para Couchbase. |
|
COUCHBASE_BUCKETNAME |
"foobar" |
El nombre del cubo al que deben transferirse los datos. |
-
Configuración de Cassandra:
|
Nombre de la configuración |
Valor por defecto |
Descripción |
|
CASSANDRA_URL |
"localhost" |
El nombre de host para Cassandra. |
|
PUERTO DE CASANDRA |
9042 |
El puerto para el Cassandra. |
|
NOMBRE_CLAVE_CASSANDRA |
"foobar" |
El nombre del espacio de claves de Cassandra |
|
CASSANDRA_TABLENAME |
"testcouchbase" |
El nombre de la tabla que debe transferirse. |
|
CASSANDRA_ID_FEILD_NAME |
"id" |
El nombre del campo que debe usarse como id del documento de Couchbase, si el nombre del campo no coincide con ninguna columna da un id aleatorio al documento. |
Código en acción
Cassandra lado:
Así es como se ven los datos en el lado de Cassandra.
Lado Couchbase:
Caso 1: Cuando el id existe y el mismo puede ser usado como id de documento Couchbase.
Caso 2: Cuando el nombre del identificador no existe y necesitamos asignar un identificador aleatorio a los documentos.
Cómo ejecutar el plugin de transferencia Cassandra-Couchbase
Pasos para ejecutar el código:
-
Descarga el código del repositorio.
-
Configure las variables de entorno de acuerdo con la configuración.
-
Ejecute el proyecto con ejecutar sbt
Si desea escribir sobre Couchbase y participar en nuestro programa de escritura de la comunidad, ¿por qué no? más información
Hola,
¿Puede indicarme dónde y cómo especificar la opción para la autenticación de cassandra y couchbase?
Tanto cassandra como couchbase tienen autenticación habilitada.
Reagrds
Hola,
Personalmente no estoy familiarizado con Cassandra, pero si quieres autenticarte con Couchbase puedes añadir algo como:
.set("spark.couchbase.username", "")
.set("spark.couchbase.password", "")
Esto se define en la documentación que se encuentra aquí:
https://developer.couchbase.com/documentation/server/5.1/connectors/spark-2.2/getting-started.html
Lo mejor,