面向异构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存储优化—异构存储(冷热数据分离)