RDDとは何ですか?
公式サイトの説明
A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable,
partitioned collection of elements that can be operated on in parallel
RDD は、Elastic Distributed Data Set を表す 3 つの単語の頭字語で、Spark の最も基本的なデータ抽象化であり、要素が並列操作できる不変で分割可能なセットを表します。
- DataSet は、大量のデータを保存するコレクションであることを意味します。
- 分散とは、データが分散して保存されることを意味します。データは小さな部分に分割され、異なる物理マシンに保存されるため、将来の分散並列コンピューティングが容易になります。
- 復元力があるとは、RDD データをメモリまたはディスクに保存できることを意味します。自分で設定し、デフォルトでメモリに保存できます。
RDDの5大特徴
(1) - A list of partitions
(2) - A function for computing each split
(3) - A list of dependencies on other RDDs
(4) - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
(5) - Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
-
パーティション リストのコレクション、つまり、複数の (データ) パーティションを含む RDD。その後、Spark タスクが RDD を実行すると、パーティションが 1 つのタスクに分割され、複数のタスクが並行して実行されます。
-
各シャード(パーティション)に対して動作する関数。開発者はコードに1行の操作文を記述するだけで、実際に実行するとRDDの各パーティションで関数が実行されます。
-
1 つの RDD は他の複数の RDD に依存し、上位と下位の RDD 間の依存関係が系統を形成します。Spark タスクのフォールト トレランス メカニズムは、この機能に基づいています。
-
(オプション) kv タイプ RDD のみパーティション関数があります (シャッフルを生成する必要があります)。kv タイプ RDD でない場合、そのパーティション関数は None となり、何もありません。
Spark には 2 つのパーティショニング関数があります。
1 つ目: HashPartitioner 関数は、キーからハッシュコード値を削除し、パーティション数の残りを取得してパーティション番号を取得します。[デフォルトでこれを使用します]
2 番目のタイプ: RangePartitioner 関数、特定の範囲に従ってパーティションを分割し、同じ範囲内のキーは同じパーティションに入ります。
-
(オプション) 最適なデータ ブロックの場所、データの局所性、およびデータの最適な場所のリスト。Spark タスク コンピューティングは、データを持つノードを優先してコンピューティング タスクを開始します。つまり、データがある場所にコンピューティング タスクが配置されるため、ネットワーク送信が削減され、パフォーマンスが向上します。
RDDの事業者分類
RDD 演算子は主に 2 つのタイプに分類されます。
- 変換
- 1 つの RDD を別の RDD に変換できます。プログラムがこのタイプの RDD コードを実行すると、依存関係 (系統) 関係が構築されるだけで、実際の操作はトリガーされません。(これは、最初に「絵」を描画してから実行をトリガーする、ハードウェア指向プログラミングや tensorflw のスタイルに似ています)
- 例: flatMap、map、reduceByKey。
- アクション
- 実際の実行が開始され、以前に描かれた「絵」に従って実行されます。
- 例:collect、saveAsTextFile
RDD間の依存関係
2 種類の依存関係: 広い依存関係と狭い依存関係。
狭い依存関係: 親 RDD のパーティションは、子 RDD の最大 1 つのパーティションによってのみ使用されます (1 対 1、多対 1)。たとえば、マップ、フィルター、フラットマップ、その他のオペレーター操作などです。
幅広い依存関係: 子 RDD の複数のパーティション データは、親 RDD の同じパーティション データに依存します (1 対多)。例:reduceByKey、groupByKey、sortByKey、その他の演算子。
狭い依存関係ではシャッフルが発生しませんが、広い依存関係ではシャッフルが発生します。
コード内の RDD 間の依存関係は系統を形成します。あるRDDのパーティションデータが失われた場合、系統関係を再計算することで失われた部分のパーティションデータを回復することができます。
シャッフルとは
簡単に言うと、shuflle プロセスは、クラスター内の複数のノードに分散されている同じキーを同じノードにプルして、集約および結合操作を行うことです。reduceByKey や join などの演算子は、シャッフル操作をトリガーします。シャッフル プロセス中、各ノードの同じキーが最初にローカル ディスクに書き込まれ、その後、他のノードがネットワーク送信を通じて各ノードのディスク ファイルから同じキーを取得する必要があります。さらに、集計操作を実行するために同じキーが同じノードにプルされると、1 つのノードで処理されるキーが多すぎるため、保存するためのメモリが不足し、オーバーフローしてディスクに書き込まれる可能性があります。したがって、シャッフル処理中に大量のディスク IO とネットワーク IO が発生します。これが、シャッフルのパフォーマンス差の主な理由でもあります。
RDDキャッシュメカニズム
RDDキャッシュとは何ですか?
RDD データをメモリまたはディスクに保存します。後でデータを使用する必要がある場合は、キャッシュから直接読み取ることで計算の繰り返しを避けることができます。
RDDキャッシュを設定するにはどうすればよいですか?
キャッシュと永続の違いは何ですか?
キャッシュの本質は、データをキャッシュに入れる pesist メソッドを呼び出すことです。このメソッドは、StorageLevel で定義されたさまざまなキャッシュ レベルを渡すことができます。
RDDキャッシュをクリアする方法
方法 1: システムがキャッシュ データを自動的にクリアする アプリケーションを実行すると、キャッシュ データが消えます。
方法 2: 手動クリア、呼び出しunpersist(true)
方法。
DAG 有向非巡回グラフの分割
有向非巡回グラフ プログラム内の RDD 間の依存関係に従って生成される有向非巡回グラフです。
1. なぜステージを分割する必要があるのでしょうか?
ジョブ タスクには多数の広い依存関係と狭い依存関係が存在する場合があります。広い依存関係ではシャッフルが発生しますが、狭い依存関係ではシャッフルが発生しません。ステージが分割されると、同じステージ内には狭い依存関係のみが存在し、広い依存関係は存在しなくなり、これらの狭い依存関係は独立して並列化できます。
2. ステージの分け方は?
最後のRDDから進んで、最初にステージを作成しますが、これが実質最後のステージです。狭い依存関係が見つかった場合は RDD がステージに追加され、広い依存関係が見つかった場合はステージが切断され、新しいステージが再作成され、最初の RDD に到達するまでプロセスが続行されます。ステージを分割するプロセス全体が終了しました。
3. ステージを実行するにはどうすればよいですか?
ステージはデータ パーティションに応じて複数のタスクに分割されます。Spark タスクが実行されると、各ステージはそれらの関係に従って順次実行されます。ステージ内の各タスクは、独自のパーティション上のデータを実行します。これらのタスクは同じことを実行します。並行して動作します。