1について
Spark は、RDD や Dataset (および 2.0 より前の Dataframe) などの分散データ構造で動作します。質問に対する答えを得るために、このデータ構造について知っておくべき事実は次のとおりです。
- (マップ、フィルターなど) のようなすべての変換操作は遅延です。これは、操作の具体的な結果が必要でない限り、読み取りは実行されないことを意味します (縮小、折り畳み、または結果をファイルに保存するなど)。
- HDFS でファイルを処理する場合、Spark はファイル パーティションで動作します。パーティションは、処理できるデータの最小論理バッチです。通常、1 つのパーティションは 1 つの HDFS ブロックに等しく、パーティションの総数がファイル内のブロック数よりも少なくなることはありません。一般的な (およびデフォルトの) HDFS ブロック サイズは 128Mb です。
- RDD および Dataset 内のすべての実際の計算 (HDFS からの読み取りを含む) は、executor 内で実行され、ドライバーでは実行されません。ドライバーは、DAG と実行の論理プランを作成し、さらに処理するためにタスクをエグゼキューターに割り当てます。
- 各エグゼキューターは、以前に割り当てられたタスクをデータの特定のパーティションに対して実行します。したがって、通常、エグゼキュータにコアを 1 つだけ割り当てた場合、同時に処理できるデータは 128Mb (デフォルトの HDFS ブロック サイズ) までです。
したがって、基本的に、呼び出したときにsc.textFile
実際の読み取りは行われません。前述のすべての事実は、20 Tb のデータを処理しているときに OOM が発生しない理由を説明しています。
操作などの特殊なケースがいくつかありますjoin
。ただし、この場合でも、すべてのエグゼキュータは、さらに処理するために中間結果をローカル ディスクにフラッシュします。
2について
JDBC の場合、テーブルにいくつのパーティションを作成するかを決定できます。そして、データを適切にパーティションに分割するテーブル内の適切なパーティション キーを選択します。同時にいくつのデータをメモリにロードするかはあなた次第です。
3について
ローカル ファイルのブロック サイズは、fs.local.block.size
プロパティによって制御されます (デフォルトでは 32Mb だと思います)。したがって、基本的には 1 (HDFS ファイル) と同じですが、1 台のマシンと 1 台の物理ディスク ドライブからすべてのデータを読み取るという点が異なります (20TB のファイルの場合、これは非常に非効率的です)。