8

spark がドライバーを介してデータをプルするときと、spark がドライバーを介してデータをプルする必要がないときを簡単に説明しようとしています。

3 つの質問があります -

  1. 20 TB のフラット ファイル ファイルが HDFS に保存されていて、ドライバー プログラムから、それぞれのライブラリのすぐに使える関数 (sc.textfile(path) またはsc.textfile(path).toDFなど) のいずれかを使用して、データ フレームまたは RDD にプルするとします。ドライバーが 32 GB のメモリのみで実行されている場合、ドライバー プログラムが OOM を持つようになりますか? または、少なくともドライバーのジムにスワップがありますか? それとも、ドライバーを経由せずにデータフレーム/RDD を作成するために、HDFS から Spark エグゼキューターにデータを配布するのに十分スマートな Spark と Hadoop でしょうか?
  2. 外部 RDBMS からの場合を除いて、1 とまったく同じ質問ですか?
  3. 特定のノードのファイル システム (Unix ファイル システムのみ、20 TB ファイルであり、HDFS ではない) を除いて、1 とまったく同じ質問ですか?
4

1 に答える 1

5

1について

Spark は、RDD や Dataset (および 2.0 より前の Dataframe) などの分散データ構造で動作します。質問に対する答えを得るために、このデータ構造について知っておくべき事実は次のとおりです。

  1. (マップ、フィルターなど) のようなすべての変換操作は遅延です。これは、操作の具体的な結果が必要でない限り、読み取りは実行されないことを意味します (縮小、折り畳み、または結果をファイルに保存するなど)。
  2. HDFS でファイルを処理する場合、Spark はファイル パーティションで動作します。パーティションは、処理できるデータの最小論理バッチです。通常、1 つのパーティションは 1 つの HDFS ブロックに等しく、パーティションの総数がファイル内のブロック数よりも少なくなることはありません。一般的な (およびデフォルトの) HDFS ブロック サイズは 128Mb です。
  3. RDD および Dataset 内のすべての実際の計算 (HDFS からの読み取りを含む) は、executor 内で実行され、ドライバーでは実行されません。ドライバーは、DAG と実行の論理プランを作成し、さらに処理するためにタスクをエグゼキューターに割り当てます。
  4. 各エグゼキューターは、以前に割り当てられたタスクをデータの特定のパーティションに対して実行します。したがって、通常、エグゼキュータにコアを 1 つだけ割り当てた場合、同時に処理できるデータは 128Mb (デフォルトの HDFS ブロック サイズ) までです。

したがって、基本的に、呼び出したときにsc.textFile実際の読み取りは行われません。前述のすべての事実は、20 Tb のデータを処理しているときに OOM が発生しない理由を説明しています。

操作などの特殊なケースがいくつかありますjoin。ただし、この場合でも、すべてのエグゼキュータは、さらに処理するために中間結果をローカル ディスクにフラッシュします。

2について

JDBC の場合、テーブルにいくつのパーティションを作成するかを決定できます。そして、データを適切にパーティションに分割するテーブル内の適切なパーティション キーを選択します。同時にいくつのデータをメモリにロードするかはあなた次第です。

3について

ローカル ファイルのブロック サイズは、fs.local.block.sizeプロパティによって制御されます (デフォルトでは 32Mb だと思います)。したがって、基本的には 1 (HDFS ファイル) と同じですが、1 台のマシンと 1 台の物理ディスク ドライブからすべてのデータを読み取るという点が異なります (20TB のファイルの場合、これは非常に非効率的です)。

于 2016-08-22T21:56:57.983 に答える