我在hadoop中有一个由两台机器组成的多节点集群。第一台机器(配置的主设备和从设备)运行名称节点和数据节点,第二台机器(配置的从设备)运行数据节点。
我想上传和分发他们之间的数据几乎平等?
我有两种情况:
首先:假设我有一个500mb大小的文件file1,并且我使用以下方法将其上载到第一台计算机:
hadoop fs -put file1 hdfspath
它将被分成两个数据节点还是只存储在第一台机器中?
何时分配:是在超过第一台机器中的块大小之后分配,还是有其他标准。
每个数据节点平均分配250mb吗?
第二:假设我有250个文件,每个文件大小为2mb,我使用以下方法将包含这些文件的文件夹dir1上载到第一台计算机:
hadoop fs -put dir1 hdfspath
同样的问题:数据是在两台机器上分发还是只在第一台机器上分发。以及何时以及如何进行分配?
谢谢您。
1条答案
按热度按时间jq6vz3qz1#
当我们将一个文件写入hdfs时,它被分成称为数据块的卡盘,块的大小由hdfs-site.xml中的参数dfs.block.size控制(通常为128 mb)。每个块存储在一个或多个节点上,由同一文件中的参数dfs.replication控制(默认值为3)。节点中块的每个副本称为副本。
方法:
将数据写入hdfs文件时,首先将数据写入客户端的本地缓存。当缓存达到一定的thresold(块大小,默认128 mb)时,客户机请求并从namenode(维护元数据)检索datanode列表。此列表包含具有空间并且可以具有该块副本的数据节点。可以拥有副本数据的数据节点数基于复制因子。然后,客户机在datanodes之间创建一个管道来刷新数据。第一个datanode开始接收数据(基础io.file.buffer.size为4kb,hadoop用于i/o操作),将缓冲数据写入节点的本地目录,并将相同的缓冲数据传输到列表中的第二个datanode。第二个datanode依次开始接收数据块的缓冲数据,写入其本地dir,然后将相同的数据刷新到第三个datanode。最后,第三个datanode将数据写入其本地dir。
当第一个块被填满时,客户机请求从namenode中选择新的datanodes来承载下一个块的副本。此流一直持续到文件的最后一个块。每个块的数据节点选择可能不同。