2017-12-17 6 views
0

サブディレクトリを作成するときに親ディレクトリが存在しない場合、HDFSコマンドを失敗させたい。私はFileSystem#mkdirsのいずれかを使用すると、私の代わりに、存在しない親ディレクトリを作成し、例外が上がっていないことを見つける:HadoopのHDFS APIが親ディレクトリを作成しないようにするにはどうすればよいですか?

import java.util.UUID 
import org.apache.hadoop.conf.Configuration 
import org.apache.hadoop.fs.{FileSystem, Path} 

val conf = new Configuration() 
conf.set("fs.defaultFS", s"hdfs://$host:$port") 

val fileSystem = FileSystem.get(conf) 
val cwd = fileSystem.getWorkingDirectory 

// Guarantee non-existence by appending two UUIDs. 
val dirToCreate = new Path(cwd, new Path(UUID.randomUUID.toString, UUID.randomUUID.toString)) 

fileSystem.mkdirs(dirToCreate) 

存在をチェックの面倒な負担がなければ、どのように私は投げるためにHDFSを強制することができます親ディレクトリが存在しない場合は例外ですか?

+1

をすることができますわかりません。ドキュメントは、それが 'mkdir -p'と同等であると言っていますhttps://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html#mkdirs-org.apache.hadoop.fs.Path- org.apache.hadoop.fs.permission.FsPermission- –

+0

@ cricket_007 APIの他の部分がほぼ同等の機能を果たしているかどうかはわかりませんでした。 – erip

+1

まあ、 'hdfs dfs -mkdir'のCLIは、それ自身の親ディレクトリを作っていません...私はそのコードを見なければならないでしょう。 –

答えて

0

FileSystem APIは、このタイプの動作をサポートしていません。代わりに、FileContext#mkdirを使用する必要があります。例えば:

import org.apache.hadoop.conf.Configuration 
import org.apache.hadoop.fs.{FileContext, FileSystem, Path} 
import org.apache.hadoop.fs.permission.FsPermission 

val files = FileContext.getFileContext() 
val cwd = files.getWorkingDirectory 
val permissions = new FsPermission("644") 
val createParent = false 

// Guarantee non-existence by appending two UUIDs. 
val dirToCreate = new Path(cwd, new Path(UUID.randomUUID.toString, UUID.randomUUID.toString)) 

files.mkdir(dirToCreate, permissions, createParent) 

上記の例では、スローされます。

java.io.FileNotFoundException: Parent directory doesn't exist: /user/erip/f425a2c9-1007-487b-8488-d73d447c6f79 
関連する問題