2016-07-06 16 views
3

ファイルを読み込んでいくつかの操作を行い、指定されたパスで出力ファイルを生成するspark javaプログラムを実行しているときに問題が発生しました。 マスタとスレーブが同じマシン上にある場合は、すべてが正常に動作します。スタンドアロンクラスタモードでは。 マルチマシンマルチノードクラスタで同じプログラムをデプロイすると問題が発生しました。つまり、マスターはx.x.x.102で実行され、スレーブはx.x.x.104で実行されています。 マスタースレーブは両方ともSSHキーを共有しており、互いに到達可能です。出力ファイルがApacheのスパークでスレーブマシンで生成されています

最初にスレーブは入力ファイルを読み取ることができませんでした。私はsc.textFile()の前にsc.addFile()に電話する必要があることを知りました。その問題を解決しました。しかし、出力パスの下の_temporaryフォルダのスレーブマシンで出力が生成されているのがわかりました。つまり:/tmp/emi/_temporary/0/task-xxxx/part-00000 ローカルクラスタモードでは、正常に動作し、/tmp/emi/part-00000に出力ファイルを生成します。

私はSparkFiles.get()を使用する必要があることを知りました。しかし、私はどのようにこのメソッドを使用するのか理解できません。

今私は

DataFrame dataobj = ... 
dataObj.javaRDD().coalesce(1).saveAsTextFile("file:/tmp/emi"); 

を使用していますまでのいずれかは、私がSparkFiles.get()を呼び出す方法を教えてくださいことはできますか?

要するに、ドライバが動作しているマシンに出力ファイルを作成するようにスレーブに指示するにはどうすればよいですか?

助けてください。

ありがとうございます。

+0

要するに、マルチマシンのマルチノードクラスタ環境で、スレーブにドライバマシンに出力ファイルを保存する方法を教えてもらいたいのですが? – summary

答えて

1

ここには何も予想外のことはありません。各作業者は、データの独自の部分を個別に書き込みます。スキームを使用するのは、データが作業者の観点からファイルシステムのローカルファイルに書き込まれるということだけを意味します。file

SparkFilesについては、この特定のケースでは適用されません。 SparkFilesを使用して、結果を処理しないように共通ファイルをワーカーマシンに配布することができます。

ドライバコードを実行するマシンで何らかの理由で書き込みを実行する場合は、まずドライバマシンにデータをフェッチする必要があります(collectにはすべてのデータを格納するのに十分なメモリが必要です)またはtoLocalIterator時間と複数のジョブが必要)とuse standard toolsローカルファイルシステムに結果を書き込みます。一般的に、運転手に書くことは良い習慣ではなく、ほとんどの時間は単に役に立たない。

+0

ありがとうございました。私は収集するために標準的なメソッドを使用する必要がありますし、配列でそれを取得し、単純なJavaプログラムとしてファイルに保存し、その後、私は動機を火花を使用する緩やかにしませんか?私は、私はapacheのスパークが知られているメモリの計算を使用する利点を敗北させると言うことを意味します。それを行うためのより良い方法はありますか?出力ファイルは将来的には巨大になるからです。 – summary

+0

ドライバーに書き込むことは本当に悪い考えであり、実際には役に立たないので、 .coalese(1)と同じです。リテラル 'collect'ではなく' toLocalIterator'を使うことができますが、はるかに高価です。 – zero323

+0

こんにちはゼロ、今私はsaveAsTextFileを使用していません。しかし今、それは、collect()でoutofMemoryエラーGCオーバーヘッドを与えています。 リスト mrow = errors.javaRDD()。合体(1)。collect(); JavaRDD data = sc.parallelize(mrow、100); try {各データ行に印刷} スライスに分割する点を除いて、parallizeに適切な文書がありません。それは、データがそれぞれ100行のN行の塊であることを意味しますか? ポインタはありますか?どうもありがとう 。 – summary

関連する問題