将包含HDFS内容的目录复制到本地文件系统

时间:2013-03-11 10:23:49

标签: java scala hadoop hdfs

我正在寻找一种从HDFS复制整个目录的最佳方法,其中包含所有内容。类似的东西:

Path srcPath = new Path("hdfs://localhost:9000/user/britva/data");
Path dstPath = new Path("/home/britva/Work");
fs.copyToLocal(false, srcPath, dstPath);

此外,“data”文件夹可以包含“Work”目录中不存在的文件夹。那么这样做的最佳方式是什么?

感谢您的回答!

我认为其中一个解决方案是使用FileUtil对象,但不知道如何使用它,因为我只初始化了一个文件系统 - HDFS。那么问题是我应该如何初始化我的本地FS?据我所知,当你有很多节点时会使用这个util。但我想要的是 - 与本地FS合作 - 从HDFS复制到项目源。

另外,因为我正在使用Play!框架,使用它的路径会很棒,比如Play.application.path + "/public/stuff"

如果我正在尝试使用上面的代码,它会说:

java.io.IOException: No FileSystem for scheme: file

2 个答案:

答案 0 :(得分:1)

我使用scala,所以这里是scala示例,类似于java。

步骤1。确保您的hdfs处于活动状态。对于本地,只需尝试打开127.0.0.1:50070

第二步。这是scala代码:

val hdfsConfig = new Configuration
val hdfsURI = "127.0.0.1:9000"
val hdfs = FileSystem.get(new URI(hdfsURI), hdfsConfig)
val targetPath = new Path("127.0.0.1:9000/hdfsData")
if (hdfs.exists(targetPath)) {
  hdfs.delete(targetPath, true)
}
val oriPath = new Path(#your_local_file_path)
hdfs.copyFromLocalFile(oriPath, new Path(hdfsURI+"/"))
hdfs.close()

步骤3。例如:我的本地文件路径是:/ tmp / hdfsData

我想在HDFS中运行Step2'代码之后复制此目录下的所有文件:所有文件都将打开" 127.0.0.1:9000 / hdfsData /"

步骤4。从HDFS复制到本地,只需更改" copyFromLocalFile" to" copyToLocalFile"

答案 1 :(得分:0)

如果使用maven构建项目关于“No FileSystem for scheme”异常,我遇到了类似的问题,我的案例如下:

请检查您尝试运行的JAR的内容。特别是META-INFO/services目录,文件org.apache.hadoop.fs.FileSystem。应该有filsystem实现类列表。检查行org.apache.hadoop.hdfs.DistributedFileSystem出现在HDFS列表中,org.apache.hadoop.fs.LocalFileSystem出现在本地文件方案中。

如果是这种情况,则必须在构建期间覆盖引用的资源。

其他可能性是你的类路径中没有hadoop-hdfs.jar,但这种可能性很小。通常,如果您具有正确的hadoop-client依赖性,那么它就不是一种选择。