Apache-spark-advanced-spark-programming
高度なSparkプログラミング
Sparkには2つの異なるタイプの共有変数が含まれています。1つは* broadcast変数*で、もう1つは accumulators です。
- ブロードキャスト変数-効率的に大きな値を配布するために使用されます。
- アキュムレータ-特定のコレクションの情報を集約するために使用されます。
ブロードキャスト変数
ブロードキャスト変数を使用すると、プログラマはタスクのコピーを出荷せずに、読み取り専用変数を各マシンにキャッシュしておくことができます。 たとえば、すべてのノードに大きな入力データセットのコピーを効率的に提供するために使用できます。 Sparkは、通信コストを削減するために効率的なブロードキャストアルゴリズムを使用してブロードキャスト変数を配布しようとします。
スパークアクションは、分散「シャッフル」操作で区切られた一連のステージを通じて実行されます。 Sparkは、各ステージ内のタスクに必要な共通データを自動的にブロードキャストします。
この方法でブロードキャストされたデータは、シリアル化された形式でキャッシュされ、各タスクを実行する前に逆シリアル化されます。 つまり、ブロードキャスト変数を明示的に作成することは、複数のステージにまたがるタスクが同じデータを必要とする場合、またはデータをデシリアライズされた形式でキャッシュすることが重要な場合にのみ有用です。
ブロードキャスト変数は、* SparkContext.broadcast(v)を呼び出すことにより、変数 *v から作成されます。 ブロードキャスト変数は v のラッパーであり、その値は value メソッドを呼び出すことでアクセスできます。 以下に示すコードはこれを示しています-
出力-
ブロードキャスト変数を作成したら、クラスターで実行される関数で値 v の代わりに使用する必要があります。これにより、 v がノードに複数回出荷されないようになります。 さらに、すべてのノードがブロードキャスト変数の同じ値を取得できるようにするために、オブジェクト v はブロードキャスト後に変更しないでください。
アキュムレーター
アキュムレータは、連想操作を介してのみ「追加」される変数であるため、並行して効率的にサポートできます。 それらを使用して、カウンター(MapReduceなど)または合計を実装できます。 Sparkは数値型のアキュムレーターをネイティブでサポートし、プログラマーは新しい型のサポートを追加できます。 アキュムレータが名前で作成されている場合、それらは SparkのUI に表示されます。 これは、実行中のステージの進行状況を理解するのに役立ちます(注-Pythonではまだサポートされていません)。
アキュムレータは、* SparkContext.accumulator(v)を呼び出すことにより、初期値 *v から作成されます。 クラスターで実行されているタスクは、 add メソッドまたは+ =演算子(ScalaおよびPython)を使用して追加できます。 ただし、その値を読み取ることはできません。 ドライバープログラムのみが、 value メソッドを使用してアキュムレーターの値を読み取ることができます。
以下のコードは、配列の要素を加算するために使用されるアキュムレータを示しています-
上記のコードの出力を見たい場合は、次のコマンドを使用します-
出力
数値RDD操作
Sparkでは、定義済みのAPIメソッドの1つを使用して、数値データに対してさまざまな操作を実行できます。 Sparkの数値演算は、モデルを一度に1要素ずつ作成できるストリーミングアルゴリズムで実装されます。
これらの操作は、* status()メソッドを呼び出すことで計算され、 *StatusCounter オブジェクトとして返されます。
以下は、 StatusCounter で使用可能な数値メソッドのリストです。
S.No | Methods & Meaning |
---|---|
1 |
count() RDDの要素の数。 |
2 |
Mean() RDDの要素の平均。 |
3 |
Sum() RDDの要素の合計値。 |
4 |
Max() RDDのすべての要素の最大値。 |
5 |
Min() RDDのすべての要素の最小値。 |
6 |
Variance() 要素の分散。 |
7 |
Stdev() 標準偏差。 |
これらのメソッドの1つのみを使用する場合は、RDDで直接対応するメソッドを呼び出すことができます。