如何在 Hadoop 中的 Datanodes/Slavodes 之间分配数据?
Posted
技术标签:
【中文标题】如何在 Hadoop 中的 Datanodes/Slavodes 之间分配数据?【英文标题】:How to distribute data between Datanodes/Slavenodes in Hadoop? 【发布时间】:2017-03-24 08:40:35 【问题描述】:我在 Hadoop 中有一个由两台机器组成的多节点集群。 第一台机器(配置的主从机)运行名称节点和数据节点,第二台机器(配置的从机)运行数据节点。
我想在它们之间几乎平等地上传和分配数据?
我有两种情况:
首先:假设我有一个大小为 500MB 的文件 file1,我使用以下方式上传到第一台机器:
hadoop fs -put file1 hdfspath
它会被分成两个数据节点还是只存储在第一台机器上?
什么时候分配:是在超过第一台机器的块大小之后才分配还是有另一个标准。
每个datanode会平分250mb吗?
第二:假设我有 250 个文件,每个文件大小为 2mb,我将包含它们的文件夹 dir1 上传到第一台机器,使用:
hadoop fs -put dir1 hdfspath
同样的问题:数据是分布在两台机器上还是只分布在第一台机器上。以及何时以及如何分配?
谢谢。
【问题讨论】:
【参考方案1】:当我们将文件写入 HDFS 时,它被分成称为数据块的卡盘,块的大小由 hdfs-site.xml 中的参数 dfs.block.size 控制(通常为 128 MB)。每个块存储在一个/多个节点上,由同一文件中的参数 dfs.replication 控制(默认为 3)。节点中块的每个副本称为副本。
完成方式:-
将数据写入 HDFS 文件时,首先将数据写入客户端的本地缓存。当缓存达到某个阈值(块大小,默认 128 MB)时,客户端请求并从 NameNode(维护元数据)检索 DataNode 列表。这个列表包含有空间并且可以拥有该块副本的 DataNode。可以拥有副本数据的 DataNode 的数量基于复制因子。然后客户端在 DataNode 之间创建一个管道来刷新数据。第一个 DataNode 开始接收数据(底层 io.file.buffer.size 为 4kb ,hadoop 用于 I/O 操作),将缓冲的数据写入节点的本地目录,并将相同的缓冲数据传输到列表中的第二个 DataNode .第二个 DataNode 依次开始接收数据块的缓冲数据,写入其本地目录,然后将相同的数据刷新到第三个 DataNode。最后,第三个 DataNode 将数据写入其本地目录。
当第一个块被填满时,客户端请求从 NameNode 中选择新的 DataNode 来托管下一个块的副本。这个流程一直持续到文件的最后一个块。每个块的 DataNode 选择可能不同。
【讨论】:
感谢回复,我认为数据应该重新平衡,否则将全部存储在一个数据节点中。我读到我们应该使用:hdfs hdfs balancer。顺便说一句,如何在 Hadoop 的 Web 界面中查看每个节点上的数据,即那个 URL 是什么?以上是关于如何在 Hadoop 中的 Datanodes/Slavodes 之间分配数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Hadoop 中的 Datanodes/Slavodes 之间分配数据?
如何使用 Hadoop 中的 HadoopRpcRequestProto 请求字段对方法参数进行编码
如何在Windows中使用Eclipse访问虚拟机Linux系统中的hadoop
如何使用 Hadoop FS shell 将 hadoop 中的两个文件连接成一个文件?