Hadoop 从HDFS集群下载一个文件

Hadoop 从HDFS集群下载一个文件,hadoop,hdfs,microsoft-distributed-file-system,Hadoop,Hdfs,Microsoft Distributed File System,我正在开发一个将hdfs用作分布式文件存储的API。我制作了一个RESTAPI,允许服务器使用Webhdfs在HDFS集群中创建和删除mkdir、ls文件。但是既然Webhdfs不支持下载文件,那么有什么解决方案可以实现这一点呢。我的意思是,我有一个运行RESTAPI并与集群通信的服务器。我知道OPEN操作只支持读取文本文件内容,但是假设我有一个300 MB大小的文件,我如何从hdfs集群下载它呢。你们有什么可能的解决办法吗。?我曾考虑直接ping datanodes以获取文件,但此解决方案存在

我正在开发一个将hdfs用作分布式文件存储的API。我制作了一个RESTAPI,允许服务器使用Webhdfs在HDFS集群中创建和删除mkdir、ls文件。但是既然Webhdfs不支持下载文件,那么有什么解决方案可以实现这一点呢。我的意思是,我有一个运行RESTAPI并与集群通信的服务器。我知道OPEN操作只支持读取文本文件内容,但是假设我有一个300 MB大小的文件,我如何从hdfs集群下载它呢。你们有什么可能的解决办法吗。?我曾考虑直接ping datanodes以获取文件,但此解决方案存在缺陷,因为如果文件大小为300 MB,它将给我的代理服务器带来巨大的负载,因此有流式API来实现这一点。

我想到的一种方法是使用代理工作程序,它使用hadoop文件系统API读取文件,并创建一个本地普通文件。并提供该文件的下载链接。缺点是

  • 代理服务器的可伸缩性
  • 从理论上讲,文件可能太大,无法装入单个代理服务器的磁盘中

  • 作为替代方案,您可以使用DataNode API提供的
    streamFile

    wget http://$datanode:50075/streamFile/demofile.txt
    

    它不会读取整个文件,因此负担会很低。我已经试过了,但是在一个伪设置上,效果很好。您可以在完全分布式的设置上尝试一下,看看是否有帮助。

    没错,这是一个好主意,但可扩展性会有问题,所以我认为流式传输文件是一个好主意,流式传输是指将文件分块,然后发送给客户端。嗯,这看起来很有趣,让我试一试,我有一个问题,与我原来的问题非常不同,我想获取文件所在的数据节点,您认为我是如何获取的。最简单的方法是将您的web浏览器指向HDFS webUI,即“namemnode_machine:50070”。然后浏览到有问题的文件并单击打开它。向下滚动,您可以看到此文件的每个块的位置。嗯,这确实是一种简单的方法,但是否可以通过编程实现?您可以使用“FileSystem”提供的“getFileBlockLocations(FileStatus file,long start,long len)”。它返回一个包含主机名、偏移量和给定文件部分大小的数组。