で
おかげで、ファイルは並列処理方式に基づいてパーティションに分割されるだろうとの命令が労働者に送信されます。その後、ファイルシステムから作業者がファイルを直接読み込みます(したがって、HDFSなどのすべてのノードで使用できる分散ファイルシステムの必要性)。
RDDではなくspark.read.csvを使用してデータフレームに読み込むほうがはるかに優れています。これはメモリが少なくなり、sparkがクエリを最適化できるようになります。コメントで
UPDATE
、それはファイルシステムが配布されていなかったと、ファイルが1台のマシンにのみ配置されることになる場合に何が起こるか尋ねました。 答えは、マシンが2台以上ある場合、失敗する可能性が最も高いということです。
sparkContext.textFileを実行すると、実際には何も読み込まれず、読み込みたいものがsparkに伝えられます。それから、あなたはそれに対して何らかの変換を行い、プランを定義しているので、何も読み込まれません。アクション(例:収集)を実行すると、実際の処理が開始されます。スパークは仕事を仕事に分けてエグゼクティブに送ります。エグゼキュータ(マスターノードまたはワーカーノード上にある可能性があります)は、ファイルの一部を読み取ろうとします。問題は、マスターノードにいないすべてのエグゼキュータがファイルを探して見つからないため、タスクが失敗することです。スパークは何度か再試行します(私はデフォルトが4と信じています)。
ノードが1つだけの場合は、すべてのエグゼキュータがそのファイルを表示し、すべてが正常に動作します。また理論的には、作業が作業者に失敗し、その後マスタに再実行され、そこで成功する可能性がありますが、ファイルのコピーがない限り、作業者は作業を行いません。
ファイルをすべてのノードのまったく同じパスにコピーするか、任意の種類の分散ファイルシステム(NFS共有でも問題ありません)を使用してファイルをコピーして解決できます。
もちろん、1つのノードで作業することはできますが、sparkのスケーラビリティを利用することはできません。
答えの最初の部分については、私は分散ファイルシステムを持っていないと仮定しましょう。そのファイルは、**ただ1台のマシン**のファイルシステムに置かれています(マスターと仮定します)。そのシナリオでは、何が起こるでしょうか?その単一のマシンは**配布が行われる前にメモリにロードする必要があります**? –
@AnderMurilloZohn更新された説明を参照してください –
ありがとう、今すぐ取得します。 –