(株)ノルドス
(株)ノルドス

フォローしている

Apr30,2016·2分読み取り

Spark Broadcast変数の状態のドキュメントとして、それらは不変の共有変数であり、Sparkクラスター上の各ワーカーノードにキャッシュされます。 このブログでは、ブロードキャスト変数の簡単な使用例を紹介します。

ブロードキャスト変数を使用する場合は?

問題は、任意のランダムな英語の段落、文書またはファイルの文法要素を数えると考えてください。 各単語のマップが

val dictionary=Map((“man”->”noun”),(“is”->”verb”),(“mortal”->”adjective”))
与えられた単語の各文法要素の数を返す関数を考えてみましょう。

def getElementsCount(word:String,dictionary:Map):(String,Int)={
辞書。filter{case(wording,wordType)=>wording.等号((word))}です。マップ(x=>(x._2,1))。頭が痛い。getOrElse((“不明” -> 1)) //いくつかのダミーロジック
}
と次のデータの各文法要素をカウントするには、この関数を使用します:

val words=sc。parallelize(Array(“man”,”is”,”mortal”,”mortal”,”1234″,”789″,”456″,”is”,”man”)
val grammarElementCounts=words.map(word=>getElementsCount(word,dictionary)).reduceByKey((x,y)=>x+y)
使用可能なエグゼキューターで各タスクを実行する前に、Sparkはタスクのクロージャを計算します。 クロージャは、executorがRDD上で計算を実行するために表示されなければならない変数とメソッドです。

上記のスニペットでは、関数の値として辞書を送信しました。 これは、単一のexecutorでローカルで実行するまで大丈夫です。 クラスター環境では、この辞書が各エグゼキュータによって必要とされるときに、Sparkに大きな通信と計算の負担を与えます。 Sparkは、各ステージ内のタスクに必要な共通データを自動的にブロードキャストします。 この方法でブロードキャストされたデータは、各タスクを実行する前にシリアル化された形式でキャッシュされ、逆シリアル化されます。

おそらく、私たちは文法的なイラストを持つ各可能な単語を含む大きな英語辞書を持っていましたが、クロージャ付きの生の値として送信すると、コストはより多くなっていたでしょう。 ドキュメントが述べているように、ブロードキャスト変数を明示的に作成することは、複数のステージにわたるタスクが同じデータを必要とする場合や、

ブロードキャスト変数を作成して使用するには?

ブロードキャスト変数は、ブロードキャストされる任意の値のラッパーです。 より具体的には、それらのタイプは:orgです。アパッチスパーク放送。ブロードキャストを作成するには、

val broadCastDictionary=scを呼び出します。broadcast(dictionary)
変数broadCastDictionaryは各ノードに一度だけ送信されます。 この値には、メソッドを呼び出すことでアクセスできます。ブロードキャスト変数の値()。 メソッドgetElementsCountを少し変更してみましょう。

def getElementsCount(word:String,dictionary:org.アパッチスパーク放送。ブロードキャスト]):(String,Int)={
辞書。値。filter{case(wording,wordType)=>wording.等号((word))}です。マップ(x=>(x._2,1))。頭が痛い。getOrElse((“不明” -> 1))
}
生の辞書を送信する代わりに、broadCastDictionaryに単語RDDsを渡します。

map(word=>getElementsCount(word,broadCastDictionary))。(x,y)=>x+y)
収集すると、結果は次のようになります。

Array=Array((形容詞,2),(名詞,2),(unknown,3),(動詞,2))

ブロードキャスト変数を使用する際に覚えておくべきこと:

ノードに値をブロードキャストしたら、各ノードがデータの正確なコピーを持つように値を変更すべきではありません。 変更された値は、後で別のノードに送信され、予期しない結果が得られる可能性があります。

コメントを残す

メールアドレスが公開されることはありません。