【问题标题】:Download a file from HDFS cluster从 HDFS 集群下载文件
【发布时间】:2013-06-20 12:39:38
【问题描述】:

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

【问题讨论】:

    标签: hadoop hdfs


    【解决方案1】:

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

    1. 代理服务器的可扩展性
    2. 理论上文件可能太大而无法放入单个代理服务器的磁盘中。

    【讨论】:

    • 没错,这是个好主意,但可扩展性会有问题,所以我相信流式传输文件可能是个好主意,流式传输是指将文件分成块然后发送到客户。
    【解决方案2】:

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

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

    它不会读取整个文件,所以负担会很轻,恕我直言。我已经尝试过了,但是在伪设置上它工作正常。您可以在完全分布式的设置上试一试,看看是否有帮助。

    【讨论】:

    • 嗯,这看起来很有趣,让我试一试
    • 另外,我有一个问题,和我原来的问题很不一样,我想得到文件所在的数据节点,你猜我是怎么得到的。
    • 最简单的方法是将您的 Web 浏览器指向 HDFS WebUI,即“namemnode_machine:50070”..然后浏览到有问题的文件并单击打开它。向下滚动可以看到这个文件每个块的位置。
    • 嗯,这确实是一种简单的方法,但是否可以通过编程方式来实现?
    • 您可以使用“FileSystem”提供的“getFileBlockLocations(FileStatus file, long start, long len)”。它返回一个包含给定文件部分的主机名、偏移量和大小的数组。
    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多