Knoldus Inc.
Knoldus Inc.

sledovat

30. Dubna 2016 * 2 min čtení

jako dokumentace pro Spark Broadcast proměnné stavy, jsou neměnné sdílené proměnné, které jsou ukládány do mezipaměti na každé pracovní uzly na Spark clusteru. V tomto blogu, ukážeme jednoduchý případ použití vysílaných proměnných.

kdy použít proměnnou vysílání?

myslete na problém jako počítání gramatických prvků pro libovolný náhodný anglický odstavec, dokument nebo soubor. Předpokládejme, že máte mapu každého slova jako konkrétní gramatický prvek jako:

Val dictionary = Map ((„člověk“ – > „podstatné jméno“), („je“->“sloveso“), („smrtelník“->“přídavné jméno“))
Zamysleme se nad funkcí, která vrací počet jednotlivých gramatických prvků pro dané slovo.

def getElementsCount(word :String, dictionary:Map): (String,Int) = {
slovník.filter{ case (formulace,wordType) => formulace.rovná se ((slovo))}.mapa(x => (x._2,1)).volba hlavy.getOrElse ((„Neznámý“ -> 1)) //nějaká fiktivní logika
}
a pomocí této funkce Spočítejte každý gramatický prvek pro následující data:

val words = sc.paralelize (pole („člověk“, „je“, „smrtelný“, „smrtelný“,“1234″,“789″,“456″,“is“, „man“)
Val grammarElementCounts = slova.mapa (word => getElementsCount (slovo, slovník)).reduceByKey ((x, y) => x + y)
před spuštěním jednotlivých úkolů na dostupných exekutorech Spark vypočítá uzavření úkolu. Uzávěrem jsou proměnné a metody, které musí být viditelné pro vykonavatele, aby mohl provádět své výpočty na RDD.

ve výše uvedeném úryvku jsme poslali slovník jako hodnotu pro funkci. To je v pořádku, dokud to nebudeme provozovat lokálně na jediném exekutorovi. V prostředí klastru, to dá Spark obrovskou komunikační a výpočetní zátěž, když tento slovník bude potřebovat každý exekutor. Spark automaticky vysílá společná data potřebná úkoly v každé fázi. Takto vysílaná data jsou ukládána do mezipaměti v serializované podobě a před spuštěním každého úkolu deserializována.

údajně jsme měli velký anglický slovník obsahující každé možné slovo s jeho gramatickou ilustrací, cena by byla více, když ji pošleme jako surovou hodnotu s uzávěry. Jak uvádí dokumentace, explicitní vytváření proměnných vysílání je prospěšné pouze tehdy, když úkoly ve více fázích potřebují stejná data nebo je důležité ukládat data do mezipaměti v dezerializované podobě.

jak vytvořit a používat proměnné vysílání?

vysílané proměnné jsou obaly Kolem jakékoli hodnoty, která má být vysílána. Konkrétněji jsou typu: org.Apač.jiskra.vysílání.Vysílání a mohou být vytvořeny voláním:

Val broadCastDictionary = sc.vysílání (slovník)
proměnná broadCastDictionary bude odeslána do každého uzlu pouze jednou. K hodnotě lze přistupovat voláním metody .hodnota () na vysílaných proměnných. Udělejme malou změnu v naší metodě getElementsCount, která nyní vypadá:

def getElementsCount(word: String, dictionary: org.Apač.jiskra.vysílání.Vysílání]): (String,Int) = {
slovník.hodnota.filter{ case (formulace,wordType) => formulace.rovná se ((slovo))}.mapa(x => (x._2,1)).volba hlavy.getOrElse ((„Neznámý“ -> 1))
}
místo odeslání surového slovníku projdeme broadCastDictionary se slovy RDDs.

slova.mapa (word => getElementsCount (word, broadCastDictionary)).reduceByKey ((x,y) => x + y)
při sběru by výsledek byl:

Array = Array((přídavné jméno,2), (podstatné jméno,2), (neznámé,3), (sloveso,2))

co je třeba pamatovat při používání proměnných vysílání:

jakmile jsme vyslali hodnotu do uzlů, neměli bychom provádět změny její hodnoty, abychom se ujistili, že každý uzel má přesně stejnou kopii dat. Upravená hodnota může být poslána do jiného uzlu později, což by přineslo neočekávané výsledky.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.