Vodič za Apache Mesos

1. Pregled

Obično postavljamo razne aplikacije na isti klaster strojeva. Na primjer, danas je uobičajeno imati distribuirani mehanizam za obradu poput Apache Spark ili Apache Flink s distribuiranim bazama podataka poput Apache Cassandre u istom klasteru.

Apache Mesos platforma je koja omogućuje učinkovito dijeljenje resursa između takvih aplikacija.

U ovom ćemo članku prvo razmotriti nekoliko problema raspodjele resursa unutar aplikacija raspoređenih na istom klasteru. Kasnije ćemo vidjeti kako Apache Mesos omogućuje bolje korištenje resursa između aplikacija.

2. Dijeljenje klastera

Mnoge aplikacije trebaju dijeliti klaster. Općenito postoje dva uobičajena pristupa:

  • Klaster particionirajte statički i pokrenite aplikaciju na svakoj particiji
  • Dodijelite skup strojeva aplikaciji

Iako ovi pristupi omogućuju da se aplikacije izvode neovisno jedna o drugoj, to ne postiže visoku iskorištenost resursa.

Na primjer, razmotrite prijavu koja radi samo kratko vrijeme nakon čega slijedi razdoblje neaktivnosti. Budući da smo ovoj aplikaciji dodijelili statičke strojeve ili particije, jesmo neiskorišteni resursi tijekom neaktivnog razdoblja.

Korištenje resursa možemo optimizirati preraspodjelom besplatnih resursa tijekom neaktivnog razdoblja na druge aplikacije.

Apache Mesos pomaže u dinamičkoj raspodjeli resursa između aplikacija.

3. Apache Mesos

S oba pristupa razmjene klastera o kojima smo gore razgovarali, aplikacije su svjesne samo resursa određene particije ili stroja na kojem rade. Međutim, Apache Mesos aplikacijama pruža apstraktni prikaz svih resursa u klasteru.

Kao što ćemo uskoro vidjeti, Mesos djeluje kao sučelje između strojeva i aplikacija. Pruža aplikacije s dostupni resursi na svim strojevima u klasteru. To često ažurira ove informacije tako da uključuju resurse koje oslobađaju aplikacije koji su dostigli status završetka. To omogućuje aplikacijama da donesu najbolju odluku o tome koji će zadatak izvršiti na kojem stroju.

Da bismo razumjeli kako Mesos radi, pogledajmo njegovu arhitekturu:

Ova je slika dio službene dokumentacije za Mesos (izvor). Ovdje, Hadoop i MPI su dvije aplikacije koje dijele klaster.

O svakoj ovdje prikazanoj komponenti razgovarat ćemo u sljedećih nekoliko odjeljaka.

3.1. Učitelj Mesos

Master je glavna komponenta u ovom postavljanju i pohranjuje trenutno stanje resursa u klasteru. Uz to, djeluje kao orkestrator između agenata i aplikacije prosljeđivanjem informacija o stvarima poput resursa i zadataka.

Budući da bilo koji neuspjeh u masteru rezultira gubitkom stanja o resursima i zadacima, raspoređujemo ga u konfiguraciji visoke dostupnosti. Kao što se može vidjeti na gornjem dijagramu, Mesos postavlja glavne demone u stanju pripravnosti zajedno s jednim vođom. Ovi se demoni oslanjaju na čuvara zoološkog vrta u slučaju oporavka.

3.2. Mesos agenti

Mesos klaster mora pokretati agenta na svakom stroju. Ti agenti povremeno prijavite svoje resurse majstoru i zauzvrat, primati zadatke koje je program trebao pokrenuti. Ovaj se ciklus ponavlja nakon što je planirani zadatak dovršen ili izgubljen.

Kako će programi rasporediti i izvršavati zadatke na tim agentima, vidjet ćemo u sljedećim odjeljcima.

3.3. Mesos Frameworks

Mesos omogućuje aplikacijama da implementiraju apstraktnu komponentu koja komunicira s Master-om dobiti dostupne resurse u klasteru i štoviše donositi odluke o rasporedu na temelju njih. Te su komponente poznate kao okviri.

Mesosov okvir sastoji se od dvije potkomponente:

  • Planer - Omogućuje aplikacijama planiranje zadataka na temelju dostupnih resursa svih agenata
  • Izvršitelj - Radi na svim agentima i sadrži sve podatke potrebne za izvršavanje bilo kojeg planiranog zadatka na tom agentu

Cijeli ovaj proces prikazan je ovim tokom:

Prvo, agenti prijavljuju svoje resurse majstoru. U ovom trenutku master nudi ove resurse svim registriranim planerima. Taj je postupak poznat kao ponuda resursa, a o njemu ćemo detaljno razgovarati u sljedećem odjeljku.

Tada planer odabire najboljeg agenta i izvršava razne zadatke na njemu putem Master-a. Čim izvršitelj izvrši dodijeljeni zadatak, agenti ponovno objavljuju svoje resurse glavnom upravitelju. Master ponavlja ovaj postupak dijeljenja resursa za sve okvire u klasteru.

Mesos aplikacijama omogućuje implementiraju svoj prilagođeni rokovnik i izvršitelj u raznim programskim jezicima. Java implementacija planera mora implementiratithe Planer sučelje:

javna klasa HelloWorldScheduler implementira Scheduler {@Override public void registered (SchedulerDriver schedulerDriver, Protos.FrameworkID frameworkID, Protos.MasterInfo masterInfo) {} @Override public void reregistered (SchedulerDriver schedulerDriver, Protos.MasterInfo masterInfoff) SchedulerDriver, Popisni popis) {} @Override public void offerRescinded (SchedulerDriver schedulerDriver, OfferID offerID) {} @Override public void statusUpdate (SchedulerDriver schedulerDriver, Protos.TaskStatus taskStatus) {} @Override public void frameworkDeverDireverDeviserDraver ScheduerDeverDirector , Protos.SlaveID slaveID, bajt [] bajtova) {} @Override javna praznina je isključena (SchedulerDriver schedulerDriver) {} @Override public void slaveLost (SchedulerDriver schedulerDriver, Protos.SlaveID slaveID) {} @Override public void executorLost (SchedulerDraverDriverLover (SchedulerDriver) .ExecutorID executorID, Protos.SlaveID slaveID, tj nt i) {} @Override javna pogreška praznine (SchedulerDriver schedulerDriver, String s) {}}

Kao što se može vidjeti, uglavnom se sastoji od razne metode povratnog poziva za komunikaciju s masterom posebno.

Slično tome, provedba izvršitelja mora implementirati Izvršitelj sučelje:

javna klasa HelloWorldExecutor implementira Executor {@Override public void registered (ExecutorDriver driver, Protos.ExecutorInfo executorInfo, Protos.FrameworkInfo frameworkInfo, Protos.SlaveInfo slaveInfo) {} @Override public void reregistered (Driver ExecutorDriver), slave.Info, SlaveInfo} javna praznina je isključena (pokretač ExecutorDriver) {} @Override public void launchTask (pokretački program ExecutorDriver, zadatak Protos.TaskInfo) {} @Override public void killTask ​​(pokretački program ExecutorDriver, Protos.TaskID) {} @Override driver void frameworkMessage (ExecutorDriver) bajt [] podaci) {} @Preuzmi javno isključenje praznina (pokretački program ExecutorDriver) {}}

Operativnu verziju planera i izvršitelja vidjet ćemo u kasnijem odjeljku.

4. Upravljanje resursima

4.1. Ponude resursa

Kao što smo ranije razgovarali, agenti objavljuju svoje podatke o resursu glavnom upravitelju. Zauzvrat, master nudi te resurse okvirima koji se izvode u klasteru. Taj je postupak poznat kao ponuda resursa.

Ponuda resursa sastoji se od dva dijela - resursa i atributa.

Resursi su navikli objaviti hardverske informacije stroja agenta kao što su memorija, CPU i disk.

Za svakog agenta postoji pet unaprijed definiranih resursa:

  • procesor
  • gpus
  • mem
  • disk
  • luke

Vrijednosti za ove resurse mogu se definirati u jednu od tri vrste:

  • Skalar - Koristi se za predstavljanje numeričkih podataka pomoću brojeva s pomičnim zarezom kako bi se omogućile razlomljene vrijednosti poput 1,5 G memorije
  • Domet - Koristi se za predstavljanje raspona skalarnih vrijednosti - na primjer, raspona priključka
  • Postavi - Koristi se za predstavljanje više tekstualnih vrijednosti

Prema zadanim postavkama, Mesos agent pokušava otkriti te resurse sa stroja.

Međutim, u nekim situacijama možemo konfigurirati prilagođene resurse na agentu. Vrijednosti za takve prilagođene resurse opet bi trebale biti u bilo kojoj od gore navedenih vrsta.

Na primjer, našeg agenta možemo pokrenuti pomoću ovih resursa:

--resources = 'cpus: 24; gpus: 2; mem: 24576; disk: 409600; portovi: [21000-24000,30000-34000]; greške (debug_role): {a, b, c}'

Kao što se može vidjeti, konfigurirali smo agenta s nekoliko unaprijed definiranih resursa i jednim prilagođenim resursom bube koji je od postavljen tip.

Pored resursa, agenti mogu objaviti atribute ključ / vrijednost glavnom. Ti atributi djeluju kao dodatni metapodaci za agenta i pomažu u okvirima za planiranje odluka.

Koristan primjer može biti to dodajte agente u različite police ili zone i onda rasporedite razne zadatke na istom stalku ili zoni kako bi se postigla lokalnost podataka:

--attributes = 'stalak: abc; zona: zapad; os: centos5; razina: 10; tipke: [1000-1500]'

Slično resursima, vrijednosti za atribute mogu biti skalar, raspon ili vrsta teksta.

4.2. Uloge resursa

Mnogi suvremeni operativni sustavi podržavaju više korisnika. Slično tome, Mesos također podržava više korisnika u istom klasteru. Ti su korisnici poznati kao uloge. Možemo razmotriti svaku ulogu potrošača resursa unutar klastera.

Zbog toga agenti Mesos mogu dijeliti resurse pod različite uloge na temelju različitih strategija raspodjele. Nadalje, okviri se mogu pretplatiti na te uloge unutar klastera i imaju preciznu kontrolu nad resursima pod različitim ulogama.

Na primjer, razmotrite a klaster hosting aplikacije koje opslužuju različite korisnike u organizaciji. Tako do dijeleći resurse na uloge, svaka aplikacija može raditi izolirano jedno od drugoga.

Uz to, okviri mogu koristiti ove uloge za postizanje lokalnosti podataka.

Na primjer, pretpostavimo da imamo dvije aplikacije u imenovanom klasteru proizvođač i potrošač. Ovdje, proizvođač zapisuje podatke u trajni volumen koji potrošač može čitati poslije. Možemo optimizirati potrošač program dijeljenjem glasnoće s uređajem proizvođač.

Budući da Mesos omogućuje više aplikacija da se pretplate na istu ulogu, trajni volumen možemo povezati s ulogom resursa. Nadalje, okviri za oboje proizvođač i potrošač oboje će se pretplatiti na istu ulogu resursa. Stoga je potrošač aplikacija sada može pokrenuti zadatak čitanja podataka na istom volumenu kao proizvođač primjena.

4.3. Rezervacija resursa

Sada se može postaviti pitanje kako Mesos raspoređuje resurse klastera u različite uloge. Mesos raspoređuje resurse rezervacijama.

Postoje dvije vrste rezervacija:

  • Statička rezervacija
  • Dinamička rezervacija

Statička rezervacija slična je dodjeli resursa prilikom pokretanja agenta o kojoj smo govorili u prethodnim odjeljcima:

 --resources = "cpus: 4; mem: 2048; cpus (baeldung): 8; mem (baeldung): 4096"

Jedina razlika ovdje je u tome što je sada Mesosov agent rezervira osam CPU-a i 4096m memorije za imenovanu ulogu baeldung.

Dinamična rezervacija omogućuje nam preslagivanje resursa unutar uloga, za razliku od statičke rezervacije. Mesos omogućuje okvirima i operaterima klastera da dinamički mijenjaju dodjelu resursa putem okvirnih poruka kao odgovor na ponudu resursa ili putem HTTP krajnjih točaka.

Mesos dodjeljuje sve resurse bez ikakve uloge u zadanu ulogu pod nazivom (*). Master nudi takve resurse svim okvirima bez obzira jesu li na njih pretplaćeni ili ne.

4.4. Ponderi resursa i kvote

Općenito, Mesosov majstor nudi resurse koristeći strategiju pravednosti. Koristi ponderiranu pravednost dominantnih resursa (wDRF) kako bi identificirao uloge kojima nedostaju resursi. Master zatim nudi više resursa okvirima koji su pretplaćeni na te uloge.

Iako je poštena podjela resursa između aplikacija važna karakteristika Mesosa, nije uvijek potrebna. Pretpostavimo da klaster hosting aplikacija koje imaju mali otisak resursa zajedno s onima koji imaju veliku potražnju za resursima. U takvim implementacijama željeli bismo dodijeliti resurse na temelju prirode aplikacije.

Mesos omogućuje okvirima da zahtijevati više resursa pretplaćujući se na uloge i dodajući veću vrijednost težine za tu ulogu. Stoga, ako postoje dvije uloge, jedna težine 1 i druga težine 2, Mesos će dodijeliti dvostruko veći udio resursa drugoj ulozi.

Slično resursima, težine možemo konfigurirati putem HTTP krajnjih točaka.

Osim što osigurava pošten udio resursa za ulogu s utezima, Mesos to osigurava dodjeljuju se minimalni resursi za ulogu.

Mesos nam to omogućuje dodajte kvote ulogama resursa. Kvota navodi minimalna količina resursa koju neka uloga zajamčeno prima.

5. Provedbeni okvir

Kao što smo raspravljali u ranijem odjeljku, Mesos dopušta aplikacijama da pružaju implementacije okvira na jeziku po svom izboru. U Javi se okvir provodi pomoću glavne klase - koja djeluje kao ulazna točka za proces okvira - i implementacije Planer i Izvršitelj raspravljali ranije.

5.1. Okvirna glavna klasa

Prije nego što implementiramo rokovnik i izvršitelj, prvo ćemo implementirati ulaznu točku za naš okvir koji:

  • Registrira se kod majstora
  • Agentima pruža izvršne informacije o izvršnom vremenu
  • Pokreće raspored

Prvo ćemo dodati ovisnost Mavena za Mesos:

 org.apache.mesos mesos 0.28.3 

Dalje ćemo implementirati HelloWorldMain za naš okvir. Jedna od prvih stvari koje ćemo učiniti je pokrenuti izvršni postupak na Mesos agentu:

javna statička void glavna (String [] args) {String path = System.getProperty ("user.dir") + "/target/libraries2-1.0.0-SNAPSHOT.jar"; CommandInfo.URI uri = CommandInfo.URI.newBuilder (). SetValue (put) .setExtract (false) .build (); Niz helloWorldCommand = "java -cp knjižnice2-1.0.0-SNAPSHOT.jar com.baeldung.mesos.executors.HelloWorldExecutor"; CommandInfo commandInfoHelloWorld = CommandInfo.newBuilder () .setValue (helloWorldCommand) .addUris (uri) .build (); ExecutorInfo executorHelloWorld = ExecutorInfo.newBuilder () .setExecutorId (Protos.ExecutorID.newBuilder () .setValue ("HelloWorldExecutor")) .setCommand (commandInfoHelloWorld) .setName ("Hello World (Java)") .set. izgraditi(); }

Ovdje smo prvo konfigurirali binarno mjesto izvršitelja. Mesos agent će preuzeti ovu binarnu datoteku nakon registracije u okviru. Dalje, agent će pokrenuti zadanu naredbu za pokretanje izvršnog postupka.

Zatim ćemo inicijalizirati naš okvir i pokrenuti planer:

FrameworkInfo.Builder frameworkBuilder = FrameworkInfo.newBuilder () .setFailoverTimeout (120000) .setUser ("") .setName ("Hello World Framework (Java)"); frameworkBuilder.setPrincipal ("test-framework-java"); Upravljački program MesosSchedulerDriver = novi MesosSchedulerDriver (novi HelloWorldScheduler (), frameworkBuilder.build (), args [0]);

Konačno, započet ćemo MesosSchedulerDriver koji se registrira kod Učitelja. Za uspješnu registraciju moramo proslijediti IP Master-a kao programski argument argumenti [0] ovoj glavnoj klasi:

int status = driver.run () == Protos.Status.DRIVER_STOPPED? 0: 1; vozač.stop (); System.exit (status);

U klasi prikazanoj gore, CommandInfo, ExecutorInfo, i FrameworkInfo su svi Java prikazi protobuf poruka između master-a i frameworka.

5.2. Provedba planera

Od Mesosa 1.0, možemo prizvati HTTP krajnju točku iz bilo kojeg Java programa za slanje i primanje poruka Mesos masteru. Neke od tih poruka uključuju, na primjer, registraciju okvira, ponude resursa i odbijanja ponuda.

Za Mesos 0.28 ili stariji, moramo implementirati Planer sučelje:

Uglavnom ćemo se usredotočiti samo na resourceOffers metoda Planer. Pogledajmo kako planer prima resurse i inicijalizira zadatke na temelju njih.

Prvo ćemo vidjeti kako planer raspoređuje resurse za zadatak:

@Override public void resourceOffers (SchedulerDriver schedulerDriver, Lista popisa) {for (Ponuda ponude: popis) {Popis zadataka = novi ArrayList (); Protos.TaskID taskId = Protos.TaskID.newBuilder () .setValue (Integer.toString (launchTasks ++)). Build (); System.out.println ("Pokretanje printHelloWorld" + taskId.getValue () + "Hello World Java"); Protos.Resource.Builder cpus = Protos.Resource.newBuilder () .setName ("cpus") .setType (Protos.Value.Type.SCALAR) .setScalar (Protos.Value.Scalar.newBuilder () .setValue (1)) ; Protos.Resource.Builder mem = Protos.Resource.newBuilder () .setName ("mem") .setType (Protos.Value.Type.SCALAR) .setScalar (Protos.Value.Scalar.newBuilder () .setValue (128)) ;

Ovdje smo za svoj zadatak dodijelili 1 CPU i 128M memorije. Dalje ćemo koristiti SchedulerDriver za pokretanje zadatka na agentu:

 TaskInfo printHelloWorld = TaskInfo.newBuilder () .setName ("printHelloWorld" + taskId.getValue ()) .setTaskId (taskId) .setSlaveId (offer.getSlaveId ()) .addResources (cpus) .addResourcesefo. newBuilder (helloWorldExecutor)) .build (); Popis offerIDS = novi ArrayList (); offerIDS.add (offer.getId ()); zadaci.add (printHelloWorld); schedulerDriver.launchTasks (offerIDS, zadaci); }}

Alternativno, Planer često pronalazi potrebu za odbijanjem ponuda resursa. Na primjer, ako je Planer ne može pokrenuti zadatak agentu zbog nedostatka resursa, mora odmah odbiti tu ponudu:

schedulerDriver.declineOffer (offer.getId ());

5.3. Provedba Izvršitelj

Kao što smo ranije razgovarali, izvršna komponenta okvira odgovorna je za izvršavanje aplikacijskih zadataka na Mesos agentu.

Za implementaciju smo koristili HTTP krajnje točke Planer u Mesosu 1.0. Isto tako, za izvršitelja možemo koristiti HTTP krajnju točku.

U ranijem odjeljku razgovarali smo o tome kako okvir konfigurira agenta za pokretanje izvršnog postupka:

java -cp biblioteke2-1.0.0-SNAPSHOT.jar com.baeldung.mesos.executors.HelloWorldExecutor

Značajno, ova naredba razmatra HelloWorldExecutor kao glavna klasa. Provest ćemo ovo glavni metoda za inicijalizira MesosExecutorDriver koji se povezuje s Mesos agentima za primanje zadataka i dijeljenje drugih informacija poput statusa zadatka:

javna klasa HelloWorldExecutor implementira Exeecuter {public static void main (String [] args) {MesosExecutorDriver driver = new MesosExecutorDriver (new HelloWorldExecutor ()); System.exit (driver.run () == Protos.Status.DRIVER_STOPPED? 0: 1); }}

Posljednje što je sada potrebno je prihvatiti zadatke iz okvira i pokrenuti ih na agentu. Informacije za pokretanje bilo kojeg zadatka samostalne su u HelloWorldExecutor:

javna void launchTask (pokretački program ExecutorDriver, zadatak TaskInfo) {Protos.TaskStatus status = Protos.TaskStatus.newBuilder () .setTaskId (task.getTaskId ()) .setState (Protos.TaskState.TASK_RUNNING) .build (); driver.sendStatusUpdate (status); System.out.println ("Izvrši zadatak !!!"); status = Protos.TaskStatus.newBuilder () .setTaskId (task.getTaskId ()) .setState (Protos.TaskState.TASK_FINISHED) .build (); driver.sendStatusUpdate (status); }

Naravno, ovo je samo jednostavna implementacija, ali objašnjava kako izvršitelj dijeli status zadatka s glavnim upravljačem u svakoj fazi, a zatim izvršava zadatak prije slanja statusa završetka.

U nekim slučajevima izvršitelji također mogu poslati podatke natrag planeru:

String myStatus = "Hello Framework"; driver.sendFrameworkMessage (myStatus.getBytes ());

6. Zaključak

U ovom smo članku ukratko razgovarali o dijeljenju resursa između aplikacija koje se izvode u istom klasteru. Također smo razgovarali o tome kako Apache Mesos pomaže aplikacijama da postignu maksimalnu iskoristivost sa apstraktnim prikazom resursa klastera poput CPU-a i memorije.

Kasnije smo razgovarali o dinamička raspodjela resursa između aplikacija na temelju razne politike i uloge pravičnosti. Mesos omogućuje izradu aplikacija odluke o raspoređivanju na temelju ponuda resursa od Mesos agenata u klasteru.

Konačno, vidjeli smo implementaciju Mesos okvira u Javi.

Kao i obično, svi primjeri dostupni su na GitHubu.