MapRduce中的输入格式化

1. InputFormat接口

InputFormat接口包含了两个抽象方法:getSplits()和creatRecordReader()。InputFormat决定了Hadoop如何对文件进行分片和接收, 它能够从一个 job 中得到一个 split 集合(InputSplit[]),然后再为这个 split 集合配上一个合适的 RecordReader(getRecordReader)来读取每个split中的数据。InputFormat接口的实现细节如下。

public abstract class Inputformat<K,V> {

public abstract List<InputSplit> getSplits(JobContext context);        
public abstract RecordReader<K, V>creatRecordReader(InputSplit split, TaskAttemptContext context);

}
2. InputFormat接口实现类层次结构
在这里插入图片描述

InputFormat接口的实现类有很多,其结构层次如下。

  1. FileInputformat输入路径设置

FileInputformat为MapReduce中文件输入格式实现类的基类,其作用主要是指定输入文件路径,它提供了四种静态方法来指定输入路径。

 public static void addInputPath(Job job, Path path);

  public static void addInputPaths(Job job, String commaSeparatedPaths);

  public static void setInputPaths(Job job, Path inputPaths);

  public static void setInputPaths(Job job, String commaSeparatedPaths);

实例如下:
  FileInputFormat.addInputPath(job, newPath("Path1")); //设置一个源路径
 
  FileInputFormat.addInputPaths(job," Path1, Path2,..."); //设置多个源路径,多个源路径之间用逗号分开
 
  FileInputFormat.setInputPaths(job,new Path(“path1”), new Path(“path2”),); //可以包含多个源路径,
 
  FileInputFormat.setInputPaths(job,”Path1”,” Path2,..."); //设置多个源路径,多个源路径之间用逗号分开
  1. FileInputformat子类

这里我们介绍几种常用的文件类型的输入格式:TextInputformat,KeyValueTextInputformat,NLineInputformat和SequenceFileInputFormat。

4.1 TextInputformat

TextInputformat是一种文本输入格式,它也是MapReduce默认的输入格式。TextInputformat将每条记录作为一行输入,其键值是LongWritable 类型,存储该行在整个文件中的字节偏移量。 值是这行的内容,不包括任何行终止符(换行符合回车符),它们被打包成一个 Text 对象。

    以下是一个示例,比如,一个分片包含了如下4条文本记录。

	 Rich learning form

   Intelligent learning engine

   Learning more convenient

   From the real demand for more close to the enterprise

每条记录表示为以下键/值对:

(0,Rich learning form)

(19,Intelligent learning engine)

(47,Learning more convenient)

(72,From the real demand for more close to the enterprise)

很明显,键并不是行号。一般情况下,很难取得行号,因为文件按字节而不是按行切分为分片。

4.2 KeyValueTextInputformat

KeyValueTextInputformat为键值对文本输入格式。每一行均为一条记录,被分隔符(缺省是tab(\t))分割为key(Text),value(Text)。

    以下是一个示例,输入是一个包含4条记录的分片。其中——>表示一个(水平方向的)制表符,即tab键。
    line1 ——>Rich learning form

   line2 ——>Intelligent learning engine

   line3 ——>Learning more convenient

   line4 ——>From the real demand for more close to the enterprise

每条记录表示为以下键/值对:

(line1,Rich learning form)

(line2,Intelligent learning engine)

(line3,Learning more convenient)

(line4,From the real demand for more close to the enterprise)

此时的键是每行排在制表符之前的Text序列。

4.3 NLineInputformat

NLineInputformat为多行输入格式。

分别使用 TextInputFormat 和 KeyValueTextInputFormat输入格式时,每个 Mapper 收到的输入行数是不同的,其中的行数取决于输入分片的大小和行的长度。如果希望 Mapper 收到固定行数的输入,需要使用 NLineInputFormat 输入格式。与 TextInputFormat 一样, 键是文件中行的字节偏移量,值是行本身。N 是每个 Mapper 收到的输入行数。N 设置为1(默认值)时,每个 Mapper 正好收到一行输入。

   以下是一个示例,仍然以上面的4行输入为例。

 	  Rich learning form

   Intelligent learning engine

   Learning more convenient

   From the real demand for more close to the enterprise   

例如,如果 N 是2,则每个输入分片包含两行。一个 mapper 收到前两行键值对:

(0,Rich learning form)
   (19,Intelligent learning engine)

另一个 mapper 则收到后两行:

(47,Learning more convenient)
  (72,From the real demand for more close to the enterprise)
 这里的键和值与 TextInputFormat 生成的一样。

4.4 SequenceFileInputFormat

SequenceFileInputFormat为序列化的文件输入格式,用于读取sequence file。序列文件为Hadoop专用的压缩二进制文件格式,它专用于一个MapReduce作业和其他MapReduce作业之间的传送数据,使用于多个MapReduce作业之间的链接操作。

4.5CombineTextInputFormat
针对小文件处理的一种格式,为了避免每个小文件对应一个split,
导致过多的maptask产生,且每个maptask中执行的内容特别少。

  • 对于输入的路径下的所有文件进行切片
  • 切片必须在同一个范围内进行,不能越界
  • 一个切片的数据可以来自于同一个范围的不同的文件的块
    关于maxSplitSize
  • 如果指定这个值先在当前节点进行切片,如果有剩余在同机架下进行合并
  • 如果没有指定这个值同机架下的所有数据都在一个单独切片中
  • 这个值等于block块大小与正常的切片机制保持一致

如果设置了最大切片大小,切片规则

1

  1. 虚拟存储过程
    a.按输入目录下文件的顺序读取文件大小
    b.每个文件大小与最大容量比较
    1) 小于:直接保留
    2) 大于1倍小于2倍:均分
    3) 大于2倍:先按最大容量切,剩余部分继续比较。
  2. 切片
    a.按照虚拟存储拆分的顺序合并
    b.每一部分大小与最大容量比较
    1) 小于:与后面相加,直到大于最大容量
    2) 大于或等于:直接保留
    3) 最后一部分小于最大容量,自成一个split

如何自定义Inputformat

有时候 Hadoop 自带的输入格式,并不能完全满足业务的需求,所以需要我们根据实际情况自定义 InputFormat 类。而数据源一般都是文件数据,那么自定义 InputFormat时继承 FileInputFormat 类会更为方便,从而不必考虑如何分片等复杂操作。 自定义输入格式我们分为以下几步:

    1)继承 FileInputFormat 基类。

    2)重写 FileInputFormat 里面的 isSplitable() 方法。

    3)重写 FileInputFormat 里面的 createRecordReader()方法。

————————————————
版权声明:本文为CSDN博主「努力的凹凸曼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/py_123456/article/details/79766573

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值