如何在Hadoop中的Datanodes / Slavenodes之间分配数据?

时间:2017-03-24 08:40:35

标签: hadoop hdfs hadoop2 slave namenode

我在Hadoop中有一个由两台机器组成的多节点集群。 第一台机器(已配置的主机和从机)已运行名称节点和数据节点,第二台机器(已配置的从机)已运行数据节点。

我想几乎同样地在他们之间上传和分发数据?

我有两种情况:

首先:假设我的文件大小为500MB,我使用以下方式上传到第一台机器:

hadoop fs -put file1 hdfspath

是将它分为两​​个数据节点还是仅存储在第一台机器中?

当分发将发生时:是否在超过第一台机器中的块大小之后它将分发或有另一个标准。

每个数据节点的平均分配量是250mb吗?

第二次:假设我有250个文件,每个文件大小为2mb,我使用以下内容将包含dir1的文件夹上传到第一台机器:

hadoop fs -put dir1 hdfspath

同样的问题:数据是在两台机器中分发还是仅在第一台机器中分发。还有何时以及如何分发?

谢谢。

1 个答案:

答案 0 :(得分:1)

当我们将文件写入HDFS时,它被分成称为数据块的chucks,块的大小由hdfs-site.xml中的参数dfs.block.size控制(通常为128 MB)。每个块存储在一个/多个节点上,该节点由同一文件中的参数dfs.replication控制(默认值为3)。节点中块的每个副本称为副本。

完成它的方式: -

将数据写入HDFS文件时,首先将数据写入客户端的本地缓存。当缓存达到特定的thresold(块大小,默认为128 MB)时,客户端请求并从NameNode(维护元数据)中检索DataNode列表。此列表包含具有空间的DataNode,并且可以具有该块的副本。可以具有副本数据的DataNode的数量基于复制因子。然后,客户端在DataNodes之间创建一个管道以刷新数据。第一个DataNode开始接收数据(底层io.file.buffer.size为4kb,hadoop用于I / O操作),将缓冲的数据写入节点的本地目录,并将相同的缓冲数据传输到列表中的第二个DataNode 。第二个DataNode又开始接收数据块的缓冲数据,写入其本地目录,然后将相同的数据刷新到第三个DataNode。最后,第三个DataNode将数据写入其本地目录。

当第一个块被填满时,客户端请求从NameNode中选择新的DataNode来托管下一个块的副本。这个流程一直持续到文件的最后一个块。每个块的DataNode选择可能不同。