Sprievodca Apache Mesos

1. Prehľad

Zvyčajne nasadzujeme rôzne aplikácie na rovnakom zhluku strojov. Napríklad v dnešnej dobe je bežné mať distribuovaný procesor spracovania ako Apache Spark alebo Apache Flink s distribuovanými databázami ako Apache Cassandra v rovnakom klastri.

Apache Mesos je platforma, ktorá umožňuje efektívne zdieľanie zdrojov medzi takýmito aplikáciami.

V tomto článku si najskôr rozoberieme niekoľko problémov s alokáciou prostriedkov v rámci aplikácií nasadených v rovnakom klastri. Neskôr uvidíme, ako Apache Mesos poskytuje lepšie využitie zdrojov medzi aplikáciami.

2. Zdieľanie klastra

Mnoho aplikácií musí zdieľať klaster. Vo všeobecnosti existujú dva spoločné prístupy:

  • Rozdelte klaster staticky a na každom oddiele spustite aplikáciu
  • Priraďte množinu strojov k aplikácii

Aj keď tieto prístupy umožňujú aplikáciám bežať nezávisle na sebe, nedosahuje vysoké využitie zdrojov.

Zvážte napríklad aplikáciu, ktorá beží iba na krátke obdobie, po ktorom nasleduje obdobie nečinnosti. Teraz, keď sme tejto aplikácii pridelili statické stroje alebo oddiely, máme nevyužitých zdrojov počas neaktívneho obdobia.

Využitie zdrojov môžeme optimalizovať prerozdelením voľných zdrojov počas neaktívneho obdobia do iných aplikácií.

Apache Mesos pomáha s dynamickým prideľovaním zdrojov medzi aplikáciami.

3. Apache Mesos

Pri obidvoch prístupoch zdieľania klastrov, o ktorých sme hovorili vyššie, si aplikácie uvedomujú iba zdroje konkrétneho oddielu alebo stroja, ktorý prevádzkujú. Apache Mesos však poskytuje aplikáciám abstraktný pohľad na všetky zdroje v klastri.

Ako uvidíme neskôr, Mesos funguje ako rozhranie medzi strojmi a aplikáciami. Poskytuje aplikácie s dostupné zdroje na všetkých počítačoch v klastri. To tieto informácie často aktualizuje, aby obsahovala zdroje, ktoré sú uvoľňované aplikáciami ktoré dosiahli stav dokončenia. To umožňuje aplikáciám najlepšie sa rozhodnúť, ktorú úlohu majú na danom počítači vykonať.

Aby sme pochopili, ako Mesos funguje, pozrime sa na jeho architektúru:

Tento obrázok je súčasťou oficiálnej dokumentácie pre systém Mesos (zdroj). Tu, Hadoop a MPI sú dve aplikácie, ktoré zdieľajú klaster.

O každej súčasti tu zobrazenej budeme hovoriť v niekoľkých ďalších častiach.

3.1. Majster Mesos

Master je hlavným komponentom v tomto nastavení a ukladá aktuálny stav zdrojov v klastri. Ďalej pôsobí ako organizátora medzi agentmi a aplikácie odovzdávaním informácií o veciach, ako sú zdroje a úlohy.

Pretože akékoľvek zlyhanie v hlavnom počítači vedie k strate stavu zdrojov a úloh, nasadíme ho do konfigurácie vysokej dostupnosti. Ako je zrejmé z vyššie uvedeného diagramu, Mesos rozmiestňuje pohotovostných hlavných démonov spolu s jedným vodcom. Títo démoni sa spoliehajú na to, že Zookeeper obnoví stav v prípade poruchy.

3.2. Agenti spoločnosti Mesos

Klaster Mesos musí na každom počítači spúšťať agenta. Títo agenti pravidelne nahlasujú svoje zdroje majstrovi a na oplátku prijímať úlohy, ktoré má aplikácia naplánované na spustenie. Tento cyklus sa opakuje po dokončení alebo strate naplánovanej úlohy.

Uvidíme, ako aplikácie naplánujú a vykonajú úlohy na týchto agentoch v nasledujúcich častiach.

3.3. Rámečky Mesos

Mesos umožňuje aplikáciám implementovať abstraktné komponenty, ktoré interagujú s Masterom prijímať dostupné zdroje v klastri a navyše robiť rozhodnutia o plánovaní na ich základe. Tieto komponenty sú známe ako rámce.

Rámec Mesos sa skladá z dvoch podzložiek:

  • Plánovač - Umožňuje aplikáciám plánovať úlohy na základe dostupných zdrojov pre všetkých agentov
  • Exekútor - Beží na všetkých agentoch a obsahuje všetky informácie potrebné na vykonanie akejkoľvek naplánovanej úlohy na danom agentovi

Celý tento proces je znázornený týmto tokom:

Najskôr agenti nahlásia svoje zdroje pánovi. V tejto chvíli Master ponúkne tieto zdroje všetkým registrovaným plánovačom. Tento proces sa nazýva ponuka zdrojov a podrobne si ho rozoberieme v nasledujúcej časti.

Plánovač potom vyberie najlepšieho agenta a vykoná na ňom prostredníctvom Masteru rôzne úlohy. Hneď ako exekútor dokončí pridelenú úlohu, agenti znova zverejnia svoje zdroje hlavnému pracovníkovi. Master opakuje tento proces zdieľania zdrojov pre všetky rámce v klastri.

Mesos umožňuje aplikáciám implementovať svoj vlastný plánovač a exekútor v rôznych programovacích jazykoch. Implementácia plánovača v jazyku Java musí byť realizovaťthe Plánovač rozhranie:

public class HelloWorldScheduler implementuje Scheduler {@Override public void registered (SchedulerDriver schedulerDriver, Protos.FrameworkID frameworkID, Protos.MasterInfo masterInfo) {} @Override public void reregistered (SchedulerDriver schedulerDriver, Protos.MasterInfo masterInfo) schedulerDriver, zoznam) {} @Override public void offerRescinded (SchedulerDriver schedulerDriver, OfferID offerID) {} @Override public void statusUpdate (SchedulerDriver schedulerDriver, Protos.TaskStatus taskStatus) {} @Override public void frameworkMessage (Scheduler void framework) , Protos.SlaveID slaveID, byte [] bajtov) {} @Override public void odpojený (SchedulerDriver schedulerDriver) {} @Override public void slaveLost (SchedulerDriver schedulerDriver, Protos.SlaveID slaveID) {} @Override public void executorLost (SchedulerDriver scheduler .ExecutorID executorID, Protos.SlaveID slaveID, i nt i) {} @Override public void error (SchedulerDriver schedulerDriver, String s) {}}

Ako je vidieť, väčšinou sa skladá z rôzne spôsoby spätného volania pre komunikáciu s nadriadeným najmä.

Obdobne musí implementácia exekútora implementovať Exekútor rozhranie:

public class HelloWorldExecutor implementuje Executor {@Override public void registered (ExecutorDriver driver, Protos.ExecutorInfo executorInfo, Protos.FrameworkInfo frameworkInfo, Protos.SlaveInfo slaveInfo) {} @Override public void reregistered (ExecutorDriver driver, Protos.SlaveInfo) public void odpojený (ovládač ExecutorDriver) {} @Override public void launchTask (ovládač ExecutorDriver, úloha Protos.TaskInfo) {} @Override public void killTask ​​(ovládač ExecutorDriver, Protos.TaskID taskId) {} ​​@Override public void frameworkMessage (ovládač ExecutorDriver, byte [] údaje) {} @Override vypnutie verejnej neplatnosti (ovládač ExecutorDriver) {}}

Prevádzkovú verziu plánovača a vykonávateľa uvidíme v ďalšej časti.

4. Správa zdrojov

4.1. Ponuky zdrojov

Ako sme už diskutovali, agenti zverejňujú informácie o svojich zdrojoch na master. Na druhej strane hlavný server ponúka tieto zdroje rámcom bežiacim v klastri. Tento proces je známy ako a ponuka zdrojov.

Ponuka zdrojov sa skladá z dvoch častí - zdrojov a atribútov.

Zdroje sú zvyknuté zverejniť hardvérové ​​informácie o stroji agenta napríklad pamäť, procesor a disk.

Pre každého agenta existuje päť preddefinovaných zdrojov:

  • CPU
  • gpus
  • mem
  • disk
  • prístavy

Hodnoty pre tieto zdroje je možné definovať v jednom z troch typov:

  • Skalárne - Používa sa na vyjadrenie číselných informácií pomocou čísel s pohyblivou rádovou čiarkou, ktoré umožňujú zlomkové hodnoty, ako napríklad 1,5 G pamäte
  • Rozsah - Používa sa na vyjadrenie rozsahu skalárnych hodnôt - napríklad rozsahu portov
  • Nastaviť - Používa sa na vyjadrenie viacerých textových hodnôt

Agent Mesos sa predvolene pokúša tieto prostriedky zistiť zo stroja.

V niektorých situáciách však môžeme nakonfigurovať vlastné prostriedky na agenta. Hodnoty týchto vlastných zdrojov by mali byť opäť v ktoromkoľvek z typov diskutovaných vyššie.

Môžeme napríklad spustiť nášho agenta s týmito prostriedkami:

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

Ako je vidieť, nakonfigurovali sme agenta s niekoľkými preddefinovanými prostriedkami a jedným vlastným názvom s názvom ploštice ktorý je z nastaviť typu.

Okrem prostriedkov môžu agenti publikovať atribúty kľúč - hodnota na master. Tieto atribúty fungujú ako ďalšie metadáta pre agenta a pomáhajú rámcom pri rozhodovaní o plánovaní.

Užitočným príkladom môže byť pridať agentov do rôznych regálov alebo zón a potom naplánovať rôzne úlohy na rovnakom stojane alebo zóne na dosiahnutie dátovej lokality:

--attributes = 'rack: abc; zóna: západ; os: centos5; úroveň: 10; klávesy: [1000-1500]'

Podobne ako v prípade zdrojov, aj hodnoty pre atribúty môžu byť skalárne, rozsahové alebo textové.

4.2. Roly zdrojov

Mnoho moderných operačných systémov podporuje viacerých používateľov. Podobne Mesos podporuje aj viacerých používateľov v rovnakom klastri. Títo používatelia sú známi ako role. Každú rolu môžeme považovať za spotrebiteľa zdrojov v rámci klastra.

Z tohto dôvodu môžu agenti Mesos rozdeliť zdroje pod rôzne role na základe rôznych stratégií prideľovania. Ďalej sa môžu rámce prihlásiť na odber týchto rolí v rámci klastra a mať podrobnú kontrolu nad prostriedkami v rôznych rolách.

Zvážte napríklad a klastrové hostiteľské aplikácie, ktoré slúžia rôznym používateľom v organizácii. Takže tým rozdelením zdrojov na role môže každá aplikácia pracovať izolovane od seba navzájom.

Rámec môže navyše tieto role využiť na dosiahnutie lokality s údajmi.

Predpokladajme napríklad, že v klastri máme dve aplikácie s názvom producent a spotrebiteľ. Tu, producent zapisuje dáta na trvalý zväzok, ktorý spotrebiteľ môže čítať neskôr. Môžeme optimalizovať spotrebiteľ zdieľaním zväzku s producent.

Pretože Mesos umožňuje viacerým aplikáciám prihlásiť sa na odber tej istej roly, môžeme priradiť trvalý zväzok k role prostriedku. Ďalej rámce pre obe producent a spotrebiteľ obaja sa prihlásia na odber rovnakej roly zdroja. Preto spotrebiteľ aplikácia teraz môže spustiť úlohu čítania údajov na rovnakom objeme ako producent žiadosť.

4.3. Rezervácia zdrojov

Teraz môže vzniknúť otázka, ako Mesos alokuje zdroje klastra do rôznych rol. Mesos prideľuje zdroje prostredníctvom rezervácií.

Existujú dva typy rezervácií:

  • Statická rezervácia
  • Dynamická rezervácia

Statická rezervácia je podobná alokácii prostriedkov pri štarte agenta, o ktorej sme hovorili v predchádzajúcich častiach:

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

Jediný rozdiel je v tom, že teraz agent Mesos vyhradzuje pre pomenovanú rolu osem CPU a 4096 m pamäte baeldung.

Dynamická rezervácia nám umožňuje na rozdiel od statickej rezervácie preskupiť zdroje v rámci rolí. Mesos umožňuje rámcom a operátorom klastrov dynamicky meniť alokáciu zdrojov prostredníctvom správ rámca ako odpoveď na ponuku zdrojov alebo prostredníctvom koncových bodov HTTP.

Mesos alokuje všetky zdroje bez akejkoľvek roly do predvolenej roly s názvom (*). Master ponúka také zdroje všetkým rámcom bez ohľadu na to, či si ich predplatili alebo nie.

4.4. Váhy a kvóty zdrojov

Majster Mesosu všeobecne ponúka zdroje využívajúce stratégiu spravodlivosti. Na identifikáciu rolí, v ktorých chýbajú zdroje, využíva váženú dominanciu spravodlivosti zdrojov (wDRF). Master potom ponúka viac zdrojov rámcom, ktoré si tieto roly predplatili.

Aj keď je spravodlivé zdieľanie zdrojov medzi aplikáciami dôležitou charakteristikou spoločnosti Mesos, nie je to vždy nevyhnutné. Predpokladajme, že klaster hosťuje aplikácie, ktoré majú nízku stopu zdrojov spolu s tými, ktoré majú vysoký dopyt po zdrojoch. Pri takýchto nasadeniach by sme chceli alokovať zdroje na základe povahy aplikácie.

Mesos umožňuje rámcom požadovať viac zdrojov prihlásením sa na odber rolí a pridaním vyššej hodnoty váhy pre túto rolu. Preto ak existujú dve roly, jedna s váhou 1 a druhá s váhou 2, pridelí Mesos druhej úlohe dvojnásobok spravodlivého podielu zdrojov.

Podobne ako v prípade zdrojov, aj my môžeme konfigurovať váhy pomocou koncových bodov HTTP.

Okrem zabezpečenia spravodlivého podielu zdrojov na úlohe s váhami to spoločnosť Mesos tiež zaisťuje pre rolu je pridelených minimum zdrojov.

Mesos nám to umožňuje pridať kvóty k rolám zdrojov. Stanovuje sa kvóta minimálne množstvo zdrojov, ktoré rola zaručene získa.

5. Vykonávací rámec

Ako sme už diskutovali v predchádzajúcej časti, Mesos umožňuje aplikáciám poskytovať implementácie rámca v jazyku podľa vlastného výberu. V Jave je rámec implementovaný pomocou hlavnej triedy - ktorá slúži ako vstupný bod pre proces rámca - a implementácie Plánovač a Exekútor diskutované skôr.

5.1. Hlavná trieda rámca

Pred implementáciou plánovača a exekútora najskôr implementujeme vstupný bod pre náš rámec, ktorý:

  • Registruje sa u hlavného servera
  • Poskytuje agentom informácie o behu programu
  • Spustí plánovač

Najprv pridáme závislosť Maven pre Mesos:

 org.apache.mesos mesos 0.28.3 

Ďalej implementujeme HelloWorldMain pre náš rámec. Jednou z prvých vecí, ktoré urobíme, je spustenie procesu vykonávateľa na agentovi Mesos:

public static void main (String [] args) {String path = System.getProperty ("user.dir") + "/target/libraries2-1.0.0-SNAPSHOT.jar"; CommandInfo.URI uri = CommandInfo.URI.newBuilder (). SetValue (cesta) .setExtract (false) .build (); Reťazec helloWorldCommand = "Java -cp libraries2-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)") .setSource (")." build (); }

Tu sme najskôr nakonfigurovali binárne umiestnenie vykonávateľa. Agent Mesos by tento binárny súbor stiahol po registrácii rámca. Ďalej by agent spustil daný príkaz na spustenie procesu vykonávateľa.

Ďalej inicializujeme náš rámec a spustíme plánovač:

FrameworkInfo.Builder frameworkBuilder = FrameworkInfo.newBuilder () .setFailoverTimeout (120000) .setUser ("") .setName ("Hello World Framework (Java)"); frameworkBuilder.setPrincipal ("test-framework-java"); Ovládač MesosSchedulerDriver = nový MesosSchedulerDriver (nový HelloWorldScheduler (), frameworkBuilder.build (), args [0]);

Nakoniec začneme Ovládač MesosSchedulerDriver ktorý sa zaregistruje u Master. Pre úspešnú registráciu musíme odovzdať IP Master ako argument programu args [0] do tejto hlavnej triedy:

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

V triede uvedenej vyššie CommandInfo, ExecutorInfo, a FrameworkInfo sú všetko reprezentácie Java protobufových správ medzi hlavným serverom a rámcami.

5.2. Implementuje sa plánovač

Od verzie Mesos 1.0 môžeme vyvolať koncový bod HTTP z ľubovoľnej aplikácie Java na odosielanie a prijímanie správ pánovi Mesos. Niektoré z týchto správ zahŕňajú napríklad registráciu rámca, ponuky zdrojov a odmietnutia ponúk.

Pre Mesos 0,28 alebo skôr, musíme implementovať Plánovač rozhranie:

Väčšinou sa zameriame iba na resourceOffers metóda Plánovač. Pozrime sa, ako plánovač prijíma zdroje a na základe nich inicializuje úlohy.

Najprv uvidíme, ako plánovač alokuje zdroje pre úlohu:

@Override public void resourceOffers (SchedulerDriver schedulerDriver, zoznam zoznamov) {pre (ponuka ponuky: zoznam) {zoznam úloh = nový ArrayList (); Protos.TaskID taskId = Protos.TaskID.newBuilder () .setValue (Integer.toString (launchTasks ++)). Build (); System.out.println ("Spúšťam 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)) ;

Tu sme pre našu úlohu pridelili 1 CPU a 128M pamäte. Ďalej použijeme SchedulerDriver na spustenie úlohy na agentovi:

 TaskInfo printHelloWorld = TaskInfo.newBuilder () .setName ("printHelloWorld" + taskId.getValue ()) .setTaskId (taskId) .setSlaveId (offer.getSlaveId ()) .addResources (cpus) .addResources (mem) .setExecutor newBuilder (helloWorldExecutor)) .build (); Zoznam offerIDS = nový ArrayList (); offerIDS.add (offer.getId ()); tasks.add (printHelloWorld); schedulerDriver.launchTasks (offerIDS, úlohy); }}

Prípadne Plánovač často zistí potrebu odmietnuť ponuky zdrojov. Napríklad ak Plánovač nemôže na agenta spustiť úlohu z dôvodu nedostatku zdrojov, musí túto ponuku okamžite odmietnuť:

schedulerDriver.declineOffer (offer.getId ());

5.3. Implementácia Exekútor

Ako sme už hovorili skôr, komponent implementátora rámca je zodpovedný za vykonávanie aplikačných úloh na agentovi Mesos.

Na implementáciu sme použili koncové body HTTP Plánovač v aplikácii Mesos 1.0. Rovnako môžeme pre koncového používateľa použiť koncový bod HTTP.

V predchádzajúcej časti sme diskutovali o tom, ako framework konfiguruje agenta na spustenie procesu vykonávateľa:

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

Je pozoruhodné, tento príkaz zvažuje HelloWorldExecutor ako hlavná trieda. Toto zrealizujeme hlavný metóda do inicializovať Ovládač MesosExecutorDriver ktorý sa spája s agentmi Mesos, aby prijímal úlohy a zdieľal ďalšie informácie, napríklad stav úlohy:

verejná trieda HelloWorldExecutor implementuje Executor {public static void main (String [] args) {MesosExecutorDriver driver = new MesosExecutorDriver (new HelloWorldExecutor ()); System.exit (driver.run () == Protos.Status.DRIVER_STOPPED? 0: 1); }}

Posledná vec, ktorú musíte urobiť, je prijať úlohy z rámca a spustiť ich na agentovi. Informácie na spustenie ľubovoľnej úlohy sú obsiahnuté v HelloWorldExecutor:

public void launchTask (ovládač ExecutorDriver, úloha TaskInfo) {Protos.TaskStatus status = Protos.TaskStatus.newBuilder () .setTaskId (task.getTaskId ()) .setState (Protos.TaskState.TASK_RUNNING) .build (); driver.sendStatusUpdate (stav); System.out.println ("Vykonať úlohu !!!"); status = Protos.TaskStatus.newBuilder () .setTaskId (task.getTaskId ()) .setState (Protos.TaskState.TASK_FINISHED) .build (); driver.sendStatusUpdate (stav); }

Samozrejme, toto je iba jednoduchá implementácia, ale vysvetľuje, ako vykonávateľ zdieľa stav úlohy s nadriadeným v každej fáze a potom vykoná úlohu pred odoslaním stavu dokončenia.

V niektorých prípadoch môžu exekútori tiež poslať údaje späť plánovaču:

Reťazec myStatus = "Hello Framework"; driver.sendFrameworkMessage (myStatus.getBytes ());

6. Záver

V tomto článku sme v krátkosti diskutovali o zdieľaní prostriedkov medzi aplikáciami bežiacimi v rovnakom klastri. Diskutovali sme tiež o tom, ako Apache Mesos pomáha aplikáciám dosiahnuť maximálne využitie pomocou abstraktného pohľadu na zdroje klastra, ako sú CPU a pamäť.

Neskôr sme diskutovali o dynamické prideľovanie zdrojov medzi aplikácie založené na rôzne politiky a úlohy v oblasti spravodlivosti. Mesos umožňuje aplikácie plánovanie rozhodnutí na základe ponúk zdrojov od agentov Mesos v klastri.

Nakoniec sme videli implementáciu rámca Mesos v Jave.

Ako obvykle sú všetky príklady dostupné na GitHub.


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