1

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

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

此外,“数据”文件夹可以包含“工作”目录中不存在的文件夹。那么最好的方法是什么?

感谢您的回答!

我想其中一种解决方案是使用FileUtil对象,但不确定如何使用它,因为我只初始化了一个文件系统 - HDFS。那么问题是我应该如何初始化我的本地FS?据我了解,当您有许多节点时使用此工具。但是我想要 - 使用本地 FS - 从 HDFS 复制到项目源。

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

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

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

2 回答 2

1

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

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

第2步。这是斯卡拉代码:

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()

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

我想在 HDFS 中运行 Step2 的代码后复制此目录下的所有文件:所有文件都将位于“127.0.0.1:9000/hdfsData/”

第4步。从 HDFS 复制到本地,只需将“copyFromLocalFile”更改为“copyToLocalFile”

于 2014-06-19T18:44:47.313 回答
0

如果您使用maven关于“没有用于方案的文件系统”异常来构建项目,我会遇到这样的问题,我的情况如下:

请检查您尝试运行的 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的依赖关系,则不是一种选择。

于 2013-08-31T17:59:54.200 回答