2016-05-17 12 views
0

問題上書きHDFSファイル/ディレクトリ

私は、HDFSに保存されたファイルを持っていると私がしたいすべてが、私のスパークアプリケーションを実行した結果javaRDDを計算し、新しいを格納するためにsaveAsTextFile()を使用することですHDFSの "ファイル"。ファイルがすでに存在する場合

しかしスパークのsaveAsTextFile()は動作しません。それはそれを上書きしません。私は、だから私はこの解決策を検索し、私はそれを動作させるために可能な方法は、新しいものを保存しようとする前に、HDFS APIを介してファイルを削除できることがわかっ

を試してみました何

私は、コードを追加しました:私は私のスパークアプリケーションを実行しようとしたとき

FileSystem hdfs = FileSystem.get(new Configuration()); 
Path newFolderPath = new Path("hdfs://node1:50050/hdfs/" +filename); 

if(hdfs.exists(newFolderPath)){ 
    System.out.println("EXISTS"); 
    hdfs.delete(newFolderPath, true); 
} 

filerdd.saveAsTextFile("/hdfs/" + filename); 

、ファイルが削除されたが、私はFileNotFoundExceptionを取得しました。

この例外は、誰かがパスからファイルを読み込もうとしていて、ファイルが存在しない場合に発生することを考慮すると、ファイルを削除した後は読み込もうとするコードが存在しないため意味がありません。私のコードの

パート

JavaRDD<String> filerdd = sc.textFile("/hdfs/" + filename) // load the file here 
... 
... 
// Transformations here 
filerdd = filerdd.map(....); 
... 
... 

// Delete old file here 
FileSystem hdfs = FileSystem.get(new Configuration()); 
Path newFolderPath = new Path("hdfs://node1:50050/hdfs/" +filename); 

if(hdfs.exists(newFolderPath)){ 
    System.out.println("EXISTS"); 
    hdfs.delete(newFolderPath, true); 
} 

// Write new file here 
filerdd.saveAsTextFile("/hdfs/" + filename); 

私はここで、最も単純なことを行うにしようとしていますが、私はこれが動作しない理由はわかりません。多分filerddは何とかパスに接続されていますか?

+0

あなたはスタックトレースを追加することはできますか? – javadba

答えて

1

問題は、入力と出力のために同じパスを使用しています。スパークのRDDは遅れて実行されます。 saveAsTextFileに電話をかけたときに実行されます。この時点で、newFolderPathはすでに削除されています。だからfilerddは文句を言うでしょう。

とにかく、あなたは、入力と出力のために同じパスを使用しないでください。

+0

しかし、私は私のスパークアプリケーションを複数回実行し、私は常に入力として保存された最新のファイルを使用したいので、HDFS内の別のパスにファイルを保存することは私のために動作しません。 – pirox22

+0

ファイルを一時パスに保存するだけです。 'saveAsTextFile'を実行した後、あなたが入力を削除して、入力されたパスを使用して一時パスの名前を変更することができます。 – zsxwing

関連する問題