Hadoop对输入文件划分(InputFormat)

来源:互联网 发布:长岛的雪 知乎 编辑:程序博客网 时间:2024/04/28 18:13

适用Hadoop很长时间了,从最开始的入门级别的学习到源码的深入剖析,根据设计的还是够味道的。在作业的优化过程中,常常设计到map任务的问题。今天我们就来看看hadoop对原始数据是如何进行划分,最终形成一个一个map任务数据源的。

Hadoop提供了一个InputFormat类,从名字上看该类的作业时将输入格式的话,的确没错,基本上也就是这个意思。老外对类的命名还是很地道的。

InputFormat类描述了当前mapreduce作业的输入规范。mapreduce框架依靠该类主要完成了3件事:

(1)对输入作业进行校验

(2)将输入文件进行逻辑分片每个分片代表一个单独的mapper任务。首先要强调是逻辑分片,与HDFS中将文件分成Block块存储不同(这是物理分片),第二个每个分片代表一个单独的mapper任务,意思就是有多少个输入分片,就会有多少个mapper任务。

(3)提供了一个RecordReader类实现,将逻辑的输入分片的数据,转换成一条条记录。这个记录包含了我们经常使用的key和value

InputFormat的源码如下:

下面,我们看看具体是如何划分输入切片的。

InputFormat中有一个默认的抽象类FileInputFormat,该类实现了getSplit()方法。分片的大致思想如下:

(1)获取所有的文件,每一个文件有FileStatus表示

(2)对每一文件进行遍历,首先计算出输入切片大小,然后对该文件进行划分

(3)如果该文件使用了压缩算法,不可以划分,此时该文件将会作为一个输入片处理

核心代码如下:

以上是对输入数据进行划分切片具体实现,在切片的过程中可以重新覆盖isSplitable()方法,同时可以设置PathFilter方法,对文件进行过滤。本类中默认有PathFilter方法,对隐藏文件进行过滤。

 

 

 

 

1 0
原创粉丝点击