java—将包含内容的目录从hdfs复制到本地文件系统

c8ib6hqw  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(591)

我正在寻找一个最好的方法来复制整个目录从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.application.path + "/public/stuff" .
如果我尝试使用上面的代码,它会说:

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

qf9go6mv1#

我使用scala,所以这里有一个类似于java的scala示例。
第一步。确保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()

第三步。例如:我的本地文件路径是:/tmp/hdfsdata
在运行step2的代码之后,我想在hdfs中复制这个目录下的所有文件:所有文件都将位于“127.0.0.1:9000/hdfsdata/”
第四步。要从hdfs复制到本地,只需将“copyfromlocalfile”更改为“copytolocalfile”

fsi0uk1n

fsi0uk1n2#

如果您使用 maven 关于“方案无文件系统”例外,我有这样的问题,我的情况如下:
请检查您要运行的jar的内容。尤其是 META-INFO/services 目录,文件 org.apache.hadoop.fs.FileSystem . 应该有系统实现类的列表。支票行 org.apache.hadoop.hdfs.DistributedFileSystem 在hdfs和 org.apache.hadoop.fs.LocalFileSystem 对于本地文件方案。
如果是这种情况,则必须在生成期间重写引用的资源。
另一种可能是你根本没有 hadoop-hdfs.jar 但是这种可能性很低。通常如果你有正确的答案 hadoop-client 它不是一个选项。

相关问题