"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. Lögner om distribuerad datoranvÀndning. Diagram över ett standarddistribuerat system. Komplexiteten i 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.

Spela upp video

"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 den, dvs hur man anvÀnder den pÄ nÄgot sÀtt och arbetar med den pÄ nÄgot sÀtt. Idag skulle jag vilja prata lite om att bygga distribuerade applikationer. Och ZooKeeper Àr en av de saker som gör detta enklare. Detta Àr en viss tjÀnst som Àr avsedd för viss samordning av interaktion mellan processer i distribuerade system, i distribuerade applikationer.

Behovet av sĂ„dana applikationer blir mer och mer för varje dag, det Ă€r vad vĂ„r kurs handlar om. Å ena sidan tillĂ„ter MapReduce och detta fĂ€rdiga ramverk oss att utjĂ€mna denna komplexitet och befria programmeraren frĂ„n att skriva primitiver som interaktion och processkoordination. 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 pĂ„ denna. Inklusive MapReduce sig sjĂ€lv och ett gĂ€ng andra Apache-projekt, de Ă€r i sjĂ€lva verket ocksĂ„ distribuerade applikationer. Och för att göra skrivandet lĂ€ttare skrev vi ZooKeeper.

Liksom alla Hadoop-relaterade applikationer utvecklades den pÄ 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Ä finns det varje dag ett gÀng uppgifter för buggar, en massa förslag pÄ att optimera nÄgot, d.v.s. livet pÄgÄr stÀndigt i projektet. 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, sÄ det har blivit en standard i applikationer inom Hadoop-ekosystemet. SÄ jag tÀnkte att det kunde vara anvÀndbart att ta en titt pÄ 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 listas hÀr fungerar i en eller annan grad 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 skulle fungera specifikt 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 du startade tvÄ applikationer parallellt pÄ olika datorer, kopplade dem med en kabel eller ett nÀtverk, och allt fungerar. Men problemet Àr att nÀtverket Àr opÄlitligt, och om du sniffade trafiken eller tittade pÄ vad som hÀnde pÄ en lÄg nivÄ, hur klienter interagerade pÄ nÀtverket, kunde du ofta se att vissa paket gick förlorade, och att du illa upp. 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 dagen. Allt har en timeout. NÀtverket kan helt enkelt gÄ ner ett tag. Det kanske bara blinkar. Och allt detta leder till det faktum att du inte kan lita pÄ att nÀtverket Àr pÄlitligt. Detta Àr den största skillnaden frÄn att skriva parallella applikationer som körs pÄ en enda dator eller pÄ en enda 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.

Dessutom, nÀr du anvÀnder Internet, finns det alltid en viss latens. Disken har det ocksÄ, men nÀtverket har mer. Latens Àr en viss fördröjningstid, som kan vara antingen liten eller ganska betydande.

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

NÀtverket kan ocksÄ förÀndras vad gÀller utrustning. Av min erfarenhet kan jag sÀga att vÄra nÀtverksingenjörer verkligen gillar att med jÀmna mellanrum uppdatera nÄgot pÄ ljusen. Plötsligt kommer en ny firmware ut och de bryr sig inte riktigt om nÄgot Hadoop-kluster. De har ett eget jobb. Huvudsaken för dem Àr att nÀtverket fungerar. Följaktligen vill de ladda upp nÄgot dÀr igen, ladda upp det pÄ sin hÄrdvara, medan hÄrdvaran ocksÄ Àndras med jÀmna mellanrum. Allt detta mÄste tas i beaktande pÄ nÄgot sÀtt. Allt detta pÄverkar vÄr distribuerade applikation.

Vanligtvis tror mÀnniskor som börjar arbeta med stora mÀngder data, av nÄgon anledning, att nÀtverket Àr obegrÀnsat. 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 misstag Àr inne vim visa loggar. Gör aldrig detta 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 Àr sÄdana saker som glöms bort, men vÀrda att övervÀga.

"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 allt detta och parallellisera det inte bara pÄ datorn utan ocksÄ pÄ klustret. FrÄgan uppstÄr: hur ska man samordna denna frÄga? VÄra applikationer kanske inte ens interagerar med varandra, men vi har flera processer som körs 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 nÄgonstans om sin status, till exempel i nÄgon databas eller i en logg, sedan aggregera denna logg och sedan analysera den nÄgonstans. Dessutom mÄste vi ta hÀnsyn till att processen fungerade och fungerade, och plötsligt dök det upp nÄgot fel i den eller kraschade, sÄ 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 skicka en del 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 data 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 frÄga. Och det tvingar utvecklaren att gÄ ner till en Ànnu lÀgre nivÄ och skriva system antingen frÄn grunden eller inte helt frÄn början, men det Àr inte sÄ enkelt.

Om du har kommit pÄ en kryptografisk algoritm eller till och med implementerat den, ta den och kasta 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 förutse. AnvÀnd det inte för nÄgot allvarligt under nÄgra omstÀndigheter, eftersom det med största sannolikhet kommer att vara instabilt. Eftersom alla algoritmer som finns testas av tid under vÀldigt lÄng tid. Det söks efter fel av gemenskapen. Detta Àr ett separat Àmne. Och samma sak hÀr. Om det finns en möjlighet att inte implementera nÄgon processsynkronisering sjÀlv, Àr det bÀttre att inte göra detta, eftersom det Àr ganska komplicerat och leder dig pÄ en skakig vÀg med konstant sökning 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 maximalt förenklar implementeringen av logik och samordning av vĂ„ra processer.

"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 – det hĂ€r Ă€r HDFS, HBase. Det finns en MĂ€starprocess som hanterar arbetare, slavprocesser. Han Ă€r engagerad i koordinering och distribution av uppgifter, startar om arbetare, lanserar nya, fördelar 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, d.v.s. flytta sjÀlva koordinationsuppgiften till en separat process, plus köra nÄgon backup eller standby av befÀlhavaren parallellt, eftersom befÀlhavaren kan krascha. Och om MÀstaren faller kommer vÄrt system inte att fungera. Vi startar backup. Vissa anger att mastern mÄste replikeras till sÀkerhetskopian. Detta kan Àven anförtros SamordningstjÀnsten. Men i detta schema Àr MÀstaren sjÀlv ansvarig för att samordna arbetarna; hÀr Àr tjÀnsten ansvarig för att koordinera datareplikeringsÄtgÀrder.

"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 vÄr tjÀnst sköter all samordning, 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 fortfarande MÀstaren, som pÄ nÄgot sÀtt interagerar med slavarna, och kan skicka data, information, meddelanden etc. genom en viss 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 nÄgon form av service för att samordna dessa ÄtgÀrder. Cassandra, som arbetar pÄ denna princip, passar förmodligen in i detta schema.

Det Àr svÄrt att sÀga vilket av dessa system som fungerar bÀttre. 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 praktiken visar, inte Àr sÄ mottaglig för att stÀndigt underkasta sig. Det viktigaste hÀr Àr att vÀlja rÀtt lösning för att placera den hÀr tjÀnsten pÄ en separat kraftfull nod, sÄ att den har tillrÀckligt med resurser sÄ att anvÀndare om möjligt inte har tillgÄng till den, 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. NÀr vi till exempel skickar ett meddelande över Internet intrÀffar nÄgon sorts olycka, och den som skickat meddelandet kommer inte att veta om hans meddelande har kommit fram och vad som hÀnt pÄ mottagarens sida, kommer inte att veta om meddelandet behandlats korrekt, d.v.s. 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. Samtidigt tas ingenstans hÀnsyn till om mottagarens tillstÄnd har Àndrats. Det Àr möjligt att vi skickar ett meddelande och lÀgger till samma data tvÄ gÄnger.

ZooKeeper erbjuder sÀtt att hantera sÄdana misslyckanden, vilket ocksÄ gör vÄrt 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 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 via nÀtverket. I huvudsak Àr det 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 enda 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Ă„ klustret, 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 ansökan. Om det Ă€r enkelt sĂ„ hĂ„rdkodar vi in ​​alla möjliga siffror i koden, men det hĂ€r Ă€r obekvĂ€mt, för om vi bestĂ€mmer oss för att istĂ€llet för en halv sekunds timeout 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.

Det hÀr handlar om statisk konfiguration för systemprocesser. Det Àr egentligen inte, kanske ur ett operativsystems perspektiv, det kan vara en statisk konfiguration för vÄra processer, det vill sÀga det Àr en konfiguration som du inte bara kan ta och uppdatera.

Det finns ocksÄ 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 och vad? Problemet kan vara att vi Ä ena sidan rullade ut config, men glömde uppdateringen, config lÄg kvar. För det andra, medan vi rullade ut det, uppdaterades vissa konfigurationer, men vissa inte. Och vissa processer i vÄr applikation som fungerar pÄ en dator startades om med en ny konfiguration och nÄgonstans med den gamla. Detta kan leda till att vÄr distribuerade applikation Àr inkonsekvent vad gÀller konfiguration. Detta Àr ett vanligt problem. För dynamisk konfiguration Àr det mer relevant eftersom det antas att det 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 Master mÄste den förstÄ vilka arbetare som klienter kan omdirigeras till sÄ att de kör berÀkningar eller arbetar med data, och vilka som inte kan. Problemet uppstÄr hela tiden 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, dÀr vi har nÄgon process som accepterar skrivoperationer och sedan replikerar dem till andra processer. Han kommer att vara ledaren, alla andra kommer att lyda honom och följa honom. Det Àr nödvÀndigt att vÀlja en process som À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 till en minnescell, ska begrÀnsas och endast utföras av en trÄd. HÀr kan resursen vara nÄgot mer abstrakt. Och olika applikationer frÄn olika noder i vÄrt nÀtverk bör endast fÄ exklusiv Ätkomst till denna resurs, och inte sÄ att alla kan Àndra den eller skriva nÄgot dÀr. Dessa Àr de sÄ kallade lÄsen.

ZooKeeper kan lösa alla dessa problem i en eller annan grad. Och jag kommer att visa dig 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 den 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 i ett tillstÄnd av att vÀnta 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Ä meddelanden om Àndringar i nÄgot tillstÄnd, om Àndringar i data, innan klienten ser den Àndrade informationen sjÀlv.

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

ZooKeeper kan fungera i tvĂ„ lĂ€gen. Det första Ă€r fristĂ„ende, pĂ„ en enda nod. Detta Ă€r praktiskt för testning. Det kan ocksĂ„ fungera i klusterlĂ€ge, pĂ„ valfritt antal noder. servrarOm vi ​​har ett kluster med 100 maskiner behöver det inte nödvĂ€ndigtvis köras pĂ„ 100 maskiner. Det rĂ€cker att allokera nĂ„gra maskiner dĂ€r ZooKeeper kan köras. Och det följer principen om hög tillgĂ€nglighet. ZooKeeper lagrar en komplett kopia av data pĂ„ varje körande instans. Jag kommer att förklara hur det gör detta senare. Det varken skĂ€r eller partitionerar data. Å ena sidan Ă€r detta en nackdel eftersom vi inte kan lagra mycket, men Ă„ andra sidan Ă€r det onödigt. Det Ă€r inte utformat för det; det Ă€r inte en databas.

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

Till exempel har nĂ„got förĂ€ndrats för oss. Det finns en del tillĂ€mpning. En ny ledare valdes som ansvarar för exempelvis handlĂ€ggning av skrivverksamheten. Och vi vill replikera data. En av lösningarna Ă€r att installera en slinga. Och vi frĂ„gar hela tiden vĂ„r tjĂ€nst – har nĂ„got förĂ€ndrats? Det andra alternativet Ă€r mer optimalt. Det Ă€r en klockmekanism som lĂ„ter dig meddela kunder nĂ€r nĂ„got har förĂ€ndrats. Detta Ă€r en mindre resurskrĂ€vande metod 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"

Klient – ​​Àr anvĂ€ndaren som anvĂ€nder ZooKeeper.

Server Àr sjÀlva ZooKeeper-processen.

Znode Àr nyckeln i ZooKeeper. Alla znoder lagras i ZooKeepers minne och Àr organiserade i ett hierarkiskt schema, 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 utför en begÀran och kopplar frÄn, 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 den första nivÄn katalogen, den andra nivÄn. Dessa À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 viss session. Till exempel har en klient etablerat en session. Och sÄ lÀnge den hÀr sessionen lever kommer den att existera. Detta Àr nödvÀndigt för att undvika att skapa nÄgot onödigt. Detta Àr ocksÄ lÀmpligt för situationer dÀr det Àr viktigt för oss att lagra dataprimitiver inom en session.

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

Vanlig znode. Hon kommer att leva för evigt och ha det namn 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 nĂ„gra nya uppgifter har kommit in. De indikerar 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 server för att koordinera ÄtgÀrder.

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

LĂ„t mig berĂ€tta lite om sessioner. Om vi ​​har flera servrar kan vi transparent vĂ€xla mellan servers. server, med hjĂ€lp av sessions-ID:t. Detta Ă€r ganska bekvĂ€mt.

Varje session har en timeout. En session definieras av om klienten sÀnder nÄgot till servern under den sessionen. Om den inte har sÀnt 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 mÄnga saker med detta API. 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.

Den andra kan tas bort. Tricket hÀr Àr att den andra parametern, förutom sökvÀgen till znoden, kan anvÀndas för att specificera versionen. Följaktligen kommer znoden att raderas om versionen vi skickade Àr likvÀrdig med den som faktiskt existerar.

Om vi ​​inte vill kontrollera denna version 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 förekomsten av znoden. Returnerar sant om noden finns, annars falskt.

Och hÀr kommer flaggklocka, som lÄter dig stÀlla in övervakning av 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 Àr: hÀmta data. Det Àr klart att vi kan fÄ data via znode. Du kan ocksÄ anvÀnda flaggklocka. I det hÀr fallet kommer den inte att installeras om det inte finns nÄgon nod. DÀrför mÄste du förstÄ att det finns och sedan fÄ 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 passerar detta 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 observera detta genom att stÀlla in flaggvakt.

Och metoden synkronisera lÄter dig skicka alla Àndringar pÄ en gÄng, vilket sÀkerstÀller att de sparas och all data Àndras 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 har returnerat ett svar till dig, finns det ingen garanti för att din data har skrivits till disk. Och Ă€ven nĂ€r operativsystemet Ă€r sĂ€kert pĂ„ att allt har skrivits har sjĂ€lva disken mekanismer dĂ€r processen gĂ„r igenom nivĂ„er 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"

Asynkrona samtal anvÀnds oftast. Detta gör att klienten kan arbeta parallellt med olika önskemÄl. Ett synkront tillvÀgagÄngssÀtt kan anvÀndas, men det Àr mindre effektivt.

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 av arbete i ett distribuerat system. Till exempel relaterat till konfigurationen av nÄgot. En ny arbetare har dykt upp. Vi lade till bilen och startade processen. Och det Àr följande tre frÄgor. Hur begÀr den konfiguration frÄn ZooKeeper? Och om vi vill Àndra konfigurationen, hur Àndrar vi den? Och efter att vi Àndrat det, hur fÄr de arbetare vi hade det?

I ZooKeeper kan detta göras 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 saknas 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 den pÄ "-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 anser vi att det bara finns en, dÀrför uppdaterar vi endast den senaste, dÀrför kontrollerar vi inte versionen. Vid det hÀr laget fÄr alla kunder som har prenumererat tidigare 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. Meddelandet Àr att de inte fÄr sjÀlva uppgifterna, utan endast ett meddelande om Àndringar. Efter det bör 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 arbetar i vÄr ansökan. Och vi vill ocksÄ ta reda pÄ antingen Masterprocessen 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Ä till den med metoden skapa. Jag har ett fel pÄ bilden. Det Àr hÀr det behövs sekventiell specificera, dÄ skapas alla arbetare en efter en. Och applikationen, genom att begÀra all information 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"

HÀr Àr en skrÀmmande 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 vÀrden dÀr vi ansluter, det vill sÀga vi sÀtter det som ett argument. Och det andra argumentet Àr gruppnamnet.

Hur uppstÄr kopplingen? Detta Àr ett enkelt exempel pÄ API som anvÀnds. Allt Àr relativt enkelt hÀr. Det finns en standard ZooKeeper-klass. Vi passerar honom vÀrdarna. Och vi sÀtter en timeout, 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 vi kunde ha skrivit nÄgot. Och noden hÀr har den bestÀndiga typen. I huvudsak Àr detta en vanlig nod som kommer att finnas hela tiden. Det Àr hÀr sessionen skapas. Detta Àr kundens egen implementering. VÄr klient kommer med jÀmna mellanrum att skicka meddelanden som indikerar att sessionen Àr vid liv. Och nÀr vi avslutar sessionen ringer vi nÀra och det Àr allt, sessionen avbryts. Detta Àr i fall nÄgot gÄr fel, sÄ att ZooKeeper vet om det och avbryter 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 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 det, 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 det ögonblick nĂ€r 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 vĂ€gra 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 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 Ă€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 ÀndÄ 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 medarbetare följa den hÀr ledaren. Han tror att en ledare redan finns.

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

Det Àr hÀr den sÄ kallade flockeffekten uppstÄr, för nÀr en ledare dör blir den som kommer först dit ledaren.

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

NÀr du skaffar en resurs kan du prova att anvÀnda ett lite annorlunda tillvÀgagÄngssÀtt, vilket Àr följande. Vi vill till exempel fÄ ett lÄs, men utan herteffekten. Den kommer att bestÄ av att vÄr applikation begÀr listor över alla nod-ID för en befintlig nod med lÄs. Och om noden innan detta, lÄset som vi skapade, Àr minimum av uppsÀttningen som vi fick, betyder det att vi fÄngade lÄset. Vi kontrollerar att vi fÄtt 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Ä fortsÀtter vi att jobba.

Om det finns nĂ„got id som Ă€r mindre Ă€n vĂ„rt lĂ„s, stĂ€ller vi in ​​en watcher pĂ„ denna hĂ€ndelse och vĂ€ntar pĂ„ meddelande tills nĂ„got Ă€ndras. Det vill sĂ€ga, vi har det hĂ€r lĂ„set. Och tills den faller av kommer vi inte att bli minimi-ID och kommer inte att fĂ„ minimilĂ„set, och dĂ€rmed kommer vi att kunna lĂ„sa oss sjĂ€lva. Och om detta villkor inte Ă€r uppfyllt, sĂ„ gĂ„r vi omedelbart hit och försöker fĂ„ det hĂ€r lĂ„set igen, för nĂ„got kunde ha förĂ€ndrats under denna tid.

"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 bearbetningen av processer - BegÀran. Och Àven ZooKeeper Atomic Broadcast. Det finns en Commit Log dÀr alla operationer registreras. Och sjÀlva In-memory Replicated DB, d.v.s. 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 ZooKeeper-instanser lagrar en fullstÀndig kopia av data.

För att ÄterstÀlla databasen efter en krasch finns det en Commit-logg. Standardpraxis Àr att skriva data i minnet innan det kommer dit, sÄ att denna logg kan spelas upp i hÀndelse av en krasch och systemtillstÄndet kan ÄterstÀllas. 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 vÀntar pÄ nÄgra handlingar frÄn henne. Om de fÄr nÄgra poster skickar de dem alla till ledaren. Den utför först skrivoperationen och skickar sedan ett meddelande till sina följare om vad som har förÀndrats. Detta bör i huvudsak göras atomÀrt, d.v.s. skrivoperationen och sÀndningen av det hela bör göras atomÀrt, vilket garanterar datakonsistens.

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

Och hÀr Àr det vÀrt att notera att idempotensen av uppdateringar för samma operation Àr garanterad. Vad Àr det hÀ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 driften vid en eventuell krasch kan startas om och dÀrigenom rulla ut de förÀndringar som har fallit av för tillfÀllet. I detta fall kommer systemets tillstÄnd att bli detsamma, d.v.s. det ska inte vara sÄ att en serie av samma, till exempel uppdateringsprocesser, leder 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