ブロードキャスト方式では、クラスター内でRDDの分散コピーが作成されるようです。一方、cache()メソッドを実行すると、メモリにデータがロードされます。
ただし、キャッシュされたRDDがクラスター内でどのように分散されるかはわかりません。
どのような場合にrdd.cache()
およびrdd.broadcast()
メソッドを使用すべきか教えてください。
どのような場合にrdd.cache()およびrdd.broadcast()メソッドを使用すべきか教えてください。
RDDはpartitionsに分割されます。これらのパーティション自体は、RDD全体の不変のサブセットとして機能します。 Sparkがグラフの各ステージを実行すると、各パーティションはデータのサブセットを操作するワーカーに送信されます。各ワーカーはcache data RDDを繰り返す必要がある場合。
ブロードキャスト変数は、不変の状態を送信するために使用されますonce各ワーカーに。変数のローカルコピーが必要な場合に使用します。
これらの2つの操作は互いに大きく異なり、それぞれが異なる問題の解決策を表しています。
cache() またはpersist()データセットを操作全体で使用できるようにします。
RDDをpersistすると、各ノードはメモリ内で計算したパーティションを保存し、そのデータセット(または派生したデータセット上の他のアクションで再利用します)それ)。これにより、将来のアクションがはるかに高速になります(多くの場合10倍以上)。 キャッシュは、反復アルゴリズムと高速でインタラクティブな使用のための重要なツールです。
永続化された各RDDは、異なるストレージレベルを使用して格納できます。たとえば、データセットをディスクに永続化し、memoryに永続化できますが、シリアル化Javaオブジェクト(スペースを節約するため)、ノード間で複製する、または保存するoff-heap
ブロードキャスト変数 プログラマーは、タスクのコピーを出荷するのではなく、読み取り専用変数を各マシンにキャッシュしておくことができます。たとえば、すべてのノードに大規模な入力データセットのコピーを効率的な方法で提供するために使用できます。 Sparkは、通信コストを削減するために効率的なブロードキャストアルゴリズムを使用してブロードキャスト変数を配布しようとします。
詳細については、この ドキュメント ページを参照してください。
便利な投稿:
どのような場合にrdd.cache()およびrdd.broadcast()メソッドを使用すべきか教えてください。
例を見てみましょう-すべての従業員の部門と給与を含むemployee_salaryデータがあるとします。ここで、タスクは各従業員の平均部門給与の一部を見つけることであると言います。 (従業員e1の部門がd1である場合、e1.salary/average(d1のすべての給与)を見つける必要があります)。
これを行う1つの方法は、まずデータをrddに読み込むことです(rdd1と言います)。そして、2つのことを順番に実行します*-
まず、rdd1 *を使用して部門ごとの給与平均を計算します。最終的には、部門の平均給与結果(基本的にはdeptId vs averageを含むマップオブジェクト)がドライバーに表示されます。
次に、この結果を使用して、各従業員の給与をそれぞれの部門の平均給与で割る必要があります。各労働者にはどの部門の従業員も存在できるため、各労働者の部門ごとの平均給与結果にアクセスする必要があることに注意してください。これを行う方法?ドライバーで取得した平均給与マップをブロードキャストで各ワーカーに送信するだけで、rdd1のすべての "行"の給与比率の計算に使用できます。
RDDのキャッシングはどうですか?最初のrdd1から、計算の2つのブランチがあることに注意してください。1つは深さ方向の平均を計算するためのもので、もう1つはrddの各従業員にこれらの平均を適用するものです。ここで、rdd1をキャッシュしない場合、上記の2番目のタスクでは、ディスクに戻って読み取り、再計算する必要があります。sparkはこのrddをメモリから追い出した可能性があるためです。ただし、同じrddを使用することがわかっているので、Sparkを最初にメモリに保持するように依頼できます。次に、いくつかの変換を適用する必要がありますその上で、私たちはすでにそれをメモリに持っています。
* deptベースのパーティション分割を使用すると、ブロードキャストを回避できますが、説明のために、そうではないとしましょう。
オブジェクトを複数回使用する場合は、オブジェクトをキャッシュまたはブロードキャストします。
RDDまたはRDD派生物のみをキャッシュできますが、RDDを含むあらゆる種類のオブジェクトをブロードキャストできます。
RDD/DataFrame/DataSetを処理するときにcache()を使用し、毎回再計算せずにデータセットを複数回使用する場合。
ブロードキャストオブジェクト