Knoldus Inc.
Knoldus Inc.

Følg

30. Apr 2016 * 2 min lese

som dokumentasjon For Spark Broadcast variabler stater, de er uforanderlig delt variabel som er bufret på hver arbeider noder På En Gnist klynge. I denne bloggen vil vi demonstrere et enkelt brukstilfelle av kringkastingsvariabler.

når skal Du bruke Kringkastingsvariabel?

Tenk på et problem som å telle grammatikkelementer for et tilfeldig engelsk avsnitt, dokument eller fil. Anta at Du har Kartet over hvert ord som spesifikt grammatikkelement som:

val dictionary = Map ((«man» -> «substantiv»), («is»- > «verb»), («mortal»-> «adjektiv»))
La oss tenke på en funksjon som returnerer tellingen av hvert grammatikkelement for et gitt ord.

def getElementsCount(ord: Streng, ordbok: Kart): (Streng,Int) = {
ordbok.filter{ case (ordlyd, wordType) = > ordlyd.er lik ((word))}.kart(x => (x._2,1)).headOption.getOrElse («ukjent» -> 1)) //noen dummy logikk
}
og bruk denne funksjonen til å telle hvert grammatikkelement for følgende data:

val words = sc.parallelize (Array («mann», «er», «dødelig», «dødelig»,»1234″,»789″,»456″,»er», «mann»)
val grammarElementCounts = ord.kart (word = > getElementsCount (ord, ordbok)).reduceByKey((x,y) => x+y)
Før Du kjører hver oppgave på de tilgjengelige eksekutorene, Beregner Spark oppgavens lukning. Lukkingen er de variablene og metodene som må være synlige for eksekutoren å utføre sine beregninger på RDD.

i teksten ovenfor har vi sendt ordboken som verdi for å fungere. Dette er greit til vi kjører det lokalt på enkelt eksekutor. I klyngemiljø vil Det Gi Gnist en stor kommunikasjon og beregne byrde når denne ordlisten vil være nødvendig av hver eksekutor. Spark sender automatisk de vanlige dataene som trengs av oppgaver innenfor hvert trinn. Dataene som sendes på denne måten, bufres i serialisert form og deserialiseres før du kjører hver oppgave.

Visstnok hadde Vi En stor engelsk ordbok som inneholder hvert mulig ord med sin grammatiske illustrasjon, kostnaden ville ha vært mer som vi sender det som rå verdi med nedleggelser. Som dokumentasjon resiterer, er det bare gunstig å opprette kringkastingsvariabler når oppgaver på tvers av flere stadier trenger de samme dataene, eller når caching av dataene i deserialisert form er viktig.

hvordan lage Og bruke Kringkastingsvariabler?

Broadcast variabler er wrappers rundt noen verdi som skal sendes. Mer spesifikt er de av typen: org.apache.gnist.kringkasting.Broadcast og kan opprettes ved å ringe:

val broadCastDictionary = sc.broadcast (ordbok)
den variable broadCastDictionary vil bli sendt til hver node bare en gang. Verdien kan nås ved å ringe metoden .verdi () på kringkastingsvariabler. La oss gjøre liten endring i vår metode getElementsCount som nå ser ut som:

def getElementsCount(word: String, dictionary: org.apache.gnist.kringkasting.Broadcast]): (String, Int) = {
ordbok.verdi.filter{ case (ordlyd, wordType) = > ordlyd.er lik ((word))}.kart(x => (x._2,1)).headOption.getOrElse («ukjent» -> 1))
}
I Stedet for å sende raw dictionary vil vi passere broadCastDictionary med ord RDDs.

ord.kart (word = > getElementsCount (word, broadCastDictionary)).reduceByKey((x,y) => x+y)
på collect vil resultatet være:

Array = Array((adjektiv,2), (substantiv,2), (ukjent,3), (verb,2))

Ting å huske når Du bruker Kringkastingsvariabler:

Når vi sendte verdien til nodene, bør vi ikke gjøre endringer i verdien for å sikre at hver node har nøyaktig samme kopi av data. Den endrede verdien kan sendes til en annen node senere som vil gi uventede resultater.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.