关于Hadoop/HDFS文件拆分

sun*_*llp 17 hadoop mapreduce

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

  1. 将文件复制到HDFS时文件内容已经拆分为块,并且在运行map作业时不会发生文件拆分.映射任务仅按照它们在每个最大块上工作的方式进行调度.大小为64 MB,具有数据位置(即映射任务在包含数据/块的节点上运行)

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

  3. 如果我们定义isSplitable()以返回false,则会发生与上述相同的事情,即文件的所有块将由在一台机器上运行的一个映射器处理.MR将从不同的数据节点读取文件的所有块,并将它们提供给单个映射器.

Sud*_*han 39

大卫的答案几乎击中了它的头,我只是在这里详细阐述.

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

首先 -

1)将文件分成块 - 当文件写入HDFS时,HDFS将文件分成块并负责其复制.这一次(大部分)完成,然后可用于群集上运行的所有MR作业.这是群集范围的配置

其次 -

2)将文件拆分为输入拆分 - 当输入路径传递到MR作业时,MR作业使用路径以及配置的输入格式将输入路径中指定的文件划分为拆分,每个拆分由一个处理地图任务.每次执行作业时,输入分割的计算都由输入格式完成

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

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

HDFS写入数据流

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

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

先生

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

很多你的困惑源于你正在扼杀这两个概念,我希望这会使它更清晰一点.


Dav*_*man 15

你的理解并不理想.我要指出的是,有两个几乎独立的过程:将文件拆分为HDFS块,并拆分文件以供不同的映射器处理.
HDFS根据定义的块大小将文件拆分为块.
每种输入格式都有自己的逻辑,如何将文件拆分成不同的映射器进行独立处理.FileInputFormat的默认逻辑是按HDFS块拆分文件.您可以实现任何其他逻辑
压缩,通常是分裂的敌人,因此我们采用块压缩技术来分割压缩数据.这意味着文件(块)的每个逻辑部分都是独立压缩的.

  • 嗨大卫,谢谢你的澄清.如果我的文件假设说128 MB.我想在这种情况下,HDFS将把它分成两个块,每块大小为64 MB(假设HDFS块大小= 64 MB).这些可以存储在不同的机器上.现在如果我使用我自己的FileInputFormat只扩展TextInputFormat并在"isSplitable()"中返回false,那么行为是什么,即只有一个mapper将接收两个输入块(即整个文件只由一个mapper处理)或者将有两个映射器处理一个文件块. (2认同)
  • 如果isSplitable返回false - 文件将由一个映射器处理,而不管块的数量. (2认同)