2017-02-10 2 views
2

大きなCSVファイルを読み込み、RDDに読み込んで、いくつかの変換を行い、最後に統計を保存するSpark処理フレームワークを開発しています。分散形式でSparkでCSVファイルを読む

問題のCSVファイルは平均約50GBです。私はSpark 2.0を使用しています。

私の質問は次のとおりです。

私はsparkContext.textFile()関数を使用してファイルをロードすると、ファイルは最初のドライバのメモリに格納する必要がないし、それが労働者に配布される(したがって、ドライバにはかなりの量のメモリが必要です)。あるいは、ファイル全体を保存する必要がなく、ドライバが「マネージャ」としてのみ機能するように、ファイルはすべてのワーカーによって「並行」で読み込まれますか?あなたが読書を定義する場合、事前

答えて

5

おかげで、ファイルは並列処理方式に基づいてパーティションに分割されるだろうとの命令が労働者に送信されます。その後、ファイルシステムから作業者がファイルを直接読み込みます(したがって、HDFSなどのすべてのノードで使用できる分散ファイルシステムの必要性)。

RDDではなくspark.read.csvを使用してデータフレームに読み込むほうがはるかに優れています。これはメモリが少なくなり、sparkがクエリを最適化できるようになります。コメントで

UPDATE

、それはファイルシステムが配布されていなかったと、ファイルが1台のマシンにのみ配置されることになる場合に何が起こるか尋ねました。 答えは、マシンが2台以上ある場合、失敗する可能性が最も高いということです。

sparkContext.textFileを実行すると、実際には何も読み込まれず、読み込みたいものがsparkに伝えられます。それから、あなたはそれに対して何らかの変換を行い、プランを定義しているので、何も読み込まれません。アクション(例:収集)を実行すると、実際の処理が開始されます。スパークは仕事を仕事に分けてエグゼクティブに送ります。エグゼキュータ(マスターノードまたはワーカーノード上にある可能性があります)は、ファイルの一部を読み取ろうとします。問題は、マスターノードにいないすべてのエグゼキュータがファイルを探して見つからないため、タスクが失敗することです。スパークは何度か再試行します(私はデフォルトが4と信じています)。

ノードが1つだけの場合は、すべてのエグゼキュータがそのファイルを表示し、すべてが正常に動作します。また理論的には、作業が作業者に失敗し、その後マスタに再実行され、そこで成功する可能性がありますが、ファイルのコピーがない限り、作業者は作業を行いません。

ファイルをすべてのノードのまったく同じパスにコピーするか、任意の種類の分散ファイルシステム(NFS共有でも問題ありません)を使用してファイルをコピーして解決できます。

もちろん、1つのノードで作業することはできますが、sparkのスケーラビリティを利用することはできません。

+0

答えの最初の部分については、私は分散ファイルシステムを持っていないと仮定しましょう。そのファイルは、**ただ1台のマシン**のファイルシステムに置かれています(マスターと仮定します)。そのシナリオでは、何が起こるでしょうか?その単一のマシンは**配布が行われる前にメモリにロードする必要があります**? –

+0

@AnderMurilloZohn更新された説明を参照してください –

+0

ありがとう、今すぐ取得します。 –

関連する問題