Integración de DataStax de Spark con Cassandra

Post on 30-Nov-2014

303 views 7 download

description

En el Cassandra Meet Up de Madrid estuve hablando de la Integración de DataStax de Spark con Cassandra.

Transcript of Integración de DataStax de Spark con Cassandra

Spark & CassandraUn vistazo al conector de DataStax

@javituiter

www.franciscojavierpulido.com

Anteriormente…

Apache Cassandra

N

N N

N

Apache Spark

M

W WW W

RDD

Alianza

Jhonathan EllisPresidente Apache Cassandra

Matei ZahariaCreador de Apache Spark

¿Cuándo?

¿Cuándo?

LANZAMIENTOjulio

2014

El Conector

Características

RDD TablaN

N N

N

MW WW W

Características

RDD TablaN

N N

N

MW WW W

RDD TablaN

N N

N

MW WW W

Mapping de Filas de C* como Tuplas

Guarda RDDs en C*(saveToCassandra)

Soporta todos los tipos de datos de C*

Filtrado de filas (en C*) mediante Where

Más en la web oficial.

Arquitectura

N

N N

N

M

W WW W

Arquitectura

N

M

N N N

W WW W

N

Ejecución

>Spark-Shell

Scala Java

Recomendado:· intelliJ· SBT· Scala

Comunidad

Impacto

Impacto

¿Por qué?

Clientes

C DA B E F

Demanda

Custodia Total :: Analítica del Histórico

¿Cómo?

Interrelacionados

BI Big DataAnalítica NoSQL

Visualización

Interrelacionados

BI Big DataAnalítica NoSQL

Visualización

Conector de DatastaxSpark + Cassandra

En Práctica

Modelo de Datos C*//KeySpaceCREATE KEYSPACE demoCMU WITH replication = {'class': 'SimpleStrategy', 'replication_factor':1};use demoCMU;

//TablaCREATE TABLE demoCMU.asistentesCMU (id int PRIMARY KEY, nombre text, genero text);

CREATE TABLE demoCMU.asistentesCopia (id int PRIMARY KEY, nombre text , tipo text);

//RegistrosINSERT INTO demoCMU.asistentesCMU (id, nombre, genero) VALUES (1, 'Ale Murray', 'femenino');INSERT INTO demoCMU.asistentesCMU (id, nombre, genero) VALUES (2, 'Iñigo Aldama', 'masculino');INSERT INTO demoCMU.asistentesCMU (id, nombre, genero) VALUES (3, 'Antonio', 'masculino');…INSERT INTO demoCMU.asistentesCMU (id, nombre, genero) VALUES (32, 'Jesus Arrabal', 'masculino');

Conexión al Conector (Spark-Shell)

scala> sc.stopscala>:paste// Entering paste mode (ctrl-D to finish)

import com.datastax.spark.connector._ //conector datastax spark+cassandraimport org.apache.spark._ //conector Spark

val conf = new SparkConf() //creamos una configuraciónconf.set("spark.cassandra.connection.host", "10.211.55.8") //añadimos nuestro host de C*conf.set("spark.home", "/opt/spark-1.0.2") //establecemos el Home de Sparkval sc = new SparkContext("local[2]", "Cassandra Connector Test", conf) // Creamos el Contexto

// Exiting paste mode, now interpreting.

Conexión al Conectorsc.addJar("/opt/spark-1.0.2/lib_unmanaged/libthrift-0.9.1.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/cassandra-all-2.0.9.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/cassandra-clientutil-2.0.9.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/cassandra-thrift-2.0.9.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/cassandra-driver-core-2.0.4.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/spark-cassandra-connector_2.10-1.0.0-rc5.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/joda-time-2.3.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/joda-convert-1.2.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/httpcore-4.2.4.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/commons-codec-1.4.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/commons-lang-2.4.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/commons-logging-1.1.1.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/guava-16.0.1.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/httpclient-4.2.5.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/metrics-core-3.0.2.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/netty-3.9.0.Final.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/slf4j-api-1.7.5.jar")sc.addJar("/opt/spark-1.0.2/lib_unmanaged/snappy-java-1.0.5.jar")

Acceso a Tabla C*

scala> val tableCMU = sc.cassandraTable("democmu", "asistentescmu")tableCMU: com.datastax.spark.connector.rdd.CassandraRDD[com.datastax.spark.connector.CassandraRow] = CassandraRDD[0] at RDD at CassandraRDD.scala:47

Lectura (I)

scala> tableCMU.firstres2: com.datastax.spark.connector.CassandraRow = CassandraRow{id: 20, genero: masculino, nombre: Marcos VR}

scala> tableCMU.take(2)res3: Array[com.datastax.spark.connector.CassandraRow] = Array(CassandraRow{id: 20, genero: masculino, nombre: Marcos VR}, CassandraRow{id: 25, genero: masculino, nombre: Sergio Canal Rodrigo})

scala> tableCMU.take(1)(0).get[Int]("idasistente")res4: Int = 20

Lectura (II)

scala> tableCMU.toArrayres5: Array[com.datastax.spark.connector.CassandraRow] = Array(CassandraRow{id: 20, genero: masculino, nombre: Marcos VR}, CassandraRow{id: 25, genero: masculino, nombre: Sergio Canal Rodrigo}, CassandraRow{id: 31, genero: masculino, nombre: jose}, CassandraRow{id: 24, genero: masculino, no…

scala> tableCMU.countres6: Long = 32

scala> tableCMU.select("nombre").toArrayres8: Array[com.datastax.spark.connector.CassandraRow] = Array(CassandraRow{nombre: Marcos VR}, CassandraRow{nombre: Sergio Canal Rodrigo}, CassandraRow{nombre: jose}, CassandraRow{n…

Copiado de Tablas

tableCMU.map( row => (row.get[Int]("id"),row.get[String]("nombre"),"cassandraRebelsMadrid”

)).saveToCassandra("democmu","asistentescopia"

Filtros

scala> tableCMU.filter(_.get[Int]("id")>30).toArrayres15: Array[com.datastax.spark.connector.CassandraRow] = Array(CassandraRow{id: 31, genero: masculino, nombre: jose}, CassandraRow{id: 32, genero: masculino, nombre: Jesus Arrabal})

Importar un CSV

scala>:paste// Entering paste mode (ctrl-D to finish)

sc.textFile("file:///root/democmu.csv").map(_.split(";")).map( line =>

(line(0),line(1),line(2))).saveToCassandra("democmu","asistentescopia")

// Exiting paste mode, now interpreting.

MapReduce

scala> :paste// Entering paste mode (ctrl-D to finish)

tableCMU.map(_.get[String]("genero")).flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).toArray

// Exiting paste mode, now interpreting.

res20: Array[(String, Int)] = Array((femenino,3), (masculino,29))

¡Spark Streaming + Cassandra!