将文件/块从 HDFS 复制到从节点的本地文件系统

Posted

技术标签:

【中文标题】将文件/块从 HDFS 复制到从节点的本地文件系统【英文标题】:Copy files/chunks from HDFS to local file system of slave nodes 【发布时间】:2015-09-13 05:45:36 【问题描述】:

在 Hadoop 中,我了解主节点(Namenode)负责将数据块存储在从机(Datanode)中。

当我们使用-copyToLocal-get时,从主节点,文件可以从HDFS复制到主节点的本地存储。从站有什么方法可以将存储在其中的块(数据)复制到他们自己的本地文件系统中?

例如,一个 128 MB 的文件可以在 2 个从节点之间拆分,每个从节点存储 64 MB。从站有什么方法可以识别并加载这个数据块到它的本地文件系统?如果是这样,如何以编程方式完成?在这种情况下也可以使用命令-copyToLocal-get 吗?请帮忙。

【问题讨论】:

slave 没有“本地”文件系统,只有一个 HDFS(hadoop 文件系统)构建了集群的所有节点。 @chomp 我说的是操作系统支持的文件系统。例如,如果每个从站都在 Linux 上运行,则与每个从站关联的本地文件系统将是一个 Linux 文件系统。所以我的问题是奴隶如何知道与他们一起存储的块并将它们复制到自己的文件系统中。 【参考方案1】:

简短回答:否

data/files 不能直接从Datandode 复制。原因是,Datanodes 存储数据,但它们没有任何有关存储文件的元数据信息。对他们来说,它们只是位和字节的块。文件的元数据存储在Namenode 中。此元数据包含有关文件的所有信息(名称、大小等)。除此之外,Namenode 会跟踪文件的哪些块存储在哪个Datanodes 上。当实际文件被拆分为多个块时,Datanodes 也不知道块的顺序。

【讨论】:

【参考方案2】:

在这种情况下也可以使用命令 -copyToLocal 或 -get 吗?

是的,您可以简单地从从站运行这些。然后从站将联系名称节点(如果您已正确配置它)并将数据下载到您的本地文件系统。

它不做的是“短路”副本,它只会在目录之间复制原始块。也不能保证它会从本地机器读取块,因为你的命令行客户端不知道它的位置。

【讨论】:

【参考方案3】:

HDFS 块仅存储在从属本地 FS 上。您可以挖掘在属性“dfs.datanode.dir”下定义的目录 但是您不会从直接读取块中获得任何好处(没有 HDFS API)。此外,读取和编辑块文件目录可能会损坏 HDFS 上的文件。

如果您想将数据存储在不同的本地从属设备上,那么您将必须实现维护块元数据的逻辑(已在 Namenode 中编写并为您执行)。

当 Hadoop 处理分布式数据面临的所有挑战时,您能否详细说明为什么要自己分发块?

【讨论】:

【参考方案4】:

您可以使用distcp 将特定文件或目录从一个从属服务器复制到另一个从属服务器

用法:distcp slave1address slave2address

【讨论】:

以上是关于将文件/块从 HDFS 复制到从节点的本地文件系统的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件从 HDFS 复制到本地文件系统

如何将文件从 S3 复制到 Amazon EMR HDFS?

将数据从hdfs加载到本地系统的有效方法?

使用文件系统将数据从scala中的本地复制到远程hdfs位置时,hadoop权限被拒绝

一文带你看懂大数据平台分布式文件系统HDFS

用于将目录从 hdfs 复制到本地的 Shell 脚本