Slide 1

Slide 1 text

@doanduyhai et @aseigneurin #SparkCassandra Un  spo'fy  à  la  maison  avec  Spark  et  Cassandra  

Slide 2

Slide 2 text

@doanduyhai et @aseigneurin #SparkCassandra Duy  Hai  Doan   @doanduyhai [email protected] DataStax Evangéliste technique sur Cassandra

Slide 3

Slide 3 text

@doanduyhai et @aseigneurin #SparkCassandra Alexis  Seigneurin   @aseigneurin [email protected] Ippon Technologies Manager Tech Capitalisation

Slide 4

Slide 4 text

@doanduyhai et @aseigneurin #SparkCassandra Contenu  de  la  clé  USB   •  Machine virtuelle •  Contient Cassandra + une appli à importer dans VirtualBox •  Un repository Maven pour Java 8 (backup du votre avant!) •  m2repo.(zip|tgz) à décompresser pour remplacer ~/.m2 •  Un repo Ivy2 pour Scala (backup du votre avant!) •  ivy2cache.(zip|tgz) à décompresser pour remplacer ~/.ivy2 •  Un projet HomeSpotifiy-Scala/HomeSpotifiy-Java •  À importer dans Eclipse ou IntelliJ IDEA

Slide 5

Slide 5 text

Objec'fs   Découvrir comment utiliser Spark et Cassandra ensemble

Slide 6

Slide 6 text

@doanduyhai et @aseigneurin #SparkCassandra Le  plan   •  L'essentiel sur Cassandra •  L'essentiel sur Spark •  Le connecteur Spark – Cassandra •  Déroulement du Hand's On

Slide 7

Slide 7 text

@doanduyhai et @aseigneurin #SparkCassandra Sondage   •  Qui utilise Cassandra ? •  Qui utilise Spark ?

Slide 8

Slide 8 text

@YourTwitterHandle @YourTwitterHandle @doanduyhai et @aseigneurin #SparkCassandra Cassandra

Slide 9

Slide 9 text

@doanduyhai et @aseigneurin #SparkCassandra Cassandra   •  Base de données NoSQL distribuée •  Cluster sur commodity hardware •  Abstraction de table distribuée

Slide 10

Slide 10 text

@doanduyhai et @aseigneurin #SparkCassandra Distribu'on   •  Topologie : Ring, pas de Single Point Of Failure •  Répartition par hash de la partition (clé primaire) •  Hashage : Murmur3 •  Données distribuées et répliquées n1 n2 n3 n4 n5 n6 n7 n8

Slide 11

Slide 11 text

@doanduyhai et @aseigneurin #SparkCassandra Répar''on  des  données  par  token   •  Pour chaque requête, fournir une #partition •  Cassandra applique le hash Murmur3 à

Slide 12

Slide 12 text

@doanduyhai et @aseigneurin #SparkCassandra Cassandra  Query  Language  (CQL)   INSERT INTO users(login, name, age) VALUES(‘jdoe’, ‘John DOE’, 33); UPDATE users SET age = 34 WHERE login = ‘jdoe’; DELETE age FROM users WHERE login = ‘jdoe’; SELECT age FROM users WHERE login = ‘jdoe’;

Slide 13

Slide 13 text

@YourTwitterHandle @YourTwitterHandle @doanduyhai et @aseigneurin #SparkCassandra Spark

Slide 14

Slide 14 text

@doanduyhai et @aseigneurin #SparkCassandra Spark   •  Traitement distribué de données •  Cluster sur commodity hardware •  Écrit en Scala, bindings Java et Python

Slide 15

Slide 15 text

@doanduyhai et @aseigneurin #SparkCassandra No'on  de  RDD   •  Resilient Distributed Dataset •  Collection d'objets (types primitifs ou personnalisés) •  Partitions → traitement parallèle •  Tolérant à la panne

Slide 16

Slide 16 text

@doanduyhai et @aseigneurin #SparkCassandra Manipula'on  de  RDD   •  Création depuis : •  Fichier (local ou HDFS) •  Source NoSQL (Cassandra…) •  … •  Transformations : •  Retournent un nouveau RDD •  Actions finales : •  foreach(), collect(), … •  Envoi vers base NoSQL

Slide 17

Slide 17 text

@doanduyhai et @aseigneurin #SparkCassandra Spark  en  pra'que   •  Création d'une configuration •  SparkConf •  Création d'un contexte Spark •  SparkContext / JavaSparkContext •  Création d'un RDD •  RDD / JavaRDD/JavaPairRDD

Slide 18

Slide 18 text

@doanduyhai et @aseigneurin #SparkCassandra Spark  en  pra'que   val conf = new SparkConf() .setAppName("myapp") .setMaster("local[4]") val sc = new SparkContext(conf) val data = Array(1, 2, 3, 4, 5) val rdd = sc.parallelize(data) SparkConf conf = new SparkConf() .setAppName("myapp") .setMaster("local[4]"); JavaSparkContext sc = new JavaSparkContext(conf); List data = Arrays.asList(1, 2, 3, 4, 5); JavaRDD rdd = sc.parallelize(data); Scala Java

Slide 19

Slide 19 text

@doanduyhai et @aseigneurin #SparkCassandra Transforma'ons  u'les   map(x -> …) •  Applique une fonction sur chaque élément mapToPair(x -> new Tuple2(…,…)) •  Applique une fonction, retourne un tuple filter(x -> true/false) •  Sélectionne des éléments reduceByKey((x,y) -> …) •  Combine les valeurs de tuples ayant les mêmes clés, 2 à 2

Slide 20

Slide 20 text

@doanduyhai et @aseigneurin #SparkCassandra Transforma'ons  u'les   sortBy(MyClass::getValue, true/false, 1) •  Trie les éléments take(n) •  Conserve n éléments foreach(x -> System.out.println(x)) •  Itère sur les élements (pratique pour le debug) join(unAutreRDD) •  Jointure entre deux RDD : •  Sur les clés : nécessite des RDD de tuples clé/valeur •  Valeur obtenue : tuple contenant la valeur de "gauche" et la valeur de "droite"

Slide 21

Slide 21 text

@YourTwitterHandle @YourTwitterHandle @doanduyhai et @aseigneurin #SparkCassandra Connecteur Spark-Cassandra

Slide 22

Slide 22 text

@doanduyhai et @aseigneurin #SparkCassandra Spark  et  Cassandra   •  Stockage + traitement distribués •  Haute disponibilité des clusters •  Multi data-centers •  Permet des opérations "complexes" •  JOIN, GROUP BY… •  Traitements batch

Slide 23

Slide 23 text

@doanduyhai et @aseigneurin #SparkCassandra Connecteur  Spark-­‐Cassandra   •  Développé par DataStax, Open Source •  https://github.com/datastax/spark-cassandra-connector •  Utilisable en Java ou Scala •  Lecture de données Cassandra → RDD Spark •  Lecture d'une table entière ou requête CQL •  RDD Spark → Écriture dans Cassandra

Slide 24

Slide 24 text

@doanduyhai et @aseigneurin #SparkCassandra Connecteur  Spark-­‐Cassandra   •  Data locality •  En lecture •  En écriture : répartition dans Spark avant écriture •  Jointure: répartition dans Spark avant une jointure •  Push predicates •  Projections (select) •  Restrictions (where) •  Mapping de records en objets

Slide 25

Slide 25 text

@doanduyhai et @aseigneurin #SparkCassandra C* SparkM SparkW C* SparkW   C* SparkW   C* SparkW   C* SparkW   Data  locality   Spark partition RDD Cassandra tokens ranges

Slide 26

Slide 26 text

@doanduyhai et @aseigneurin #SparkCassandra Ini'alisa'on   val conf = new SparkConf(true) .set("spark.cassandra.connection.host", "192.168.51.10") SparkConf conf = new SparkConf(true) .set("spark.cassandra.connection.host", "192.168.51.10") Scala Java

Slide 27

Slide 27 text

@doanduyhai et @aseigneurin #SparkCassandra Lecture  d'une  table   import com.datastax.spark.connector._ import com.datastax.spark.connector.rdd.CassandraRDD val rows:CassandraRDD[CassandraRow] = sc.cassandraTable(keyspace, table) rows.map(row => row.getString("fieldname")) import com.datastax.spark.connector.japi.CassandraRow; import static com.datastax.spark.connector.japi.CassandraJavaUtil.javaFunctions; JavaRDD rows = javaFunctions(sc).cassandraTable(keyspace, table); rows.map(row -> row.getString("fieldname")) Scala Java

Slide 28

Slide 28 text

@doanduyhai et @aseigneurin #SparkCassandra Projec'ons  /  Restric'ons   val rows:CassandraRDD[CassandraRow] = sc.cassandraTable("test", "cars") .select("id", "model") .where("color = ?", "black") JavaRDD rows = javaFunctions(sc).cassandraTable("test", "cars") .select("id", "model") .where("color = ?", "black") Scala Java

Slide 29

Slide 29 text

@doanduyhai et @aseigneurin #SparkCassandra Requête  CQL   import org.apache.spark.sql.cassandra.CassandraSQLContext val sc: SparkContext = ... val cc = new CassandraSQLContext(sc) val rdd: SchemaRDD = cc.sql("SELECT * from keyspace.table WHERE ...") import org.apache.spark.sql.cassandra.CassandraSQLContext SparkContext sc = ... CassandraSQLContext cc = new CassandraSQLContext(sc) SchemaRDD rdd = cc.sql("SELECT * from keyspace.table WHERE ...") Scala Java

Slide 30

Slide 30 text

@doanduyhai et @aseigneurin #SparkCassandra Mapping  records-­‐objets   case class WordCount(word: String, count: Int) sc.cassandraTable[WordCount]("test", "words") import static com.datastax.spark.connector.japi.CassandraJavaUtil.mapRowTo; class WordCount {…} sc.cassandraTable("test", "words", mapRowTo(WordCount.class)) Scala Java

Slide 31

Slide 31 text

@doanduyhai et @aseigneurin #SparkCassandra Écriture  dans  Cassandra   rdd.saveToCassandra(keyspace, table) rdd.saveToCassandra("test", "words", SomeColumns("word", "count" as "num")) import static com.datastax.spark.connector.japi.CassandraJavaUtil.mapToRow; javaFunctions(rdd).writerBuilder(keyspace, table, mapToRow(MyType.class)) .saveToCassandra(); Scala Java

Slide 32

Slide 32 text

@YourTwitterHandle @YourTwitterHandle @doanduyhai et @aseigneurin #SparkCassandra Déroulement du Hand's On

Slide 33

Slide 33 text

@doanduyhai et @aseigneurin #SparkCassandra La  machine  virtuelle   •  Lancer la VM •  192.168.51.10 •  Se logguer dans la VM (terminal ou SSH) •  vagrant/vagrant •  Cassandra •  192.168.51.10:9042 •  > cqlsh

Slide 34

Slide 34 text

@doanduyhai et @aseigneurin #SparkCassandra Les  données   •  Données pré-chargées dans Cassandra •  Données de musique •  Artistes •  Albums

Slide 35

Slide 35 text

@doanduyhai et @aseigneurin #SparkCassandra L'applica'on   •  Accessible depuis votre machine •  http://192.168.51.10:9000/ •  5 exercices •  Instructions : données à lire… •  Visualisation des résultats •  À coder en Java ou Scala

Slide 36

Slide 36 text

@doanduyhai et @aseigneurin #SparkCassandra Pour  coder   •  Projet HomeSpotify-Scala ou HomeSpotify-Java •  À importer dans Eclipse ou IntelliJ IDEA •  Contient les stubs des exercices •  Branches •  > git checkout •  scala •  scala_solution •  java •  java_solution

Slide 37

Slide 37 text

@YourTwitterHandle @YourTwitterHandle @doanduyhai et @aseigneurin #SparkCassandra Let's code!