Hadoop中的InputFormat接口:
InputFormat接口主要的任务是对输入的原始数据进行切分并转换成<K,V>格式的数据,它主要完成两个功能:
1.通过getSplite()方法对原始数据进行切分,得到若干个InputSplite,这里的切分是指逻辑上的切分,即确定每个Splite的起始地址和长度而并没有在物理上进行划分;
2.通过getRecordReader ()方法将每一个InputSplite解析为<K,V>格式的数据并返回一个RecordReader对象,map()根据该对象逐一的读取记录进行处理;
FileInputFormat类
在继承了InputFormat接口的若干个类中,最常用的是FileInputFormat类,它主要实现了一个统一的文件切块方法,getSplite()方法,该方法主要完成两个功能:
1.计算每个Splite块的大小SpliteSize,在老版的HadoopAPI中,这个数值与三个参数有关:minSize:由配置文件所设置的最小块,默认为1;goalSize:用文件总大小除以用户设定的map数得到的值;blockSize:文件的物理存储块大小,默认为64MB;这样SpliteSize的计算公式为:
SpliteSize=max{minSize,min{goalSize,blockSize}};
在新版的API中,用maxSize这一参数取代了goalSize参数,maxSize与minSize一样,也由配置文件确定,这样分块的大小就与map数无关。
2.确定host,在确定了SpliteSize的大小之后,需要确定每个Splite的元数据,格式是<file,start,length,host>,其中host最难确定,它与文件本地化息息相关,Hadoop把文件本地化的程度分成三个层次:本节点,本机架,其他机架。它采用一个很简单的启发式算法在确定Host,Hadoop先依据数据量的多少对所有的机架(rack)进行排序,然后对每个机架上的节点依据同样的规则进行排序,最后选择排名前N的节点作为Host,N是每个文件的副本数。
TextInputFormat与SequenceInputFormat
这两个类都继承自FileInputStream,他们在FileInputStream实现了getSplite方法的基础上,又各自实现了自己的getRecordReader方法。其中TextInputFormat所实现的规则是:对一个InputSplite数据,以每一行做一个划分点,以该行的内容作为value,而以该行的起始地址相对于整个文件首地址的偏移量作为KEY,这样得到的结果就是<k,v>形式数据。
InputFormat接口主要的任务是对输入的原始数据进行切分并转换成<K,V>格式的数据,它主要完成两个功能:
1.通过getSplite()方法对原始数据进行切分,得到若干个InputSplite,这里的切分是指逻辑上的切分,即确定每个Splite的起始地址和长度而并没有在物理上进行划分;
2.通过getRecordReader ()方法将每一个InputSplite解析为<K,V>格式的数据并返回一个RecordReader对象,map()根据该对象逐一的读取记录进行处理;
FileInputFormat类
在继承了InputFormat接口的若干个类中,最常用的是FileInputFormat类,它主要实现了一个统一的文件切块方法,getSplite()方法,该方法主要完成两个功能:
1.计算每个Splite块的大小SpliteSize,在老版的HadoopAPI中,这个数值与三个参数有关:minSize:由配置文件所设置的最小块,默认为1;goalSize:用文件总大小除以用户设定的map数得到的值;blockSize:文件的物理存储块大小,默认为64MB;这样SpliteSize的计算公式为:
SpliteSize=max{minSize,min{goalSize,blockSize}};
在新版的API中,用maxSize这一参数取代了goalSize参数,maxSize与minSize一样,也由配置文件确定,这样分块的大小就与map数无关。
2.确定host,在确定了SpliteSize的大小之后,需要确定每个Splite的元数据,格式是<file,start,length,host>,其中host最难确定,它与文件本地化息息相关,Hadoop把文件本地化的程度分成三个层次:本节点,本机架,其他机架。它采用一个很简单的启发式算法在确定Host,Hadoop先依据数据量的多少对所有的机架(rack)进行排序,然后对每个机架上的节点依据同样的规则进行排序,最后选择排名前N的节点作为Host,N是每个文件的副本数。
TextInputFormat与SequenceInputFormat
这两个类都继承自FileInputStream,他们在FileInputStream实现了getSplite方法的基础上,又各自实现了自己的getRecordReader方法。其中TextInputFormat所实现的规则是:对一个InputSplite数据,以每一行做一个划分点,以该行的内容作为value,而以该行的起始地址相对于整个文件首地址的偏移量作为KEY,这样得到的结果就是<k,v>形式数据。