Sprievodca po Apache Avro

1. Prehľad

Serializácia údajov je technika prevodu údajov do binárneho alebo textového formátu. Na tento účel je k dispozícii viac systémov. Apache Avro je jedným z týchto systémov na serializáciu údajov.

Avro je jazykovo nezávislá knižnica na serializáciu údajov založená na schéme. Na vykonávanie serializácie a deserializácie používa schému. Spoločnosť Avro navyše používa na špecifikáciu dátovej štruktúry formát JSON, ktorý ju robí výkonnejšou.

V tomto tutoriáli preskúmame viac informácií o nastavení Avro, rozhraní Java API na vykonávanie serializácie a porovnaní produktu Avro s inými systémami na serializáciu údajov.

Zameriame sa predovšetkým na tvorbu schém, ktorá je základom celého systému.

2. Apache Avro

Avro je jazykovo nezávislá knižnica na serializáciu. Spoločnosť Avro na to použije schému, ktorá je jednou z hlavných zložiek. To uloží schému do súboru na ďalšie spracovanie údajov.

Spoločnosť Avro je najvhodnejšia na spracovanie veľkých dát. Vo svete Hadoop a Kafka je veľmi populárny pre svoje rýchlejšie spracovanie.

Spoločnosť Avro vytvorí dátový súbor, kde v časti metadát uchováva údaje spolu so schémou. Poskytuje predovšetkým bohatú dátovú štruktúru, vďaka ktorej je populárnejší ako iné podobné riešenia.

Ak chcete použiť Avro na serializáciu, musíme postupovať podľa krokov uvedených nižšie.

3. Vyhlásenie o probléme

Začnime definovaním triedy s názvom AvroHttRequest ktoré použijeme pre svoje príklady. Trieda obsahuje primitívne aj zložité atribúty typu:

trieda AvroHttpRequest {private long requestTime; private ClientIdentifier clientIdentifier; súkromný zoznam zamestnancovJména; súkromný aktívny aktívny; } 

Tu, requestTime je primitívna hodnota. ClientIdentifier je ďalšia trieda, ktorá predstavuje zložitý typ. My tiež máme Meno zamestnanca čo je opäť komplexný typ. Aktívny je enum popisujúce, či je daný zoznam zamestnancov aktívny alebo nie.

Naším cieľom je serializovať a de-serializovať AvroHttRequest triedy pomocou Apache Avro.

4. Avro dátové typy

Predtým, ako budeme pokračovať, prediskutujme dátové typy podporované spoločnosťou Avro.

Avro podporuje dva typy údajov:

  • Primitívny typ: Avro podporuje všetky primitívne typy. Názov primitívneho typu používame na definovanie typu daného poľa. Napríklad hodnota, ktorá má a String by mal byť v schéme deklarovaný ako {„type“: „string“}
  • Komplexný typ: Avro podporuje šesť druhov komplexných typov: záznamy, enumy, polia, mapy, odbory a pevné

Napríklad v našom vyhlásení o probléme ClientIdentifier je rekord.

V tom prípade schéma pre ClientIdentifier by malo vyzerať takto:

{"type": "record", "name": "ClientIdentifier", "namespace": "com.baeldung.avro", "fields": [{"name": "hostName", "type": "string" }, {"name": "ipAddress", "type": "string"}]}

5. Používanie Avro

Na začiatok pridajme závislosti Maven, ktoré budeme potrebovať pom.xml spis.

Mali by sme zahrnúť nasledujúce závislosti:

  • Apache Avro - základné komponenty
  • Compiler - Apache Avro Compilers for Avro IDL and Avro Specific Java APIT
  • Nástroje - ktoré zahŕňajú nástroje a pomôcky príkazového riadku Apache Avro
  • Apache Avro Maven Plugin pre projekty Maven

Pre tento výukový program používame verziu 1.8.2.

Vždy sa však odporúča nájsť najnovšiu verziu na serveri Maven Central:

 org.apache.avro avro-kompilátor 1.8.2 org.apache.avro avro-maven-plugin 1.8.2 

Po pridaní závislostí maven budú ďalšie kroky:

  • Vytvorenie schémy
  • Čítanie schémy v našom programe
  • Serializácia našich údajov pomocou Avro
  • Nakoniec údaje de-serializujte

6. Vytvorenie schémy

Spoločnosť Avro popisuje svoju schému pomocou formátu JSON. Pre danú schému Avro existujú hlavne štyri atribúty:

  • Typ- ktorý popisuje typ schémy, či už je to jej zložitý typ alebo primitívna hodnota
  • Menný priestor- , ktorý popisuje menný priestor, kam daná Schéma patrí
  • názov - názov schémy
  • Polia- ktorý hovorí o poliach spojených s danou schémou. Polia môžu byť primitívneho aj zložitého typu.

Jedným zo spôsobov vytvorenia schémy je napísanie reprezentácie JSON, ako sme videli v predchádzajúcich častiach.

Môžeme tiež vytvoriť schému pomocou SchemaBuilder čo je nepochybne lepší a efektívny spôsob jeho vytvorenia.

6.1. SchemaBuilder Úžitkovosť

Trieda org.apache.avro.SchemaBuilder je užitočné pri vytváraní schémy.

Najskôr vytvorme schému pre ClientIdentifier:

Schema clientIdentifier = SchemaBuilder.record ("ClientIdentifier") .namespace ("com.baeldung.avro") .fields (). RequiredString ("hostName"). RequiredString ("ipAddress") .endRecord ();

Teraz to použijeme na vytvorenie súboru avroHttpRequest schéma:

Schema avroHttpRequest = SchemaBuilder.record ("AvroHttpRequest") .namespace ("com.baeldung.avro") .fields (). RequiredLong ("requestTime") .name ("clientIdentifier"). Typ (clientIdentifier) ​​.noDefault (). name ("employeeNames") .type () .array () .items () .stringType () .arrayDefault (null) .name ("active") .type () .enumeration ("active") .symbols ("YES "," NIE ") .noDefault () .endRecord ();

Je dôležité si tu uvedomiť, že sme to pridelili clientIdentifier ako typ pre clientIdentifier lúka. V tomto prípade, clientIdentifier použitý na definovanie typu je rovnaká schéma, ktorú sme vytvorili predtým.

Neskôr môžeme použiť natiahnuť metóda na získanie JSON štruktúra Schéma.

Súbory schémy sa ukladajú pomocou prípony .avsc. Poďme uložiť našu vygenerovanú schému do „Src / main / resources / avroHttpRequest-schema.avsc“ spis.

7. Čítanie schémy

Čítanie schémy je viac menej o vytváranie tried Avro pre danú schému. Po vytvorení tried Avro ich môžeme použiť na serializáciu a deserializáciu objektov.

Existujú dva spôsoby, ako vytvoriť triedy Avro:

  • Programové generovanie tried Avro: Triedy je možné generovať pomocou SchemaCompiler. Existuje niekoľko rozhraní API, ktoré môžeme použiť na generovanie tried Java. Kód pre generačné triedy nájdeme na GitHube.
  • Používanie Maven na generovanie tried

Máme jeden doplnok maven, ktorý robí prácu dobre. Musíme zahrnúť doplnok a spustiť mvn čistá inštalácia.

Pridajme si doplnok do našej pom.xml spis:

 org.apache.avro avro-maven-plugin $ {avro.version} schémy generate-sources protokol schémy idl-protokol $ {project.basedir} / src / main / resources / $ {project.basedir} / src / main / java / 

8. Serializácia a deserializácia s Avro

Po dokončení generovania schémy pokračujme v skúmaní časti serializácie.

Spoločnosť Avro podporuje dva formáty serializácie údajov: formát JSON a binárny formát.

Najskôr sa zameriame na formát JSON a potom budeme diskutovať o binárnom formáte.

Pred ďalším postupom by sme si mali prejsť niekoľkými kľúčovými rozhraniami. Pre serializáciu môžeme použiť nižšie uvedené rozhrania a triedy:

DatumWriter: Mali by sme to použiť na zápis údajov o danej schéme. Budeme používať SpecificDatumWriter implementácia v našom príklade však DatumWriter má aj ďalšie implementácie. Ostatné implementácie sú GenericDatumWriter, Json.Writer, ProtobufDatumWriter, ReflectDatumWriter, ThriftDatumWriter.

Kódovač: Používa sa kódovač alebo sa definuje formát, ako už bolo uvedené. EncoderFactory poskytuje dva typy kódovačov, binárny kódovač a kódovač JSON.

Čítačka dátumu: Jediné rozhranie pre de-serializáciu. Opäť má niekoľko implementácií, ale budeme ich používať SpecificDatumReader v našom príklade. Ďalšie implementácie sú - GenericDatumReader, Json.ObjectReader, Json.Reader, ProtobufDatumReader, ReflectDatumReader, ThriftDatumReader.

Dekodér: Pri decentralizácii údajov sa používa dekodér. Dekodér poskytuje dva typy dekodérov: binárny dekodér a dekodér JSON.

Ďalej sa pozrime, ako v Avro prebieha serializácia a de-serializácia.

8.1. Serializácia

Zoberieme si príklad z AvroHttpRequest triedy a skúste to serializovať pomocou Avra.

Najskôr to serializujme vo formáte JSON:

public byte [] serealizeAvroHttpRequestJSON (požiadavka AvroHttpRequest) {spisovateľ DatumWriter = nový SpecificDatumWriter (AvroHttpRequest.class); byte [] data = nový bajt [0]; Stream ByteArrayOutputStream = nový ByteArrayOutputStream (); Kodér jsonEncoder = null; try {jsonEncoder = EncoderFactory.get (). jsonEncoder (AvroHttpRequest.getClassSchema (), stream); writer.write (požiadavka, jsonEncoder); jsonEncoder.flush (); data = stream.toByteArray (); } catch (IOException e) {logger.error ("Chyba serializácie:" + e.getMessage ()); } návratové údaje; } 

Pozrime sa na testovací prípad tejto metódy:

@Test public void whenSerialized_UsingJSONEncoder_ObjectGetsSerialized () {byte [] data = serealizer.serealizeAvroHttpRequestJSON (požiadavka); assertTrue (Objects.nonNull (data)); assertTrue (data.length> 0); }

Tu sme použili jsonEncoder metóda a odovzdanie schémy.

Ak sme chceli použiť binárny kódovač, musíme vymeniť jsonEncoder () metóda s binaryEncoder ():

Kodér jsonEncoder = EncoderFactory.get (). BinaryEncoder (stream, null);

8.2. Deserializácia

K tomu použijeme vyššie uvedené DátumReader a Dekodér rozhrania.

Ako sme použili EncoderFactory získať Kódovač, podobne použijeme DecoderFactory získať a Dekodér objekt.

Poďme vykonať serializáciu údajov pomocou formátu JSON:

public AvroHttpRequest deSerealizeAvroHttpRequestJSON (byte [] dáta) {Čítačka DatumReader = nový SpecificDatumReader (AvroHttpRequest.class); Dekodér dekodér = null; try {decoder = DecoderFactory.get (). jsonDecoder (AvroHttpRequest.getClassSchema (), new String (data)); spätný čítač.čítanie (null, dekodér); } catch (IOException e) {logger.error ("chyba deserializácie:" + e.getMessage ()); }} 

A pozrime sa na testovací prípad:

@Test public void whenDeserializeUsingJSONDecoder_thenActualAndExectedObjectsAreEqual () {byte [] data = serealizer.serealizeAvroHttpRequestJSON (požiadavka); AvroHttpRequest actualRequest = deSerealizer .deSerealizeAvroHttpRequestJSON (údaje); assertEquals (actualRequest, požiadavka); assertTrue (actualRequest.getRequestTime () .equals (request.getRequestTime ())); }

Podobne môžeme použiť binárny dekodér:

Dekodér dekodér = DecoderFactory.get (). BinaryDecoder (data, null);

9. Záver

Apache Avro je obzvlášť užitočný pri práci s veľkými dátami. Ponúka serializáciu údajov v binárnom aj JSON formáte, ktorý je možné použiť podľa prípadu použitia.

Proces serializácie Avro je rýchlejší a je tiež priestorovo efektívny. Spoločnosť Avro neuchováva informácie o type poľa s každým poľom; namiesto toho vytvorí metaúdaje v schéme.

V neposlednom rade má Avro skvelú väzbu so širokou škálou programovacích jazykov, čo mu dáva výhodu.

Ako vždy, kód nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found