Hadoop学习笔记之<输入格式>

来源:互联网 发布:电脑软件快捷键冲突 编辑:程序博客网 时间:2024/05/18 09:14

从一般的文本文件到数据库,Hadoop可以处理很多不同类型的数据格式。

输入分片与记录

一个输入分片(split)就是由单个map处理的输入块。每一个map操作之处理一个输入分片。每个分片被划分为若干个记录,每条记录就是一个键值对,map一个接一个地处理每条记录。输入分片和记录都是逻辑的,不必将它们对应到文件,虽然常见的形式都是文件。在数据库场景中,一个输入分片可以对应于一个表上的若干行,而一条记录对应到一行。


输入分片在java中被表示为InputSplit接口,InputSplit包含一个以字节为单位的长度和一组存储位置。注意,一个分片并不包含数据本身,而是指向数据的引用。存储位置供MapReduce系统使用以便将map任务尽量放在分片数据附近,而长度用来排序分片,以便优先处理最大的分片,从而最小化作业运行时间。


MapReduce应用开发人员并不需要直接处理InputSplit,因为它是由InputFormat创建的。InputFormat负责产生输入分片并将它们分割成记录。在我们探讨InputForm的具体例子之前,先来简单看一下它在MapReduce中的用法。接口如下:


public abstract class InputFormat<K, V> {

  public abstract
    List<InputSplit> getSplits(JobContext context
                               ) throws IOException, InterruptedException;

  public abstract
    RecordReader<K,V> createRecordReader(InputSplit split,
                                         TaskAttemptContext context
                                        ) throws IOException,
                                                 InterruptedException;
}

getSplits用来获取由输入文件计算出来的InputSplits,我们在后面会看到计算InputSplits的时候会考虑到输入文件是否可分割、文件存储时分块的大小和文件大小等因素;而createRecordReader()提供了前面第三点所说的RecordReader的实现,以将K-V对从InputSplit中正确读出来,比如LineRecordReader就以偏移值为key,一行的数据为value,这就使得所有其createRecordReader()返回了LineRecordReader的InputFormat都是以偏移值为key,一行数据为value的形式读取输入分片的。在tasktracker上,map任务把输入分片传给InputFormat的createRecordReder()方法来获得这个分片的RecordReader,map任务用一个RecordReader来生成记录的键值对,然后在传递给map函数。(即在map函数被调用前会有一些过程,显示map任务启动setup,接着获得键值对给map函数)


也就是在main函数中指定setInputFormatClass(TextInputFormat.class),其中TextInputFormat是InputFormat的实现,自己也可以编代码实现(一般继承自FileInputFormat,重写createRecordReader方法),然后框架会自动调用getSplits方法和createRecordReader()方法返回键值对给map函数调用。


FileInputFormat是所有使用文件作为其数据源的InputFormat实现的基类。它提供了两个功能:一个定义那些文件包含在一个作业的输入中;一个为输入文件生成分片的实现。把分片分割成记录的作业由其子类来完成。

给定一组文件,FileInputFormat是如何把它们转换成输入分片的呢?FileInputFormat只分割大文件。,这里的大指的是超过HDFS块的大小。分片通常与HDFS块大小一样。


避免切分:有些应用程序可能不希望文件被切分,而是用一个Mapper完整处理每一个输入文件。可以重载FileInputFormat的isSplitable()方法,把返回值设为false,那么map任务就会只有一个。


TextInputFormat是默认的InputFormat。每条记录是一行输入。键是LongWritable类型,存储该行在整个文件中的字节偏移量。值是这行的内容,不包括任何行终止符,它是Text类型的。




0 0
原创粉丝点击