Vodič za Apache Ignite

1. Uvod

Apache Ignite je distribuirana platforma usmjerena na memoriju otvorenog koda. Možemo ga koristiti kao bazu podataka, sustav predmemoriranja ili za obradu podataka u memoriji.

Platforma koristi memoriju kao sloj za pohranu, stoga ima impresivne stope performansi. Jednostavno rečeno, ovo je jedna od najbržih atomskih platformi za obradu podataka koja se trenutno koristi.

2. Instalacija i postavljanje

Za početak pogledajte početnu stranicu za početne upute za postavljanje i instalaciju.

Mavenove ovisnosti za aplikaciju koju ćemo izgraditi:

 org.apache.ignite ignite-core $ {ignite.version} org.apache.ignite ignite-indeksiranje $ {ignite.version} 

zapaliti-core jedina je obavezna ovisnost o projektu. Kako također želimo komunicirati s SQL-om, indeksiranje paljenja je također ovdje. $ {ignite.version} je najnovija verzija Apache Ignitea.

Kao zadnji korak započinjemo ignite čvor:

Čvor za paljenje pokrenut je u redu (id = 53c77dea) Snimka topologije [ver = 1, poslužitelji = 1, klijenti = 0, CPU-ovi = 4, odmak = 1,2 GB, hrpa = 1,0 GB] Konfigurirani podatkovni regioni: ^ - zadana [initSize = 256,0 MiB, maxSize = 1,2 GiB, persistenceEnabled = false]

Gornji izlaz konzole pokazuje da smo spremni.

3. Arhitektura memorije

Platforma se temelji na Durable Memory Architecture. To omogućuje pohranu i obradu podataka na disku i u memoriji. Povećava performanse učinkovitom upotrebom RAM resursa klastera.

Podaci u memoriji i na disku imaju isti binarni prikaz. To znači da nema dodatne pretvorbe podataka tijekom prelaska s jednog sloja na drugi.

Trajna memorijska arhitektura dijeli se na blokove fiksne veličine koji se nazivaju stranice. Stranice su pohranjene izvan Java gomile i organizirane u RAM-u. Ima jedinstveni identifikator: FullPageId.

Stranice komuniciraju s memorijom pomoću PageMemory apstrakcija.

Pomaže čitati, pisati stranicu, a također i dodijeliti ID stranice. Unutar memorije, Ignite povezuje stranice s Međuspremnici.

4. Memorijske stranice

Stranica može imati sljedeća stanja:

  • Neopterećeno - u memoriju nije učitan međuspremnik stranice
  • Jasno - međuspremnik stranice se učitava i sinkronizira s podacima na disku
  • Durty - međuspremnik stranice sadrži podatke koji se razlikuju od podataka na disku
  • Prljava kontrolna točka - postoji još jedna izmjena koja započinje prije nego što prva nastavi na disku. Ovdje počinje kontrolna točka i PageMemory čuva dva memorijska međuspremnika za svaku stranicu.

Trajna memorija lokalno izdvaja memorijski segment tzv Podatkovna regija. Prema zadanim postavkama ima kapacitet od 20% memorije klastera. Konfiguracija više regija omogućuje čuvanje korisnih podataka u memoriji.

Maksimalni kapacitet regije je memorijski segment. To je fizička memorija ili kontinuirani bajtni niz.

Da bi se izbjegle fragmentacije memorije, jedna stranica sadrži više unosa ključ / vrijednost. Svaki novi unos bit će dodan na najoptimalniju stranicu. Ako veličina para ključ / vrijednost premašuje maksimalni kapacitet stranice, Ignite podatke pohranjuje na više stranica. Ista se logika odnosi i na ažuriranje podataka.

SQL i predmemorijski indeksi pohranjeni su u strukturama poznatim kao B + drveće. Tipke predmemorije poredane su prema njihovim vrijednostima ključeva.

5. Životni ciklus

Svaki čvor Ignite radi na jednoj JVM instanci. Međutim, moguće je konfigurirati pokretanje više ignite čvorova u jednom JVM procesu.

Prođimo kroz vrste događaja životnog ciklusa:

  • BEFORE_NODE_START - prije pokretanja čvora Ignite
  • NAKON_NODE_START - pali odmah nakon pokretanja čvora Ignite
  • BEFORE_NODE_STOP - prije pokretanja zaustavljanja čvora
  • AFTER_NODE_STOP - nakon zaustavljanja čvora Ignite

Da biste pokrenuli zadani ignite čvor:

Zapaliti zapaliti = Ignition.start ();

Ili iz konfiguracijske datoteke:

Ignite ignite = Ignition.start ("config / example-cache.xml");

U slučaju da nam treba veća kontrola nad postupkom inicijalizacije, postoji drugi način uz pomoć Životni ciklus sučelje:

javna klasa CustomLifecycleBean implementira LifecycleBean {@Override public void onLifecycleEvent (LifecycleEventType lifecycleEventType) baca IgniteException {if (lifecycleEventType == LifecycleEventType.AFTER_NODE_START) {// ...}}}

Ovdje možemo koristiti vrste događaja životnog ciklusa za izvođenje radnji prije ili nakon pokretanja / zaustavljanja čvora.

U tu svrhu prosljeđujemo instancu konfiguracije s CustomLifecycleBean na start metodu:

Konfiguracija IgniteConfiguration = nova IgniteConfiguration (); configuration.setLifecycleBeans (novi CustomLifecycleBean ()); Ignite ignite = Ignition.start (konfiguracija);

6. Mreža podataka u memoriji

Mreža podataka Ignite distribuirana je pohrana ključ-vrijednost, vrlo poznat pregrađenom HashMap. Vodoravno je skalirano. To znači da dodajemo više čvorova klastera, više podataka se predmemorira ili pohranjuje u memoriju.

Može pružiti značajno poboljšanje performansi softvera treće strane, poput NoSql, RDMS baza podataka kao dodatni sloj za predmemoriranje.

6.1. Podrška u keširanju

API za pristup podacima temelji se na specifikaciji JCache JSR 107.

Kao primjer, izradimo predmemoriju pomoću konfiguracije predloška:

Predmemorija IgniteCache = ignite.getOrCreateCache ("baeldingCache");

Da vidimo što se ovdje događa za više detalja. Prvo, Ignite pronalazi područje memorije u kojem je spremljena predmemorija.

Tada će se stranica indeksa stabla B + nalaziti na temelju hash koda ključa. Ako indeks postoji, nalazit će se stranica podataka odgovarajućeg ključa.

Kada je indeks NULL, platforma stvara novi unos podataka pomoću datog ključa.

Dalje, dodajmo neke Zaposlenik objekti:

cache.put (1, novi zaposlenik (1, "John", istina)); cache.put (2, novi zaposlenik (2, "Anna", netačno)); cache.put (3, novi zaposlenik (3, "George", istina));

Opet će trajna memorija tražiti memorijsko područje kojem pripada predmemorija. Na temelju ključa predmemorije, indeksna stranica bit će smještena u strukturu stabla B +.

Kada indeksna stranica ne postoji, traži se nova koja se dodaje na stablo.

Dalje, stranica podataka dodjeljuje se indeksnoj stranici.

Da bismo zaposlenika pročitali iz predmemorije, samo koristimo ključnu vrijednost:

Zaposlenik zaposlenik = cache.get (1);

6.2. Podrška za strujanje

U memoriji strujanje podataka pruža alternativni pristup aplikacijama za obradu podataka temeljenih na disku i datotečnom sustavu. Streaming API dijeli protok podataka s velikim opterećenjem u više faza i usmjerava ih na obradu.

Možemo izmijeniti naš primjer i strujati podatke iz datoteke. Prvo definiramo streamer podataka:

IgniteDataStreamer streamer = zapaliti .dataStreamer (cache.getName ());

Dalje, možemo registrirati strujni transformator kako bismo primljene zaposlenike označili kao zaposlene:

streamer.receiver (StreamTransformer.from ((e, arg) -> {Zaposlenik zaposlenik = e.getValue (); worker.setEposed (istina); e.setValue (zaposlenik); vratiti zaposlenika;}));

Kao posljednji korak, ponavljamo zaposlenici.txt linije datoteka i pretvoriti ih u Java objekte:

Put puta = Paths.get (IgniteStream.class.getResource ("zaposlenici.txt") .toURI ()); Gson gson = novi Gson (); Files.lines (put) .forEach (l -> streamer.addData (worker.getId (), gson.fromJson (l, Employee.class)));

Uz upotrebu streamer.addData () stavite predmete zaposlenika u tok.

7. Podrška za SQL

Platforma pruža SQL bazu podataka usmjerenu na memoriju, otpornu na greške.

Možemo se povezati ili s čistim SQL API-jem ili s JDBC-om. Sintaksa SQL ovdje je ANSI-99, tako da su podržane sve standardne funkcije agregiranja u upitima, DML, DDL jezičnim operacijama.

7.1. JDBC

Da bismo bili praktičniji, napravimo tablicu zaposlenika i dodajte joj neke podatke.

U tu svrhu, registriramo JDBC upravljački program i otvaramo vezu kao sljedeći korak:

Class.forName ("org.apache.ignite.IgniteJdbcThinDriver"); Veza conn = DriverManager.getConnection ("jdbc: ignite: thin: //127.0.0.1/");

Uz pomoć standardne DDL naredbe popunjavamo Zaposlenik stol:

sql.executeUpdate ("STVORI TABELU Zaposlenik (" + "id DUG PRIMARNI KLJUČ, ime VARCHAR, isEcredited tinyint (1))" + "S \" predložak = repliciran \ "");

Nakon ključne riječi WITH možemo postaviti predložak za konfiguraciju predmemorije. Ovdje koristimo REPLICIRANO. Prema zadanim postavkama način rada s predloškom je PODIJELJENO. Da bismo odredili broj kopija podataka, također možemo odrediti Sigurnosne kopije parametar ovdje, koji je prema zadanim postavkama 0.

Zatim, zbrojimo neke podatke pomoću INSERT DML izraza:

PreparedStatement sql = conn.prepareStatement ("INSERT INTO Employee (id, name, isEmploymented) VRIJEDNOSTI (?,?,?)"); sql.setLong (1, 1); sql.setString (2, "James"); sql.setBoolean (3, istina); sql.executeUpdate (); // dodaj ostalo 

Nakon toga biramo zapise:

ResultSet rs = sql.executeQuery ("SELECT e.name, e.isEfficied" + "FROM Employee e" + "WHERE e.isEfficied = TRUE")

7.2. Ispitajte objekte

Također je moguće izvršiti upit preko Java objekata pohranjenih u predmemoriji. Ignite tretira Java objekt kao zaseban SQL zapis:

IgniteCache cache = ignite.cache ("baeldungCache"); SqlFieldsQuery sql = novi SqlFieldsQuery ("odaberite ime iz zaposlenika gdje je zaposleni = 'true'"); Kursor upita pokazivač = cache.query (sql); za (Red reda: pokazivač) {// učiniti nešto s retkom}

8. Sažetak

U ovom vodiču kratko smo pogledali projekt Apache Ignite. Ovaj vodič ističe prednosti platforme u odnosu na druge slične proizvode kao što su poboljšanje performansi, trajnost, lagani API-ji.

Kao rezultat, naučili smo kako koristiti SQL jezik i Java API za pohranu, dohvaćanje i strujanje podataka unutar rešetke postojanosti ili u memoriji.

Kao i obično, cjeloviti kôd za ovaj članak dostupan je na GitHubu.