面向异构Hadoop集群的HDFS中的数据放置和分发

Posted

技术标签:

【中文标题】面向异构Hadoop集群的HDFS中的数据放置和分发【英文标题】:Data placement and distribution in HDFS for heterogeneous Hadoop cluster 【发布时间】:2015-10-12 14:44:52 【问题描述】:

我已经安装了Apache Hadoop 2.x 和 5 个异构节点,其中一个节点完全专用于 NameNode。

我正在使用以下命令将我的输入文件放入HDFS

$ hdfs dfs -put /home/hduser/myspace/data /user/hduser/inputfile

HDFS 在三个DataNodes (DN) 上复制此输入文件,这意味着第四个DataNode 没有输入块。如果我使用 8 个映射器(通过使用 NLineInputFormat() 方法设置拆分大小),那么这 8 个映射器将分配给所有 4 个 DN。我认为应该是。在这种情况下,来自其他 DN 的数据块将移动到第 4 个 DN,由分配给它的映射器计算,这会增加整体执行时间。

我的问题是:

    我们能否设法在每个 DN 上放置数据块,这样就无需为特定 DN 上的映射器移动数据。它可以通过hdfs的“put”命令来完成吗?

    同样在异构集群的情况下,我们可以根据节点的计算能力将不同大小的数据放在不同的DN上吗?

【问题讨论】:

【参考方案1】:

我们无法将数据块放置在每个 DN 上。您提到 HDFS 将文件复制到 3 个 DN。只有当您的文件大小小于块大小时,这才是正确的。 HDFS 通过将文件分成多个块来复制数据。因此,文件数据(块)分布在所有 4 个 DN 中的可能性更大。

【讨论】:

让我们有一个大小为 40 mb 的输入文件。当我们将其放入 hdfs 时,它会转到 3 个 DN(让 DN1、DN2、DN3),那么如果我们使用 4 个映射器运行,在 DN4 上运行的映射器将如何获得输入?【参考方案2】:

块的放置完全依赖于hadoop,它会在内部管理块的放置,你只能配置复制的数量

dfs.replication.factor

或按大小调整

dfs.block.size

块来完成你想要的。

如果你想检查块的位置,你可以打开 HDFS 的 Web UI

名称节点:50070

并浏览到此处的文件,它将显示所有节点之间的块位置。

【讨论】:

是否意味着如果我想在DN4本地制作数据块,那么我必须将复制因子设为4? 是的,它会对您有所帮助,或者一种奇怪的方法是停止除 dn4 之外的一个 Datanode 并放置数据,它肯定会在那里放置一个副本。

以上是关于面向异构Hadoop集群的HDFS中的数据放置和分发的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop之HDFS架构设计

DataX安装及基本使用

大数据系列文章-Hadoop的HDFS读写流程

大数据之Hadoop的HDFS存储优化—异构存储(冷热数据分离)

Mesos 上的独立 Spark 集群访问不同 Hadoop 集群中的 HDFS 数据

hadoop集群部署