avro, la puissance du binaire, la souplesse du json

38
AVRO LA PUISSANCE DU BINAIRE, LA SOUPLESSE DU JSON

Upload: alexvictoor

Post on 19-Jul-2015

282 views

Category:

Software


2 download

TRANSCRIPT

AVROLA PUISSANCE DU BINAIRE, LA SOUPLESSE

DU JSON

MYSELFAlexandre VictoorArchitecte à la [email protected]://github.com/alexvictoor@alex_victoor

Install-Package Microsoft.Hadoop.Avro

UN FICHIER AVRO

"type":"record", "namespace": "DevoxxFR.Example", "name":"Trade", "fields": [ "name":"ClientId", "type":"int" , "name":"Nominal", "type":"double" , "name":"Date", "type":"string" ]

"type":"record", "namespace": "DevoxxFR.Example", "name":"Trade", "fields": [ "name":"ClientId", "type":"int" , "name":"Nominal", "type":"double" , "name":"Date", "type":"string" , "name":"product", "type": ["null", "type":"record", "namespace":"DevoxxFR.Example", "name":"Product", "default":null,

java ­jar avro­tools.jar compile schema trade.avro

AVEC UN SEUL OBJECT DatumWriter<Trade> writer = new SpecificDatumWriter<Trade>();

encoder = EncoderFactory.get().binaryEncoder(outputStream, null);

writer.write(trade, encoder);

PUIS POUR LIRE DatumReader<Trade> reader = new SpecificDatumReader<Trade>();

decoder = DecoderFactory.get().binaryDecoder(inputStream, null);

trade = reader.read(null, decoder);

SANS GÉNÉRATION GenericRecord record = new GenericData.Record(SCHEMA);record.put("ProductId", 123);record.put("Nominal", 42000);

DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(SCHEMA

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>(SCHEMA

ECRIRE EN MASSE

ECRIRE EN MASSE File avroDataFile; // on peut aussi utiliser un OutputStream

ECRIRE EN MASSE File avroDataFile; // on peut aussi utiliser un OutputStream

DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();

ECRIRE EN MASSE File avroDataFile; // on peut aussi utiliser un OutputStream

DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();

DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(datumWriter);

ECRIRE EN MASSE File avroDataFile; // on peut aussi utiliser un OutputStream

DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();

DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(datumWriter);

dataFileWriter.setCodec(CodecFactory.snappyCodec());

ECRIRE EN MASSE File avroDataFile; // on peut aussi utiliser un OutputStream

DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();

DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(datumWriter);

dataFileWriter.setCodec(CodecFactory.snappyCodec());

dataFileWriter.create(TRADE_SCHEMA, avroDataFile);

ECRIRE EN MASSE File avroDataFile; // on peut aussi utiliser un OutputStream

DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();

DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(datumWriter);

dataFileWriter.setCodec(CodecFactory.snappyCodec());

dataFileWriter.create(TRADE_SCHEMA, avroDataFile);

for (GenericRecord record : records) dataFileWriter.append(record);

ET POUR LIRE ?

ET POUR LIRE ? File avroDataFile; // on peut aussi utiliser un InputStream

ET POUR LIRE ? File avroDataFile; // on peut aussi utiliser un InputStream

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();

ET POUR LIRE ? File avroDataFile; // on peut aussi utiliser un InputStream

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();

DataFileReader<GenericRecord> dataFileReader = new DataFileReader(avroDataFile, datumReader);

ET POUR LIRE ? File avroDataFile; // on peut aussi utiliser un InputStream

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();

DataFileReader<GenericRecord> dataFileReader = new DataFileReader(avroDataFile, datumReader);

for (GenericRecord record : dataFileReader) // traitement sur chaque record

C'EST BIEN MAIS... "type":"record", "namespace": "DevoxxFR.Example", "name":"Trade", "fields": [ "name":"ClientId", "type":"int" , "name":"Nominal", "type":"double" , "name":"Date", "type":"string" , "name":"product", "type": ["null", "type":"record", "namespace": "DevoxxFR.Example", "name":"Product", "default":null,

LA KILLER FEATURE // la résolution de schemanew GenericDatumReader(writerSchema, readerSchema)

Writer SchemaLe schéma qui a été utilisé pour sérialiser

LA KILLER FEATURE // la résolution de schemanew GenericDatumReader(writerSchema, readerSchema)

Reader SchemaLes données dont vous avez besoin

ENTRE 2 SCHEMAS, ON PEUT- ajouter un champ- supprimer un champ- renommer un champ (avec un alias)

On ne peut pas changer le type d'un champ

COMPATIBLES ? SchemaCompatibility .checkReaderWriterCompatibility(readerSchema, writerSchema)

D'AUTRES USAGES- Event sourcing

- Echanges de messages entre applications

EVENT SOURCING

EVENT SOURCING

DEMOTRADE

productIdquantitynominaldate

TRADE

productIdquantitynominal

datetradingPlace

RESSOURCESCes slides :

Une variante "alt.net" de cette prez :

La spec avro :

Le tuto MS :

Le SDK MS Hadoop :

https://github.com/alexvictoor/AvroDevoxxFr

https://github.com/alexvictoor/AvroAltNet

http://avro.apache.org/docs/1.7.7/spec.html

http://bit.ly/1uYRX3I

http://hadoopsdk.codeplex.com/SourceControl/latest