Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异构Hadoop集群HDFS中的数据放置和分发_Java_Hadoop_Mapreduce_Hdfs_Bigdata - Fatal编程技术网

Java 异构Hadoop集群HDFS中的数据放置和分发

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

我已经安装了带有5个异构节点的ApacheHadoop2.x,其中一个节点完全专用于NameNode

我正在使用下面的命令将输入文件放入
HDFS

$ hdfs dfs -put /home/hduser/myspace/data /user/hduser/inputfile
HDFS
在三个
DataNode(DN)
上复制此输入文件,这意味着第四个
DataNode
没有输入块。如果我使用8个映射器(通过使用
NLineInputFormat()
方法设置拆分大小),那么这8个映射器将分配给所有4个DNs。我想应该是这样。在这种情况下,来自其他DNs的数据块将移动到第四个DN,由分配给它的映射程序计算,这会增加总体执行时间

我的问题是:

  • 我们是否可以设法在每个DNs上放置数据块,这样就不需要为特定DN上的映射程序移动数据。它可以通过hdfs的“put”命令来完成吗

  • 同样在异构集群的情况下,我们可以根据节点的计算能力在不同的DNs上放置不同大小的数据吗


  • 我们无法在每个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,并将数据放入其中,它肯定会在那里放置一个副本。