从今天开始重新从头学习Hadoop,并每章写读书笔记一篇,记于次。
这篇笔记将主要概括mapreduce的基本原理和输入输出类。
1. Hadoop数据类型。
在Mapreduce中,key必须为实现了WritableComparable<T>的类,值则至少实现writable<T>接口,其中,writableComparable《T》为writable和java.lang.comparable《T》的合体。
在hadoop中,hadoop已经实现了几个可以用作value的类,这些类均实现了WritableComparable<T>接口,所有的基本类型都有相对应得包装类。如BooleanWritable,DoubleWwritable等,另外还有用于Text的Text类。
同时,也可以实现自己的writable类,通过实现相应接口,实现writableComparable接口主要实现以下三个方法。
public void readFields(DataInput In);
public void write();
public compareTo(T);
2. Mapper
得到相应的数据后,即可开始第一步Mapper,Mapper必须实现Mapper接口并继承MapreduceBase类。 MapreduceBase类是mapper和reducer的共同父类,主要包括两个方法,void configure(JobConf job)及void close.即构造方法和销毁方法.
Mapper接口主要负责数据的处理,在这个接口中只有一个方法。
void map(k1 key,V1 value,OutputCollector<k2,v2 output,Reporter reporter>){
}
其中K1,V1为输入,outputcollector搜集mapper的输出,reporter用来记录额外的信息。
3. Reducer
reducer的任务是将从mapper的输出作为输入,将拥有相同key的value结合起来作为输入,然后在经过reduce的过程,尽可能的得到key3,Value3的输出。所以在reducer接口中,与mapper接口相似,reducer也只有一个方法。
void reduce(k2 key, Iterator<v2> values,OutputCollector<k3,v3> output, reporter reporter} throws exception.
4. Partitioner
当数据从map中输出时,在有多个reducer的情况下,系统需要决定怎样分配这些键值对,这些过程是由partitoner完成的,partition默认的是用hash的方法,不过可以自定义。
5. Combiner
Combiner是先于partitioner的,combiner的目的是将map的输出先进行一个预先reduce,如将相同key的键值对合并。(需要更多阅读)
6. hadoopd处理输入的方式
hadoop处理的文件多为非常大的文件,更多的情况,则是一个单独的大文件,hadoop处理文件的一个原则是将输入文件分片,即input split。hadoop分片主要有几个特点,一,分片为random,这样节点可以随机的读取任意一段的分片,另外分片为此文件的逻辑分片,而分块则为文件的物理分隔,当物理分隔和逻辑分隔处于一个节点时,hadoop处理文件的效率最高,而文件被分片的方式由inputformat类决定。
7. InputFormat
输入文件如何被分片和读取取决于InputFormat这个接口的实现。Hadoop已经提供了几个常用的实现,如TextInputFormat。我们也可以根据数据的情况自己实现inputFormat类,inputFormat主要包括两个方法需要实现。
InputSplit【】 getSplits(JobConf job,int numSplits) throws Exception.
将输入文件进行分片,并将一片分配给一个map作业。
RecordReader<K,V> getRecordReader(Input)
提供一个迭代器,跌代每个分片中的每一条记录.当我们想要重新定义inputformat时,主要需要改动的则是getRecordReader方法,recordReader方法决定了如何读取Key,Value值,所以主要需要实现RecordReader接口。record接口主要是将分片读为key value键值对。
public interface RecordReader<K, V> {
boolean next(K key, V value) throws IOException;
K createKey();
V createValue();
long getPos() throws IOException;
public void close() throws IOException;
float getProgress() throws IOException;
}
8. OutputFormat
与上述相似,主要负责的是将数据输出到最后的文件系统上的文件中,并且文件的格式将会是part-nnn,其中nnn为reducer的ID。
outputFormat将主要继承自FileOutputFormat,其中hadoop已经实现了多个这样的类。