Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
关于Hadoop/HDFS文件拆分_Hadoop_Mapreduce - Fatal编程技术网

关于Hadoop/HDFS文件拆分

关于Hadoop/HDFS文件拆分,hadoop,mapreduce,Hadoop,Mapreduce,我只想确认以下内容。请验证这是否正确: 1.根据我的理解,当我们将文件复制到HDFS中时,即文件(假设其大小>64MB=HDFS块大小)被分割为多个块,并且每个块存储在不同的数据节点上 当文件复制到HDFS中时,文件内容已被分割成块,并且在运行映射作业时不会发生该文件分割。映射任务的调度方式只能使其在最大大小为64 MB且具有数据位置的每个块上工作(即,映射任务在包含数据/块的节点上运行) 如果文件被压缩(gzip),也会发生文件拆分,但MR确保每个文件仅由一个映射器处理,即MR将收集位于其他数

我只想确认以下内容。请验证这是否正确: 1.根据我的理解,当我们将文件复制到HDFS中时,即文件(假设其大小>64MB=HDFS块大小)被分割为多个块,并且每个块存储在不同的数据节点上

  • 当文件复制到HDFS中时,文件内容已被分割成块,并且在运行映射作业时不会发生该文件分割。映射任务的调度方式只能使其在最大大小为64 MB且具有数据位置的每个块上工作(即,映射任务在包含数据/块的节点上运行)

  • 如果文件被压缩(gzip),也会发生文件拆分,但MR确保每个文件仅由一个映射器处理,即MR将收集位于其他数据节点的gzip文件的所有块,并将它们全部提供给单个映射器

  • 如果我们将isSplitable()定义为返回false,则会发生与上述相同的情况,即一台计算机上运行的一个映射程序将处理一个文件的所有块。MR将从不同的数据节点读取文件的所有块,并使它们可供单个映射器使用


  • 你的理解并不理想。 我想指出,有两个几乎独立的过程:将文件拆分为HDFS块,以及拆分文件以供不同的映射程序处理
    HDFS根据定义的块大小将文件拆分为块。
    每种输入格式都有自己的逻辑,即如何将文件分割成不同的部分,以便由不同的映射器进行独立处理。FileInputFormat的默认逻辑是按HDFS块分割文件。您可以实现任何其他逻辑

    压缩,通常是分裂的敌人,所以我们使用块压缩技术来实现压缩数据的分裂。这意味着文件(块)的每个逻辑部分都是独立压缩的。

    是的,当文件复制到HDFS中时,文件内容被分割成块。块大小是可配置的,如果是128MB,那么整个128MB就是一个块,不是两个64 MB的块。也不必将文件的每个块存储在单独的datanode上。一个datanode可能有一个以上的特定文件块。根据复制系数,一个特定块可能存在于多个datanode中。

    David的回答非常准确,我只是在这里详细说明一下

    这里有两个不同的概念,每个概念都由hadoop框架中的不同实体处理

    首先——

    1) 将文件划分为块——将文件写入HDFS时,HDFS将文件划分为块并负责其复制。此操作只执行一次(大部分),然后可用于集群上运行的所有MR作业。这是群集范围的配置

    其次——

    2) 将文件拆分为输入拆分——将输入路径传递到MR作业时,MR作业使用该路径以及配置为将输入路径中指定的文件拆分为拆分的输入格式,每个拆分由映射任务处理。每次执行作业时,输入格式都会计算输入拆分

    现在,一旦我们掌握了这一点,我们就可以理解isSplitable()方法属于第二类

    要真正解决这个问题,请看一看HDFS写数据流(概念1)

    图中的第二点可能是拆分发生的位置,请注意,这与MR作业的运行无关

    现在看一下MR作业的执行步骤

    这里的第一步是通过为作业配置的inputformat计算输入拆分


    你的很多困惑都源于你对这两个概念都不了解,我希望这能让你的问题更清楚一些。

    一个更具描述性的标题将是你问题的一个值得欢迎的改进。你好,大卫,谢谢你的澄清。如果我的文件是128 MB。我猜在这种情况下,HDFS将继续将其拆分为两个块,每个块大小为64MB(假设HDFS块大小=64MB)。这些可能存储在不同的机器上。现在,如果我使用我自己的FileInputFormat,它只是扩展了TextInputFormat并在“isSplitable()”中返回false,那么会有什么行为,即只有一个映射器将接收两个输入块(即,只有一个映射器处理整个文件),还是有两个映射器分别处理一个文件块。我在这里感到困惑,我想尝试一下,但不知何故,我的自定义输入格式正在编译,但没有在测试设置上运行。如果isSplitable返回false-文件将由一个映射程序处理,而不管块的数量。有点困惑。如果mapreducer作业的输入是一个文件,并且它位于存储设备上(而不是HDFS上)。现在,我有以下疑问,请帮助澄清。1.在触发MR作业之前,HDFS会首先拆分为HDFS块吗?因为输入数据在存储设备上,但不在HDFS上?2.如果对第一个问题的回答为“否”,则recordreader是否会在运行时从存储设备读取此文件的内容,并将其交给mapper?请仔细阅读问题-您的答案与topicmay无关?我可以以什么方式询问?标题本身写着-Hadoop/HDFS文件拆分。我同意这没有大卫的回答好。但是我没有发现任何与主题无关的东西。请让我知道,这样我就不会重蹈覆辙了。谢谢。我认为答案是好的;博士我投了一票。谢谢数据复制是否在初始数据写入/分发期间发生?或者数据首先分布在DataNodes上,然后根据Apache官方指南1中的NameNode post data write命令进行复制。“复制系数可以在文件创建时指定,以后可以更改。”2。“NameNode做出有关块复制的所有决策。”因此