java—将文件复制到hdfs时,如何控制该文件将驻留在哪些节点上?

uoifb46i  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(273)

我正在处理一个奇怪的用例,在这个用例中,我需要确保文件a是机器a的本地文件,文件b是机器b的本地文件,等等。当复制一个文件到hdfs时,有没有办法控制文件将驻留在哪些机器上?我知道任何给定的文件都将在三台机器上复制,但我需要能够说“文件a肯定存在于机器a上”。我并不关心其他两台机器——它们可能是我集群中的任何机器。
谢谢您。

1rhkuytd

1rhkuytd1#

我最近发现了这一点,可以解决您正在寻找的工作:控制hdfs块放置

oogrdqng

oogrdqng2#

我不这么认为,因为一般来说,当文件大于64mb(块大小)时,文件块的主副本将驻留在多个服务器上。

56lgkhnf

56lgkhnf3#

hdfs是一个分布式文件系统,hdfs是特定于集群(一台机器或许多机器)的,一旦文件在hdfs中,您就失去了下面的机器概念。而这种抽象正是它成为最佳用例的原因。如果文件大小大于复制块大小,则文件将被剪切为块大小,并且基于复制因子,这些块将被复制到集群中的其他计算机。那些街区是根据
在您的示例中,如果您有3个节点群集(+1个主名称节点),源文件大小为1 mb,复制大小为64mb,复制因子为3,则在构成1mb文件的所有3个节点中,您将有3个块副本,但是从hdfs的Angular 来看,您仍然只有1个文件。一旦文件复制到hdfs,就不会考虑机器因素,因为在机器级别没有文件,而是文件块。
如果你真的想确定,无论出于什么原因,你可以做的是设置复制因子为1,并有一个节点集群,这将保证你的奇怪的要求。
最后,您可以始终在hadoop集群中使用fsimage查看器工具查看文件块的位置。更多的细节在这里。

相关问题