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

Java 将文件复制到HDFS时,如何控制该文件将驻留在哪些节点上?,java,linux,hadoop,mapreduce,hdfs,Java,Linux,Hadoop,Mapreduce,Hdfs,我正在处理一种奇怪的用例,我需要确保文件a对机器a是本地的,文件B对机器B是本地的,等等。当将文件复制到HDFS时,有没有办法控制该文件将驻留在哪些机器上?我知道任何给定的文件都将在三台机器上复制,但我需要能够说“文件A肯定会存在于机器A上”。我真的不在乎其他两台机器——它们可能是我集群中的任何机器 谢谢。我不这么认为,因为通常当文件大于64MB(块大小)时,文件块的主副本将驻留在多台服务器上 HDFS是一个分布式文件系统,HDFS是特定于集群(一台或多台机器)的,一旦文件位于HDFS,下面的机

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


谢谢。

我不这么认为,因为通常当文件大于64MB(块大小)时,文件块的主副本将驻留在多台服务器上

HDFS是一个分布式文件系统,HDFS是特定于集群(一台或多台机器)的,一旦文件位于HDFS,下面的机器概念就不复存在了。这种抽象使它成为最好的用例。如果文件大小大于复制块大小,则文件将被剪切为块大小,并基于复制因子,这些块将复制到群集中的其他计算机。这些区块是根据地形移动的

在您的情况下,如果有3个节点群集(+1个主名称节点),源文件大小为1MB,复制大小为64MB,复制系数为3,则在所有3个节点中都有3个块副本,构成1MB文件,但从HDFS的角度来看,您仍然只有1个文件。一旦文件复制到HDFS,您就不会考虑机器因素,因为在机器级没有文件,它是文件块。 如果您真的想确保出于任何原因,您可以做的是将复制因子设置为1,并拥有1个节点群集,这将保证您的奇怪需求


最后,您可以始终在Hadoop集群中使用FSimage viewer工具查看文件块的位置。更多详情请参阅

我最近发现,这可能解决了您需要做的事情:

可以在配置设置中轻松修改块大小,这不是一个障碍。此外,这些文件很小,概念上小于1MBI,如果数据可以驻留在多个服务器上,人们不太可能不关心添加这样的选项。考虑到这一要求,您在HDFS上的总体架构可能不正确。请记住,文件不会转到节点,而块会转到节点。但是,对于(非常)小的群集,您可以使用机架感知和复制因子。也就是说,确保每一个模块都连接到每一台机器上。在任何情况下,我都看不出有多大的优势,也许更深入地揭示您的用例可以让我们获得更好的见解来帮助您。