Processamento de Big Data com bancos de dados NoSQL para desenvolvedores Java Fernando Babadopulos (@babadopulos) Eu tenho um Big Data? Ok, tenho um Big Data, e agora? Mas como funciona o hadoop? faPa dos dados faPa dos faPa dos grande quanPdade de dados dados dados faPa dos dados CLUSTER HADOOP node 1 node 2 node 3 resultado do processamento Talvez outro Big Data!?!? node N Vou processar distribuído, mas onde eu armazeno os dados? Como dividir meus dados em vários servidores? Replicação 02 | fji5| 03 01 9| 1| ijf6 0 2 || ijf7 1 3 || ijf8... 2... 4... database 01 database 02 01 | f1| f2 | f3 | f4... 01 | f1| f2 | f3 | f4... 02 | i5| i6 | i7 | i8... 02 | i5| i6 | i7 | i8... 03 | j9| j0 | j1 | j2... 03 | j9| j0 | j1 | j2... Sharding 02 | lfji9| 03 01 04 08 07 06 5| 1| lijf0 6 2 || lijf1 7 3 || lijf2... 8... 4... 05 database 01 database 02 database 03 database 04 01 | f1| f2 | f3 | f4... 02 | i5| i6 | i7 | i8... 03 | j9| j0 | j1 | j2... 04 | l9| l0 | l1 | l2... 05 | l9| l0 | l1 | l2... 06 | f1| f2 | f3 | f4... 07 | j9| j0 | j1 | j2... 08 | i5| i6 | i7 | i8... Hashing • Rápido • Consistente Ex.: • Murmur • RIPEMD-­‐160 Replicação ou sharding? E o HDFS, onde entra? Leitura e gravação geram os mesmos problemas? Todos os bancos de dados são iguais? • Rápido • Armazenado na memória RAM • Diversas estruturas de dados • Strings, Hashs, Lists, Sets, Sorted Sets <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.2</version> <type>jar</type> </dependency> Jedis jedis = new Jedis("localhost"); jedis.set("key", "value"); String value = jedis.get("key"); * hips://github.com/xetorthio/jedis • Índice armazenado em RAM • Persistência em SSD • Cluster naPvo <dependency> <groupId>com.aerospike</groupId> <artifactId>aerospike-client</artifactId> <version>3.0.0</version> <type>jar</type> </dependency> AerospikeClient client = new AerospikeClient("localhost",3000); Key key = new Key("test", "demo", "key"); Bin bin1 = new Bin("bin1", "value1"); Bin bin2 = new Bin("bin2", "value2"); String value = jedis.get("foo"); client.put(null, key, bin1, bin2); Record record = client.get(null, key); * hip://www.aerospike.com/docs/client/java/ • • • • • Orientado a documentos Registros desestruturados Persistência em disco Auto-­‐sharding Pesquisa em documentos aninhados <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver</artifactId> <version>3.0.2</version> <type>jar</type> </dependency> MongoClient mongoClient = new MongoClient("localhost"); MongoDatabase database = mongoClient.getDatabase("mydb"); MongoCollection<Document> collection = database.getCollection("test"); *hip://docs.mongodb.org/ecosystem/drivers/java/ { "name": "example", "code": 7, "point": { "x": 100, "y": 200 } } Document doc = new Document("name", "example") .append("code", 7) .append("point", new Document("x", 100).append("y", 200) ); collection.insertOne(doc); Document myDoc = collection.find().first(); *hip://docs.mongodb.org/ecosystem/drivers/java/ Morphia <dependency> <groupId>org.mongodb.morphia</groupId> <artifactId>morphia</artifactId> <version>1.0.0</version> <type>jar</type> </dependency> Facilita a manipulação de objetos *hip://mongodb.github.io/morphia/ • • • • Orientado a documentos Pesquisa em tempo real Distribuído e escalável O documento todo pode ser indexado <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>1.6.0</version> <type>jar</type> </dependency> IndexResponse response = client.prepareIndex("myIndex", "docs") .setSource(json) .execute() .actionGet(); GetResponse response = client.prepareGet("myIndex", "docs", "1") .execute() .actionGet(); * hips://www.elasPc.co/guide/en/elasPcsearch/client/java-­‐api Sampling 705.166 62ms 1.288.822.081 1,5h 6.931 x 1.190.642.440 651.448 = 12.667.692 Erro ≈ 0.088% 12.678.931 Total de registros conhecido amostragem Total de registros amostrados REDIS 01 REDIS 02 REDIS 03 REDIS 04 for (Jedis jedis : cluster.getAllShards()) { . long dbSize = jedis.dbSize(); . . String key = jedis.randomKey(); String value = jedis.get(key); . . } REDIS 05 A BF 0.728 ED C IN OUT Tamanho da amostra final F 0.728 0.314 0.352 0.461 0.816 0.831 Reservoir Sampling private SortedMap<Double, MyObject> reservoir; . . if (reservoir.size() < SAMPLE_SIZE) { reservoir.put(score, myObject); } else if (score > reservoir.firstKey()) { reservoir.remove(reservoir.firstKey()); reservoir.put(score, myObject); } Reservoir Sampling Apache Crunch import org.apache.crunch.lib.Sample; Sample.reservoirSample(Pcollection<T> input, int sampleSize); Perguntas? Fernando Babadopulos (@babadopulos) Obrigado! Fernando Babadopulos (@babadopulos)