Java 异构Hadoop集群HDFS中的数据放置和分发
我已经安装了带有5个异构节点的ApacheHadoop2.x,其中一个节点完全专用于NameNode 我正在使用下面的命令将输入文件放入Java 异构Hadoop集群HDFS中的数据放置和分发,java,hadoop,mapreduce,hdfs,bigdata,Java,Hadoop,Mapreduce,Hdfs,Bigdata,我已经安装了带有5个异构节点的ApacheHadoop2.x,其中一个节点完全专用于NameNode 我正在使用下面的命令将输入文件放入HDFS $ hdfs dfs -put /home/hduser/myspace/data /user/hduser/inputfile HDFS在三个DataNode(DN)上复制此输入文件,这意味着第四个DataNode没有输入块。如果我使用8个映射器(通过使用NLineInputFormat()方法设置拆分大小),那么这8个映射器将分配给所有4个DNs
HDFS
$ hdfs dfs -put /home/hduser/myspace/data /user/hduser/inputfile
HDFS
在三个DataNode(DN)
上复制此输入文件,这意味着第四个DataNode
没有输入块。如果我使用8个映射器(通过使用NLineInputFormat()
方法设置拆分大小),那么这8个映射器将分配给所有4个DNs。我想应该是这样。在这种情况下,来自其他DNs的数据块将移动到第四个DN,由分配给它的映射程序计算,这会增加总体执行时间
我的问题是:
我们无法在每个DN上放置数据块。您提到的HDFS将文件复制到3个DNs。只有当文件大小小于块大小时,这才是正确的。HDFS通过将文件划分为多个块来复制数据。因此,文件数据(块)很可能分布在所有4个DNs上。块的放置完全取决于hadoop,它将在内部管理块的放置,您只能通过 dfs.replication.factor 大小 dfs.block.size 完成你想要的 如果要检查块的放置,可以打开HDFS的Web UI,该UI是 名称节点:50070
然后浏览到此文件,它将显示所有节点之间的块位置。让我们有一个大小为40 mb的输入文件。当我们将其放入hdfs时,它将进入3个DNs(让DN1、DN2、DN3),那么如果我们使用4个映射器运行,那么在DN4上运行的映射器将如何获得输入?这是否意味着如果我想在DN4本地创建数据块,然后我必须将复制因子设为4?是的,这会对您有所帮助,或者一个奇怪的方法是停止一个Datanode,然后是dn4,并将数据放入其中,它肯定会在那里放置一个副本。