ビッグデータ開発-Spark-共有変数アキュムレータとブロードキャスト変数

Sparkアキュムレータとブロードキャスト変数

1.はじめに

Sparkでは、アキュムレータとブロードキャスト変数の2種類の共有変数が提供されています。

  • アキュムレータ:情報を集約するために使用され、主に累積カウントなどのシナリオで使用されます。

  • ブロードキャスト変数:主に、ノード間で大きなオブジェクトを効率的に分散するために使用されます。

第二に、アキュムレータ

最初に特定のシナリオを見てみましょう。通常の累積合計の場合、次のコードを使用してクラスターモードで計算すると、実行結果が予期されないことがわかります。

var counter = 0
val data = Array(1, 2, 3, 4, 5)
sc.parallelize(data).foreach(x => counter += x)
 println(counter)

カウンターの最終結果は0です。この問題の主な原因はクロージャです。

ファイル

2.1クロージャを理解する

1.Scalaでのクロージャの概念

ここでは、最初にScalaのクロージャの概念を紹介します。

var more = 10
val addMore = (x: Int) => x + more

addMore2つの変数x以上の関数として

  • x:はバインドされた変数です。これは、関数の入力パラメーターであり、関数のコンテキストで明確に定義されているためです。

  • more:は自由変数です。これは、関数リテラルBunsenがmoreに意味を与えないためです。

定義によると、関数を作成するときに、自由変数をキャプチャする必要がある場合、キャプチャされた変数への参照を含む関数はクロージャ関数と呼ばれます。

2.Sparkのクロージャ

https://blog.csdn.net/hu_lichao/article/details/112451982も参照できます。

実際の計算では、SparkはRDD操作をタスクに分解します。タスクはワーカーノードで実行されます。実行前に、Sparkはタスクを閉じます。自由変数がクロージャに含まれている場合、プログラムはそれをコピーし、コピー変数をクロージャに配置します。その後、クロージャはシリアル化され、各エグゼキュータに送信されます。したがって、foreach関数が参照counterすると、ドライバーノードには存在しなくなりcounterますが、パッケージのコピーを閉じると、counterデフォルトでは、counter更新された値のコピーがドライバーに戻されないためcounter、最終的な値はゼロのままになります。

注:ローカルモードではforeach、同じJVMでダイバーを使用してワーカーノードを実行し、同じオリジナルを参照counterすることができます。今回の更新は正しい場合がありますが、クラスターモードでは正しくありません。したがって、このような問題が発生した場合は、最初にアキュムレータを使用する必要があります。

アキュムレータの原理は実際には非常に単純です。各コピー変数の最終値がドライバに返され、ドライバによる集計後に最終値が取得され、元の変数が更新されます。

ファイル

2.2アキュムレータの使用

SparkContext アキュムレータを作成するためのすべてのメソッドはで定義されています。水平線で囲まれたアキュムレータメソッドは、Spark2.0.0以降で廃止されたものとしてマークされていることに注意してください。

使用例と実行結果は以下のとおりです。

val data = Array(1, 2, 3, 4, 5)
// 定义累加器
val accum = sc.longAccumulator("My Accumulator")
sc.parallelize(data).foreach(x => accum.add(x))
// 获取累加器的值
accum.value

3つ、ブロードキャスト変数

上記の紹介のクロージャの過程で、各タスクタスクのクロージャは自由変数のコピーを保持すると述べました。変数が大きく、タスクタスクが多い場合、これは必然的にネットワークIOに圧力をかけます。これを解決するために、Sparkはブロードキャスト変数を提供します。

変数をブロードキャストする方法は非常に単純です。コピー変数を各タスクに配布する代わりに、各エグゼキューターに配布します。エグゼキューター内のすべてのタスクはコピー変数を共有します。

// 把一个数组定义为一个广播变量
val broadcastVar = sc.broadcast(Array(1, 2, 3, 4, 5))
// 之后用到该数组时应优先使用广播变量,而不是原值
sc.parallelize(broadcastVar.value).map(_ * 10).collect()

4、観測変数

作成されたアキュムレータ変数の値は、Spark WebUIで確認できます。作成時に名前を付ける必要があります。以下では、Spark WebUIでアキュムレータの値を表示する方法について説明します。

ファイル

5、参考資料

RDDプログラミングガイド

https://www.cnblogs.com/cc11001100/p/9901606.html

https://www.cnblogs.com/zz-ksw/p/12448650.html

Wu Xie、Xiao San Ye、バックグラウンドの小さな新人、ビッグデータ、人工知能。もっと注意してくださいファイル

おすすめ

転載: blog.csdn.net/hu_lichao/article/details/112760233