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 node N resultado do processamento Talvez outro Big Data!?!?
Vou processar distribuído, mas onde eu armazeno os dados?
Como dividir meus dados em vários servidores?
Replicação 02 03 01 i5 j9 f1 i6 j0 f2 i7 j1 f3 i8... j2... f4... 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 03 01 04 08 07 06 05 i5 j9 f1 l9 i6 l0 j0 f2 i7 l1 j1 f3 i8... l2... j2... f4... 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 REDIS 05 for (Jedis jedis : cluster.getallshards()) {. long dbsize = jedis.dbsize();.. String key = jedis.randomkey(); String value = jedis.get(key);.. }
AD EB CF 0.728 IN OUT Tamanho da amostra final F 0.314 0.728 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)