0

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

我想几乎平等地上传和分配它们之间的数据?

我有两种情况:

首先:假设我有一个大小为 500MB 的文件 file1,我使用以下命令上传到第一台机器:

hadoop fs -put file1 hdfspath

它会被分成两个数据节点还是只存储在第一台机器上?

何时分配:是在超过第一台机器的块大小之后才分配还是有其他标准。

每个datanode会平均分配250mb吗?


第二:假设我有 250 个文件,每个文件大小为 2mb,并且我使用以下命令将包含它们的文件夹 dir1 上传到第一台机器:

hadoop fs -put dir1 hdfspath

同样的问题:数据是分布在两台机器上还是只分布在第一台机器上。还有何时以及如何分配?

谢谢你。

4

1 回答 1

1

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

完成方式:-

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

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

于 2017-03-24T11:00:31.063 回答