
Vi Àr en avdelning för teknikutveckling av detaljhandeln. En gÄng satte ledningen en uppgift att snabba upp storskaliga berÀkningar genom att anvÀnda Apache Ignite i samband med MSSQL, och visade en webbplats med fantastiska illustrationer och exempel pÄ Java-kod. Jag gillade genast webbplatsen. , vars beskrivning lovar underverk: du behöver inte manuellt distribuera din Java- eller Scala-kod pÄ varje nod i nÀtverket och Äterskapa det varje gÄng det Àndras. Under arbetets gÄng visade det sig att Zero Deployment har sina egna anvÀndningsspecifikationer, som jag vill dela med mig av. HÀr Àr mina tankar och detaljer om implementeringen.
1. Problemformulering
KÀrnan i uppgiften Àr följande. Det finns en katalog över försÀljningspunkter SalesPoint och en katalog över varor Sku (Stock Keeping Unit). Varje försÀljningspunkt har en attribut "butikstyp" med vÀrdena "liten" och "stor". Till varje försÀljningspunkt ansluts (laddas frÄn databas) ett sortiment (lista över varor i försÀljningspunkten) och information lÀmnas om att den angivna varan
antingen tas bort frÄn sortimentet eller lÀggs till i sortimentet.
Det krÀvs att organisera en partitionerad cache för försÀljningspunkter och lagra information om anslutna varor en mÄnad framÄt. Kompatibilitet med produktsystemet krÀver att klientnoden Ignite laddar data, berÀknar aggregatet av typen (butikstyp, varukod, dag, antal försÀljningspunkter) och laddar tillbaka den till databasen.
2. Litteraturstudie
Eftersom det Ànnu inte finns nÄgon erfarenhet, börjar jag med att göra en översikt av publikationerna.
En artikel frÄn 2016 innehÄller en lÀnk till dokumentationen för Apache Ignite-projektet och samtidigt en anklagelse om den otydlighet som finns i denna dokumentation. Jag lÀste igenom den ett par gÄnger, men förstÄelsen kommer inte. Jag vÀnder mig till den officiella handledningen , som
som optimistiskt lovar "Du kommer snabbt att vara igÄng!". Jag gÄr igenom instÀllningarna för miljövariabler, tittar pÄ tvÄ videor om Apache Ignite Essentials, som visade sig vara inte sÄ anvÀndbara för min specifika uppgift. Jag startar Ignite frÄn kommandoraden med standardfilen "example-ignite.xml", och bygger min första applikation med hjÀlp av Maven. Applikationen fungerar och anvÀnder Zero Deployment, vilken skönhet!
Jag lÀser vidare, och dÀr anvÀnder exemplet direkt affinityKey (skapad tidigare via en SQL-frÄga), och dessutom tillÀmpas det mystiska BinaryObject:
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary(); Jag lĂ€ste : binĂ€rt format â nĂ„got i stil med reflektion, Ă„tkomst till objektfĂ€lt efter namn. Kan lĂ€sa fĂ€ltvĂ€rdet utan full deserialisering av objektet (minnesbesparing). Men varför anvĂ€nds BinaryObject istĂ€llet för Person, nĂ€r det finns Zero Deployment? Varför översĂ€tts IgniteCache till IgniteCache? Ăn sĂ„ lĂ€nge oklart.
Jag anpassar Compute Application efter mitt fall. PrimÀrnyckeln för försÀljningsstÀllen i MSSQL Àr definierad som [id] [int] NOT NULL, jag skapar en cache pÄ liknande sÀtt.
IgniteCache salesPointCache = ignite.cache("spCache")I xml-konfigurationen anger jag att cachen Àr partitionerad
Partitionering efter försÀljningsstÀllen innebÀr att den nödvÀndiga aggregaten kommer att byggas pÄ varje nod i klustret för de upptagna posterna i salesPointCache, varefter klientnoden utför den slutgiltiga summeringen.
Jag lÀser en tutorial , jag gör pÄ liknande sÀtt. PÄ varje nod i klustret startar jag IgniteRunnable(), ungefÀr sÄ hÀr:
@Override
public void run() {
SalesPoint sp = salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}Jag lÀgger till logik för aggregering och export, kör pÄ en testdatamÀngd. Lokalt pÄ utvecklingsservern fungerar allt.
Jag startar tvÄ testservrar CentOs, anger ip-adresser i default-config.xml, kör pÄ varje
./bin/ignite.sh config/default-config.xmlBÄda Ignite-noderna startar och ser varandra. Jag anger de nödvÀndiga adresserna i xml-konfigurationen för klientapplikationen, den startar, lÀgger till en tredje nod i topologin och genast blir antalet noder Äterigen tvÄ. I loggen stÄr "ClassNotFoundException: model.SalesPoint" pÄ raden
SalesPoint sp = salesPointCache.get(spId);StackOverflow sĂ€ger att orsaken till felet Ă€r att det saknas anpassad klass SalesPoint pĂ„ CentOs-servrarna. Det Ă€r illa. Hur Ă€r det med "you donât have to manually deploy your Java code on each node" och sĂ„ vidare? Eller Ă€r "your Java code" inte om SalesPoint?
Antagligen har jag missat nÄgot - börjar leta, lÀsa och leta igen. Efter en stund fÄr jag kÀnslan av att jag har lÀst allt om Àmnet, inget nytt kvar. Medan jag sökte hittade jag nÄgra intressanta observationer.
, Lead Architect at GridGain Systems, pÄ StackOverflow, april 2016:
Modellklasser Àr inte peer-deployade, men du kan anvÀnda withKeepBinary() flaggan pÄ cachen och frÄga BinaryObjects. PÄ sÄ sÀtt undviker du deserialisering pÄ serversidan och fÄr inte ClassNotFoundException.Ytterligare en auktoritativ Äsikt: , Director of product management, GridGain Systems.
Artikel pÄ Habré refererar till tre artiklar av Denis Magda: , , 2016-2017. I den andra artikeln föreslÄr Denis att starta en klusterknut via MaintenanceServiceNodeStartup.jar. Du kan ocksÄ anvÀnda en start med xml-konfiguration och kommandoraden, men dÄ mÄste du manuellt placera anvÀndarklasser pÄ varje distribuerad klusterknut:
Det Àr allt. Starta (..) knuten med MaintenanceServiceNodeStartup-filen eller skicka
maintenance-service-node-config.xml till Apache Ignites ignite.sh/bat-skript.
Om du föredrar det senare, se till att bygga en jar-fil som kommer att innehÄlla
alla klasser frÄn java/app/common och java/services/maintenance katalogerna.
Jar-filen mÄste lÀggas till classpathen för varje knut dÀr tjÀnsten
kan distribueras.Verkligen, det Àr allt. HÀr Àr han, faktiskt, varför, detta mystiska binÀra format!
3. SingleJar
Denis kom pÄ första plats i min personliga ranking, imo den mest anvÀndbara handledningen av alla tillgÀngliga. I hans pÄ GitHub finns det ett helt fÀrdigt exempel pÄ hur man konfigurerar klusterknutorna, vilket kompileras utan nÄgra extra krusiduller.
Jag gör efter mönstret och fÄr en enda jar-fil som startar 'data node' eller 'client node' beroende pÄ kommandoradsargumentet. Bygget startar och fungerar. Zero Deployment Àr besegrat.
ĂvergĂ„ngen frĂ„n megabyte testdata till tiotals gigabyte produktionsdata visade att det binĂ€ra formatet finns dĂ€r av en anledning. Det krĂ€vdes att optimera minnesanvĂ€ndningen pĂ„ noderna, och hĂ€r visade sig BinaryObject vara mycket anvĂ€ndbart.
4. Slutsatser
Den första kritiken jag mötte om otydlighet i dokumentationen för Apache Ignite-projektet visade sig vara berÀttigad, sedan 2016 har det Àndrats lite. Det Àr inte lÀtt för en nybörjare att samla en fungerande prototyp baserat pÄ webbplatsen och/eller arkivet.
Som en slutsats av det utförda arbetet fick jag intrycket att Zero Deployment fungerar, men endast pÄ systemnivÄ. UngefÀr sÄ: BinaryObject anvÀnds för att lÀra avlÀgsna klusterknutar att arbeta med anvÀndarklasser; Zero Deployment Àr en intern mekanism
för Apache Ignite sjÀlv och sprider systemobjekt över klustret.
Jag hoppas att min erfarenhet blir anvÀndbar för nya anvÀndare av Apache Ignite.
KĂ€lla: habr.com
