"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Jag föreslÄr att du lÀser utskriften av förelÀsningen "Hadoop. ZooKeeper" frÄn serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Vad Àr ZooKeeper, dess plats i Hadoops ekosystem. Osanningar om distribuerad datoranvÀndning. Diagram över ett standarddistribuerat system. SvÄrigheter att samordna distribuerade system. Typiska koordinationsproblem. Principerna bakom designen av ZooKeeper. ZooKeeper datamodell. znode flaggor. Sessioner. Klient-API. Primitiver (konfiguration, gruppmedlemskap, enkla lÄsningar, ledareval, lÄsning utan flockeffekt). ZooKeeper-arkitektur. ZooKeeper DB. ZAB. BegÀr hanterare.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Idag ska vi prata om ZooKeeper. Den hÀr saken Àr vÀldigt anvÀndbar. Den, som alla Apache Hadoop-produkter, har en logotyp. Den förestÀller en man.

Innan detta pratade vi frÀmst om hur data kan behandlas dÀr, hur man lagrar det, det vill sÀga hur man anvÀnder det pÄ nÄgot sÀtt och arbetar med det pÄ nÄgot sÀtt. Och idag skulle jag vilja prata lite om att bygga distribuerade applikationer. Och ZooKeeper Àr en av de saker som gör att du kan förenkla den hÀr saken. Detta Àr en sorts tjÀnst som Àr avsedd för nÄgon form av koordinering av samspelet mellan processer i distribuerade system, i distribuerade applikationer.

Behovet av sĂ„dana applikationer blir mer och mer för varje dag som gĂ„r, det Ă€r vad vĂ„r kurs handlar om. Å ena sidan tillĂ„ter MapReduce och detta fĂ€rdiga ramverk dig att utjĂ€mna denna komplexitet och befria programmeraren frĂ„n att skriva primitiver som interaktion och koordinering av processer. Men Ă„ andra sidan Ă€r det ingen som garanterar att detta inte kommer att behöva göras Ă€ndĂ„. MapReduce eller andra fĂ€rdiga ramverk ersĂ€tter inte alltid helt vissa fall som inte kan implementeras med detta. Inklusive MapReduce sig sjĂ€lv och en massa andra Apache-projekt, de Ă€r faktiskt ocksĂ„ distribuerade applikationer. Och för att göra skrivandet lĂ€ttare skrev de ZooKeeper.

Liksom alla Hadoop-relaterade applikationer utvecklades den av Yahoo! Det Àr nu ocksÄ en officiell Apache-applikation. Den Àr inte lika aktivt utvecklad som HBase. Om du gÄr till JIRA HBase sÄ kommer det varje dag ett gÀng buggrapporter, ett gÀng förslag för att optimera nÄgot, d.v.s. livet i projektet pÄgÄr stÀndigt. Och ZooKeeper, Ä ena sidan, Àr en relativt enkel produkt, och Ä andra sidan sÀkerstÀller detta dess tillförlitlighet. Och det Àr ganska lÀtt att anvÀnda, varför det har blivit en standard i applikationer inom Hadoop-ekosystemet. SÄ jag tÀnkte att det skulle vara anvÀndbart att granska det för att förstÄ hur det fungerar och hur man anvÀnder det.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Det hÀr Àr en bild frÄn nÄgon förelÀsning vi hade. Vi kan sÀga att det Àr ortogonalt mot allt som vi har övervÀgt hittills. Och allt som anges hÀr, i en eller annan grad, fungerar med ZooKeeper, det vill sÀga det Àr en tjÀnst som anvÀnder alla dessa produkter. Varken HDFS eller MapReduce skriver sina egna liknande tjÀnster som specifikt skulle fungera för dem. DÀrför anvÀnds ZooKeeper. Och detta förenklar utvecklingen och vissa saker relaterade till fel.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Var kommer allt detta ifrÄn? Det verkar som att vi lanserade tvÄ applikationer parallellt pÄ olika datorer, kopplade ihop dem med en strÀng eller i ett nÀt, och allt fungerar. Men problemet Àr att nÀtverket Àr opÄlitligt, och om du sniffade trafiken eller tittade pÄ vad som hÀnder dÀr pÄ en lÄg nivÄ, hur klienter interagerar pÄ nÀtverket, kan du ofta se att vissa paket gÄr förlorade eller skickas pÄ nytt. Det Àr inte för inte som TCP-protokoll uppfanns, som lÄter dig upprÀtta en viss session och garantera leverans av meddelanden. Men i alla fall kan inte ens TCP alltid rÀdda dig. Allt har en timeout. NÀtverket kan helt enkelt falla av ett tag. Det kanske bara blinkar. Och allt detta leder till att du inte kan lita pÄ att nÀtverket Àr tillförlitligt. Detta Àr den största skillnaden frÄn att skriva parallella applikationer som körs pÄ en dator eller pÄ en superdator, dÀr det inte finns nÄgot nÀtverk, dÀr det finns en mer tillförlitlig datautbytesbuss i minnet. Och detta Àr en grundlÀggande skillnad.

Bland annat vid anvÀndning av NÀtverket finns det alltid en viss latens. Disken har det ocksÄ, men nÀtverket har mer av det. Latens Àr en viss fördröjningstid, som kan vara antingen liten eller ganska betydande.

NÀtverkstopologin förÀndras. Vad Àr topologi - det hÀr Àr placeringen av vÄr nÀtverksutrustning. Det finns datacenter, det finns stÀll som stÄr dÀr, det finns ljus. Allt detta kan Äteranslutas, flyttas, etc. Allt detta mÄste ocksÄ tas med i berÀkningen. IP-namn Àndras, routingen genom vilken vÄr trafik fÀrdas förÀndras. Detta mÄste ocksÄ beaktas.

NÀtverket kan ocksÄ förÀndras vad gÀller utrustning. FrÄn praktiken kan jag sÀga att vÄra nÀtverksingenjörer verkligen gillar att periodvis uppdatera nÄgot pÄ ljusen. Plötsligt kom en ny firmware ut och de var inte sÀrskilt intresserade av nÄgot Hadoop-kluster. De har ett eget jobb. För dem Àr huvudsaken att nÀtverket fungerar. Följaktligen vill de ladda upp nÄgot dÀr igen, göra en blinkning pÄ sin hÄrdvara, och hÄrdvaran Àndras ocksÄ med jÀmna mellanrum. Allt detta mÄste pÄ nÄgot sÀtt tas i beaktande. Allt detta pÄverkar vÄr distribuerade applikation.

Vanligtvis tror mÀnniskor som av nÄgon anledning börjar arbeta med stora datamÀngder att internet Àr grÀnslöst. Om det finns en fil pÄ flera terabyte dÀr kan du ta den till din server eller dator och öppna den med hjÀlp av hur och titta. Ett annat fel Àr inne vim titta pÄ loggarna. Gör aldrig det hÀr för det Àr dÄligt. Eftersom Vim försöker buffra allt, ladda allt i minnet, speciellt nÀr vi börjar gÄ igenom den hÀr loggen och leta efter nÄgot. Det hÀr Àr saker som glöms bort, men vÀrda att tÀnka pÄ.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Det Àr lÀttare att skriva ett program som körs pÄ en dator med en processor.

NÀr vÄrt system vÀxer vill vi parallellisera det hela och parallellisera det inte bara pÄ en dator utan ocksÄ pÄ ett kluster. FrÄgan uppstÄr: hur ska man samordna denna frÄga? VÄra applikationer kanske inte ens interagerar med varandra, men vi körde flera processer parallellt pÄ flera servrar. Och hur övervakar man att allt gÄr bra för dem? Till exempel skickar de nÄgot över internet. De mÄste skriva om sitt tillstÄnd nÄgonstans, till exempel i nÄgon slags databas eller logg, sedan aggregera denna logg och sedan analysera den nÄgonstans. Dessutom mÄste vi ta hÀnsyn till att processen fungerade och fungerade, plötsligt dök nÄgot fel upp i den eller kraschade, hur snabbt kommer vi att fÄ reda pÄ det?

Det Àr klart att allt detta snabbt kan övervakas. Detta Àr ocksÄ bra, men övervakning Àr en begrÀnsad sak som gör att du kan övervaka vissa saker pÄ högsta nivÄ.

NĂ€r vi vill att vĂ„ra processer ska börja interagera med varandra, till exempel för att skicka lite data till varandra, dĂ„ uppstĂ„r ocksĂ„ frĂ„gan – hur kommer detta att hĂ€nda? Kommer det att finnas nĂ„gon form av tĂ€vlingstillstĂ„nd, kommer de att skriva över varandra, kommer uppgifterna fram korrekt, kommer nĂ„got att gĂ„ förlorat pĂ„ vĂ€gen? Vi mĂ„ste ta fram nĂ„got slags protokoll osv.

Samordning av alla dessa processer Àr inte en trivial sak. Och det tvingar utvecklaren att gÄ ner till en Ànnu lÀgre nivÄ, och skriva system antingen frÄn grunden, eller inte riktigt frÄn början, men detta Àr inte sÄ enkelt.

Om du kommer pÄ en kryptografisk algoritm eller till och med implementerar den, slÀng den omedelbart, för troligen kommer den inte att fungera för dig. Den kommer med största sannolikhet att innehÄlla ett gÀng fel som du glömt att sörja för. AnvÀnd den aldrig till nÄgot allvarligt eftersom den med största sannolikhet kommer att vara instabil. Eftersom alla algoritmer som finns har testats av tiden under vÀldigt lÄng tid. Det Àr avlyssnat av samhÀllet. Detta Àr ett separat Àmne. Och det Àr samma sak hÀr. Om det Àr möjligt att inte implementera nÄgon form av processsynkronisering sjÀlv, Àr det bÀttre att inte göra detta, eftersom det Àr ganska komplicerat och leder dig ner pÄ den skakiga vÀgen att stÀndigt söka efter fel.

Idag pratar vi om ZooKeeper. Å ena sidan Ă€r det ett ramverk, Ă„ andra sidan Ă€r det en tjĂ€nst som gör livet enklare för utvecklaren och förenklar implementeringen av logik och samordning av vĂ„ra processer sĂ„ mycket som möjligt.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

LÄt oss komma ihÄg hur ett distribuerat standardsystem kan se ut. Det hÀr Àr vad vi pratade om - HDFS, HBase. Det finns en MÀstarprocess som hanterar arbetare och slavprocesser. Han ansvarar för att koordinera och fördela uppgifter, starta om arbetare, lansera nya och fördela belastningen.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

En mer avancerad sak Àr koordinationstjÀnsten, det vill sÀga flytta sjÀlva koordinationsuppgiften till en separat process, plus köra nÄgon form av backup eller stanby Master parallellt, eftersom Mastern kan misslyckas. Och om MÀstaren faller, kommer vÄrt system inte att fungera. Vi kör backup. Vissa anger att mastern mÄste replikeras till backup. Detta kan Àven anförtros SamordningstjÀnsten. Men i det hÀr diagrammet Àr MÀstaren sjÀlv ansvarig för att samordna arbetarna; hÀr koordinerar tjÀnsten datareplikeringsaktiviteter.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Ett mer avancerat alternativ Àr nÀr all samordning sköts av vÄr tjÀnst, som man brukar göra. Han tar ansvar för att allt fungerar. Och om nÄgot inte fungerar tar vi reda pÄ det och försöker komma runt den hÀr situationen. Vi har i alla fall kvar en MÀstare som pÄ nÄgot sÀtt interagerar med slavar och kan skicka data, information, meddelanden etc. via nÄgon tjÀnst.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Det finns ett Ànnu mer avancerat schema, nÀr vi inte har en MÀstare Àr alla noder mÀstarslavar, olika i sitt beteende. Men de behöver fortfarande interagera med varandra, sÄ det finns fortfarande en del service kvar för att samordna dessa ÄtgÀrder. Förmodligen passar Cassandra, som arbetar pÄ denna princip, detta schema.

Det Àr svÄrt att sÀga vilket av dessa system som fungerar bÀst. Var och en har sina egna för- och nackdelar.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Och det finns ingen anledning att vara rÀdd för vissa saker med MÀstaren, eftersom han, som praxis visar, inte Àr sÄ mottaglig för att stÀndigt tjÀna. Huvudsaken hÀr Àr att vÀlja rÀtt lösning för att vara vÀrd för den hÀr tjÀnsten pÄ en separat kraftfull nod, sÄ att den har tillrÀckligt med resurser, sÄ att om möjligt anvÀndare inte har tillgÄng dÀr, sÄ att de inte av misstag dödar den hÀr processen. Men samtidigt Àr det i ett sÄdant system mycket lÀttare att hantera arbetare frÄn Masterprocessen, det vill sÀga detta system Àr enklare ur implementeringssynpunkt.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Och detta schema (ovan) Àr förmodligen mer komplext, men mer tillförlitligt.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Det största problemet Àr partiella misslyckanden. Till exempel, nÀr vi skickar ett meddelande över nÀtverket intrÀffar nÄgon form av olycka, och den som skickade meddelandet kommer inte att veta om hans meddelande togs emot och vad som hÀnde pÄ mottagarens sida, kommer inte att veta om meddelandet behandlades korrekt , dvs han kommer inte att fÄ nÄgon bekrÀftelse.

DÀrför mÄste vi bearbeta denna situation. Och det enklaste Àr att skicka om detta meddelande och vÀnta tills vi fÄr ett svar. I det hÀr fallet tas det inte hÀnsyn till om mottagarens tillstÄnd har Àndrats. Vi kan skicka ett meddelande och lÀgga till samma data tvÄ gÄnger.

ZooKeeper erbjuder sÀtt att hantera sÄdana avslag, vilket ocksÄ gör vÄra liv enklare.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Som nÀmnts lite tidigare liknar detta att skriva flertrÄdade program, men den största skillnaden Àr att i distribuerade applikationer som vi bygger pÄ olika maskiner Àr det enda sÀttet att kommunicera pÄ NÀtverket. I huvudsak Àr detta en delad-ingenting-arkitektur. Varje process eller tjÀnst som körs pÄ en maskin har sitt eget minne, sin egen disk, sin egen processor, som den inte delar med nÄgon.

Om vi ​​skriver ett flertrĂ„digt program pĂ„ en dator kan vi anvĂ€nda delat minne för att utbyta data. Vi har en kontextvĂ€xling dĂ€r, processer kan vĂ€xla. Detta pĂ„verkar prestandan. Å ena sidan finns det inget sĂ„dant i programmet pĂ„ ett kluster, men det finns problem med NĂ€tverket.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Följaktligen Àr de huvudsakliga problemen som uppstÄr nÀr man skriver distribuerade system konfiguration. Vi skriver nÄgon form av ansökan. Om det Àr enkelt, sÄ hÄrdkodar vi alla möjliga siffror i koden, men detta Àr obekvÀmt, för om vi bestÀmmer oss för att istÀllet för en timeout pÄ en halv sekund vill vi ha en timeout pÄ en sekund, dÄ mÄste vi kompilera om applikationen och rulla ut allt igen. Det Àr en sak nÀr den Àr pÄ en maskin, nÀr du bara kan starta om den, men nÀr vi har mÄnga maskiner mÄste vi hela tiden kopiera allt. Vi mÄste försöka göra applikationen konfigurerbar.

HÀr talar vi om statisk konfiguration för systemprocesser. Detta Àr inte helt, kanske ur operativsystemets synvinkel, det kan vara en statisk konfiguration för vÄra processer, det vill sÀga detta Àr en konfiguration som inte bara kan tas och uppdateras.

Det finns ocksÄ en dynamisk konfiguration. Det Àr dessa parametrar som vi vill Àndra i farten sÄ att de plockas upp dÀr.

Vad Àr problemet hÀr? Vi uppdaterade konfigurationen, rullade ut den, sÄ vad? Problemet kan vara att vi Ä ena sidan rullade ut config, men glömde bort det nya, config fanns kvar. För det andra, medan vi rullade ut, uppdaterades konfigurationen pÄ vissa stÀllen, men inte pÄ andra. Och vissa processer i vÄr applikation som körs pÄ en dator startades om med en ny konfiguration och nÄgonstans med en gammal. Detta kan resultera i att vÄr distribuerade applikation Àr inkonsekvent ur ett konfigurationsperspektiv. Detta problem Àr vanligt. För en dynamisk konfiguration Àr den mer relevant eftersom den innebÀr att den kan Àndras direkt.

Ett annat problem Àr gruppmedlemskap. Vi har alltid nÄgon uppsÀttning arbetare, vi vill alltid veta vem av dem som Àr vid liv, vem av dem som Àr död. Om det finns en mÀstare mÄste han förstÄ vilka arbetare som kan omdirigeras till klienter sÄ att de kör berÀkningar eller arbetar med data, och vilka som inte kan. Ett problem som stÀndigt dyker upp Àr att vi behöver veta vilka som arbetar i vÄrt kluster.

Ett annat typiskt problem Àr ledarval, dÄ vi vill veta vem som Àr ansvarig. Ett exempel Àr replikering, nÀr vi har nÄgon process som tar emot skrivoperationer och sedan replikerar dem bland andra processer. Han kommer att vara ledaren, alla andra kommer att lyda honom, följa honom. Det Àr nödvÀndigt att vÀlja en process sÄ att den Àr entydig för alla, sÄ att det inte visar sig att tvÄ ledare vÀljs ut.

Det finns ocksÄ ömsesidigt uteslutande tillgÄng. Problemet hÀr Àr mer komplext. Det finns en sÄdan sak som en mutex, nÀr du skriver flertrÄdade program och vill att tillgÄng till nÄgon resurs, till exempel en minnescell, ska begrÀnsas och utföras av endast en trÄd. HÀr kan resursen vara nÄgot mer abstrakt. Och olika applikationer frÄn olika noder i vÄrt nÀtverk ska bara fÄ exklusiv tillgÄng till en given resurs, och inte sÄ att alla kan Àndra den eller skriva nÄgot dÀr. Dessa Àr de sÄ kallade lÄsen.

ZooKeeper lÄter dig lösa alla dessa problem i en eller annan grad. Och jag kommer att visa med exempel hur det lÄter dig göra detta.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Det finns inga blockerande primitiver. NÀr vi börjar anvÀnda nÄgot, kommer denna primitiva inte att vÀnta pÄ att nÄgon hÀndelse intrÀffar. Troligtvis kommer den hÀr saken att fungera asynkront, vilket gör att processer inte hÀnger sig medan de vÀntar pÄ nÄgot. Detta Àr en mycket anvÀndbar sak.

Alla kundförfrÄgningar behandlas i den allmÀnna köns ordning.

Och klienter har möjlighet att fÄ meddelande om förÀndringar i nÄgot tillstÄnd, om Àndringar i data, innan klienten sjÀlv ser den Àndrade informationen.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

ZooKeeper kan arbeta i tvĂ„ lĂ€gen. Den första Ă€r fristĂ„ende, pĂ„ en nod. Detta Ă€r bekvĂ€mt för att testa. Den kan ocksĂ„ fungera i klusterlĂ€ge pĂ„ valfritt antal servrar. Om vi ​​har ett kluster pĂ„ 100 maskiner sĂ„ Ă€r det inte nödvĂ€ndigt att det fungerar pĂ„ 100 maskiner. Det rĂ€cker med att vĂ€lja flera maskiner dĂ€r du kan köra ZooKeeper. Och den bekĂ€nner sig till principen om hög tillgĂ€nglighet. PĂ„ varje körande instans lagrar ZooKeeper en hel kopia av data. Senare ska jag berĂ€tta hur han gör. Den delar inte data eller partitionerar den. Å ena sidan Ă€r det ett minus att vi inte kan lagra mycket, Ă„ andra sidan behöver man inte göra detta. Det Ă€r inte vad den Ă€r designad för, det Ă€r inte en databas.

Data kan cachelagras pÄ klientsidan. Detta Àr en standardprincip sÄ att vi inte avbryter tjÀnsten och inte laddar den med samma förfrÄgningar. En smart klient vet vanligtvis om detta och cachar det.

Till exempel har nĂ„got förĂ€ndrats hĂ€r. Det finns nĂ„gon form av applikation. En ny ledare valdes, som bland annat ansvarar för handlĂ€ggning av skrivoperationer. Och vi vill replikera data. En lösning Ă€r att lĂ€gga den i en slinga. Och vi ifrĂ„gasĂ€tter hela tiden vĂ„r service – har nĂ„got förĂ€ndrats? Det andra alternativet Ă€r mer optimalt. Detta Ă€r en bevakningsmekanism som lĂ„ter dig meddela kunder att nĂ„got har förĂ€ndrats. Detta Ă€r en billigare metod nĂ€r det gĂ€ller resurser och bekvĂ€mare för kunderna.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Klienten Àr den anvÀndare som anvÀnder ZooKeeper.

Server Àr sjÀlva ZooKeeper-processen.

Znode Àr nyckeln i ZooKeeper. Alla znoder lagras i minnet av ZooKeeper och Àr organiserade i form av ett hierarkiskt diagram, i form av ett trÀd.

Det finns tvÄ typer av operationer. Den första Àr uppdatering/skriv, nÀr nÄgon operation Àndrar tillstÄndet för vÄrt trÀd. TrÀdet Àr vanligt.

Och det Àr möjligt att klienten inte slutför en förfrÄgan och kopplas bort, utan kan upprÀtta en session genom vilken den interagerar med ZooKeeper.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

ZooKeepers datamodell liknar ett filsystem. Det finns en standardrot och sedan gick vi som om vi genom katalogerna som gÄr frÄn roten. Och sedan katalogen pÄ första nivÄn, andra nivÄn. Detta Àr alla znoder.

Varje znod kan lagra vissa data, vanligtvis inte sÀrskilt stora, till exempel 10 kilobyte. Och varje znod kan ha ett visst antal barn.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Znoder finns i flera typer. De kan skapas. Och nÀr vi skapar en znod anger vi vilken typ den ska tillhöra.

Det finns tvÄ typer. Den första Àr den tillfÀlliga flaggan. Znode lever inom en session. Kunden har till exempel etablerat en session. Och sÄ lÀnge den hÀr sessionen lever kommer den att existera. Detta Àr nödvÀndigt för att inte producera nÄgot onödigt. Detta Àr ocksÄ lÀmpligt för stunder dÄ det Àr viktigt för oss att lagra dataprimitiver inom en session.

Den andra typen Àr sekventiell flagga. Den ökar rÀknaren pÄ vÀgen till znoden. Till exempel hade vi en katalog med applikation 1_5. Och nÀr vi skapade den första noden fick den p_1, den andra - p_2. Och nÀr vi anropar den hÀr metoden varje gÄng passerar vi hela vÀgen, vilket endast indikerar en del av vÀgen, och detta nummer ökas automatiskt eftersom vi indikerar nodtypen - sekventiell.

Vanlig znode. Hon kommer alltid att leva och ha det namn som vi sÀger till henne.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

En annan anvĂ€ndbar sak Ă€r klockflaggan. Om vi ​​installerar det kan klienten prenumerera pĂ„ vissa hĂ€ndelser för en specifik nod. Jag ska visa dig senare med ett exempel hur detta gĂ„r till. ZooKeeper meddelar sjĂ€lv klienten att data pĂ„ noden har Ă€ndrats. Meddelanden garanterar dock inte att vissa nya uppgifter har kommit. De sĂ€ger helt enkelt att nĂ„got har förĂ€ndrats, sĂ„ du mĂ„ste fortfarande jĂ€mföra data senare med separata samtal.

Och som jag redan sa, ordningen pÄ data bestÀms av kilobyte. Det finns inget behov av att lagra stora textdata dÀr, eftersom det inte Àr en databas, det Àr en ÄtgÀrdskoordinationsserver.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Jag ska berĂ€tta lite om sessionerna. Om vi ​​har flera servrar kan vi pĂ„ ett transparent sĂ€tt flytta frĂ„n server till server med hjĂ€lp av sessionsidentifieraren. Det Ă€r ganska bekvĂ€mt.

Varje session har nÄgon form av timeout. En session definieras av om klienten skickar nÄgot till servern under den sessionen. Om han inte skickade nÄgot under timeouten avbryts sessionen, eller sÄ kan klienten stÀnga den sjÀlv.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Den har inte sÄ mÄnga funktioner, men du kan göra olika saker med detta API. Det anropet vi sÄg skapa skapar en znod och tar tre parametrar. Detta Àr sökvÀgen till znoden, och den mÄste anges i sin helhet frÄn roten. Och Àven detta Àr en del data som vi vill överföra dit. Och typen av flagga. Och efter skapandet returnerar den vÀgen till znoden.

För det andra kan du ta bort den. Tricket hÀr Àr att den andra parametern, förutom sökvÀgen till znoden, kan specificera versionen. Följaktligen kommer den znoden att raderas om dess version som vi överförde Àr likvÀrdig med den som faktiskt existerar.

Om vi ​​inte vill kontrollera den hĂ€r versionen, skickar vi helt enkelt argumentet "-1".

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

För det tredje kontrollerar den om det finns en znod. Returnerar sant om noden finns, annars falskt.

Och sedan visas flaggklocka, vilket gör att du kan övervaka denna nod.

Du kan stÀlla in denna flagga Àven pÄ en icke-existerande nod och fÄ ett meddelande nÀr den dyker upp. Detta kan ocksÄ vara anvÀndbart.

Ett par utmaningar till hÀmta data. Det Àr klart att vi kan ta emot data via znode. Du kan ocksÄ anvÀnda flaggklocka. I det hÀr fallet kommer det inte att installeras om det inte finns nÄgon nod. DÀrför mÄste du förstÄ att det finns och sedan ta emot data.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Det finns ocksÄ SetData. HÀr skickar vi version. Och om vi skickar detta vidare kommer data pÄ znoden för en viss version att uppdateras.

Du kan ocksÄ ange "-1" för att utesluta denna kontroll.

En annan anvÀndbar metod Àr skaffaBarn. Vi kan ocksÄ fÄ en lista över alla znoder som hör till den. Vi kan övervaka detta genom att stÀlla in flaggvakt.

Och metod synkronisera gör att alla Àndringar kan skickas pÄ en gÄng, vilket sÀkerstÀller att de sparas och att all data har Àndrats helt.

Om vi ​​drar analogier med vanlig programmering, dĂ„ nĂ€r du anvĂ€nder metoder som att skriva, som skriver nĂ„got till disk, och efter att det returnerar ett svar till dig, finns det ingen garanti för att du har skrivit data till disk. Och Ă€ven nĂ€r operativsystemet Ă€r övertygat om att allt har skrivits, finns det mekanismer i sjĂ€lva disken dĂ€r processen gĂ„r igenom lager av buffertar, och först efter det placeras data pĂ„ disken.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Oftast anvÀnds asynkrona samtal. Detta gör att klienten kan arbeta parallellt med olika önskemÄl. Du kan anvÀnda den synkrona metoden, men den Àr mindre produktiv.

De tvÄ operationerna vi pratade om Àr update/write, som Àndrar data. Dessa Àr create, setData, sync, delete. Och lÀs finns, getData, getChildren.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Nu nÄgra exempel pÄ hur du kan göra primitiver för att arbeta i ett distribuerat system. Till exempel relaterat till konfigurationen av nÄgot. En ny arbetare har dykt upp. Vi lade till maskinen och startade processen. Och det Àr följande tre frÄgor. Hur frÄgar den ZooKeeper för konfiguration? Och om vi vill Àndra konfigurationen, hur Àndrar vi den? Och efter att vi Àndrat det, hur fÄr de arbetare som vi hade det?

ZooKeeper gör detta relativt enkelt. Till exempel finns vÄrt znode-trÀd. Det finns en nod för vÄr applikation hÀr, vi skapar en extra nod i den, som innehÄller data frÄn konfigurationen. Dessa kan vara separata parametrar eller inte. Eftersom storleken Àr liten Àr konfigurationsstorleken vanligtvis liten ocksÄ, sÄ det Àr fullt möjligt att lagra den hÀr.

Du anvĂ€nder metoden hĂ€mta data för att hĂ€mta konfigurationen för arbetaren frĂ„n noden. StĂ€ll in pĂ„ sant. Om denna nod av nĂ„gon anledning inte existerar kommer vi att informeras om den nĂ€r den dyker upp eller nĂ€r den Ă€ndras. Om vi ​​vill veta att nĂ„got har förĂ€ndrats, stĂ€ller vi in ​​det pĂ„ sant. Och om data i denna nod Ă€ndras kommer vi att veta om det.

SetData. Vi stÀller in data, stÀller in "-1", det vill sÀga vi kontrollerar inte versionen, vi antar att vi alltid har en konfiguration, vi behöver inte lagra mÄnga konfigurationer. Om du behöver lagra mycket mÄste du lÀgga till ytterligare en nivÄ. HÀr tror vi att det bara finns en, sÄ vi uppdaterar bara den senaste, sÄ vi kontrollerar inte versionen. I detta ögonblick fÄr alla kunder som tidigare prenumererat ett meddelande om att nÄgot har Àndrats i denna nod. Och efter att de har fÄtt det mÄste de ocksÄ begÀra uppgifterna igen. Aviseringen Àr att de inte fÄr sjÀlva uppgifterna utan endast meddelande om Àndringar. Efter detta mÄste de be om nya uppgifter.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Det andra alternativet för att anvÀnda det primitiva Àr gruppmedlemskap. Vi har en distribuerad applikation, det finns ett gÀng arbetare och vi vill förstÄ att de alla Àr pÄ plats. DÀrför mÄste de sjÀlva registrera att de fungerar i vÄr ansökan. Och vi vill ocksÄ ta reda pÄ, antingen frÄn MÀstarprocessen eller nÄgon annanstans, om alla aktiva arbetare som vi har för nÀrvarande.

Hur gör vi detta? För applikationen skapar vi en arbetarnod och lÀgger till en undernivÄ dÀr med metoden skapa. Jag har ett fel pÄ bilden. HÀr behöver du sekventiell specificera, dÄ skapas alla arbetare en efter en. Och applikationen, som begÀr all data om barnen i denna nod, tar emot alla aktiva arbetare som finns.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Detta Àr en sÄ fruktansvÀrd implementering av hur detta kan göras i Java-kod. LÄt oss börja frÄn slutet, med huvudmetoden. Det hÀr Àr vÄr klass, lÄt oss skapa dess metod. Som det första argumentet anvÀnder vi host, dÀr vi ansluter, dvs vi sÀtter det som ett argument. Och det andra argumentet Àr namnet pÄ gruppen.

Hur uppstÄr kopplingen? Detta Àr ett enkelt exempel pÄ API som anvÀnds. Allt Àr relativt enkelt hÀr. Det finns en ZooKeeper i standardklass. Vi skickar vÀrdar till det. Och stÀll in timeout pÄ till exempel 5 sekunder. Och vi har en medlem som heter connectedSignal. I huvudsak skapar vi en grupp lÀngs den överförda vÀgen. Vi skriver inte data dÀr, Àven om nÄgot kunde ha skrivits. Och noden hÀr Àr av den ihÀrdiga typen. I huvudsak Àr detta en vanlig vanlig nod som kommer att existera hela tiden. Det Àr hÀr sessionen skapas. Detta Àr implementeringen av sjÀlva klienten. VÄr klient kommer att skicka periodiska meddelanden som indikerar att sessionen Àr vid liv. Och nÀr vi avslutar sessionen ringer vi nÀra och det Àr allt, sessionen faller av. Detta ifall nÄgot faller av för oss, sÄ att ZooKeeper fÄr reda pÄ det och stÀnger av sessionen.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Hur lĂ„ser man en resurs? HĂ€r Ă€r allt lite mer komplicerat. Vi har en uppsĂ€ttning arbetare, det finns nĂ„gon resurs som vi vill lĂ„sa. För att göra detta skapar vi en separat nod, till exempel, kallad lock1. Om vi ​​kunde skapa det, dĂ„ fick vi ett lĂ„s hĂ€r. Och om vi inte kunde skapa den, sĂ„ försöker arbetaren hĂ€mta data hĂ€rifrĂ„n, och eftersom noden redan har skapats, lĂ€gger vi en bevakare hĂ€r och i samma ögonblick som tillstĂ„ndet för denna nod Ă€ndras, kommer vi att veta om det. Och vi kan försöka fĂ„ tid att Ă„terskapa det. Om vi ​​tog den hĂ€r noden, tog det hĂ€r lĂ„set, kommer vi att överge det, efter att vi inte lĂ€ngre behöver lĂ„set, eftersom noden endast existerar inom sessionen. Följaktligen kommer den att försvinna. Och en annan klient, inom ramen för en annan session, kommer att kunna ta lĂ„set pĂ„ denna nod, eller snarare, han kommer att fĂ„ ett meddelande om att nĂ„got har förĂ€ndrats och han kan försöka göra det i tid.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Ytterligare ett exempel pÄ hur du kan vÀlja huvudledare. Detta Àr lite mer komplicerat, men ocksÄ relativt enkelt. Vad hÀnder hÀr? Det finns en huvudnod som samlar alla arbetare. Vi försöker fÄ information om ledaren. Om detta hÀnde framgÄngsrikt, det vill sÀga vi fick lite data, börjar vÄr arbetare följa denna ledare. Han tror att det redan finns en ledare.

Om ledaren dog av nÄgon anledning, till exempel ramlade av, sÄ försöker vi skapa en ny ledare. Och om vi lyckas, dÄ blir vÄr arbetare ledaren. Och om nÄgon i detta ögonblick lyckades skapa en ny ledare, dÄ försöker vi förstÄ vem det Àr och sedan följa honom.

HÀr uppstÄr den sÄ kallade flockeffekten, det vill sÀga flockeffekten, för nÀr en ledare dör blir den som Àr först i tiden ledare.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

NÀr du fÄngar en resurs kan du försöka anvÀnda ett lite annorlunda tillvÀgagÄngssÀtt, vilket Àr följande. Vi vill till exempel fÄ ett lÄs, men utan herteffekten. Det kommer att bestÄ i att vÄr applikation begÀr listor över alla nod-ID för en redan existerande nod med lÄs. Och om innan dess noden som vi skapade ett lÄs för Àr den minsta av uppsÀttningen som vi fick, betyder det att vi har fÄngat lÄset. Vi kontrollerar att vi har fÄtt ett lÄs. Som en kontroll kommer det att finnas ett villkor att det id som vi fick nÀr vi skapade ett nytt lÄs Àr minimalt. Och om vi fick det sÄ jobbar vi vidare.

Om det finns ett visst id som Àr mindre Àn vÄrt lÄs, sÄ sÀtter vi en watcher pÄ denna hÀndelse och vÀntar pÄ meddelande tills nÄgot Àndras. Det vill sÀga vi fick detta lÄs. Och tills det faller av kommer vi inte att bli minimi-id och kommer inte att fÄ minimilÄset, och dÀrmed kommer vi att kunna logga in. Och om detta villkor inte Àr uppfyllt, sÄ gÄr vi omedelbart hit och försöker fÄ det hÀr lÄset igen, eftersom nÄgot kan ha förÀndrats under den hÀr tiden.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

Vad bestÄr ZooKeeper av? Det finns 4 huvudsakliga saker. Detta Àr bearbetningsprocesser - BegÀran. Och Àven ZooKeeper Atomic Broadcast. Det finns en Commit Log dÀr alla operationer registreras. Och sjÀlva in-memory Replicated DB, dvs sjÀlva databasen dÀr hela detta trÀd lagras.

Det Àr vÀrt att notera att alla skrivoperationer gÄr genom Request Processor. Och lÀsoperationer gÄr direkt till In-memory-databasen.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

SjÀlva databasen Àr helt replikerad. Alla instanser av ZooKeeper lagrar en fullstÀndig kopia av data.

För att ÄterstÀlla databasen efter en krasch finns det en Commit-logg. Standardpraxis Àr att innan data hamnar i minnet skrivs den dÀr sÄ att om den kraschar kan den hÀr loggen spelas upp och systemtillstÄndet kan ÄterstÀllas. Och periodiska ögonblicksbilder av databasen anvÀnds ocksÄ.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

ZooKeeper Atomic Broadcast Àr en sak som anvÀnds för att underhÄlla replikerad data.

ZAB vÀljer internt en ledare frÄn ZooKeeper-nodens synvinkel. Andra noder blir hennes följare och förvÀntar sig nÄgra handlingar frÄn henne. Om de fÄr bidrag skickar de dem alla till ledaren. Han utför först en skrivoperation och skickar sedan ett meddelande om vad som har förÀndrats till hans följare. Detta mÄste i sjÀlva verket utföras atomÀrt, d.v.s. inspelningen och sÀndningen av det hela mÄste utföras atomiskt, vilket garanterar datakonsistens.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop" Den behandlar bara skrivförfrÄgningar. Dess huvudsakliga uppgift Àr att omvandla operationen till en transaktionsuppdatering. Detta Àr en speciellt genererad begÀran.

Och hÀr Àr det vÀrt att notera att idempotensen av uppdateringar för samma operation Àr garanterad. Vad det Àr? Denna sak, om den körs tvÄ gÄnger, kommer att ha samma tillstÄnd, dvs sjÀlva begÀran kommer inte att Àndras. Och detta mÄste göras sÄ att du i hÀndelse av en krasch kan starta om operationen och dÀrmed rulla tillbaka de Àndringar som har fallit av för tillfÀllet. I detta fall kommer systemets tillstÄnd att bli detsamma, d.v.s. det bör inte vara sÄ att en serie av samma, till exempel uppdateringsprocesser, ledde till olika sluttillstÄnd av systemet.

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

"Hadoop. ZooKeeper" frÄn Mail.Ru Group Technostream-serien "Metoder för distribuerad bearbetning av stora datamÀngder i Hadoop"

KĂ€lla: will.com

LĂ€gg en kommentar