我正在寻找一种从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
答案 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
依赖性,那么它就不是一种选择。