在mapreduce1.0中,所有作业是由Job Tracker来控制的,具体的实现是由java代码生成的jar包来作为job依据和具体实现,,但是jobtraker既要维护job的task状态,还要维护jobtraker中欧给你的job状态,维护层次过多,浪费了很多的资源;
所以在mapredce2.0中,使用的master-slave模式,这样可以减少资源消耗;
作业管理是由ApplicationMaster管理,资源是由新增的系统YARN实现;还有ApplicationManager,ResourceScheduler,NodeManager这三个来取代JobTracker和TaskTracker;
而且ApplicationMaster可变,用户可自定义;
MapReduce编程过程
InputFormat->Map->Combine/partition/->Reduce->OutputFormat
在实际编程中,只需要实现map和reduce,其他过程已经默认指定了;
InputFormat 设置应用程序的数据输入格式,主要分为文件输入格式和二进制输入格式;
TextInputFormat: Key:LongWritable Value: Text
KeyValueTextInputFormat :(用于有行号的文本输入数据;
NLineInputForamt:针对少量文件的并行处理任务汇总;
StreamInputFormat: 用于处理大型的xml文档;
二进制输入:
SequenceFileInputFormat: 用于处理二进制键值对的序列,其中Key: IntWriteable Value: Text sequence(序列)
SequenceFileAsTextInputFormat:将顺序文件作为流操作的输入,并将Key和Value格式都转为Text对象;
SequenceFileAsBinaryInputFormat:Key和Value都转化为二进制对象;
多样式输入:MultipleInputs:可以在每个文件上设置InputFormat类型;
数据库输入:DBInputFormat:从关系型数据库中读取数据的一种格式,可以将数据传到集群上进行处理;
要设置MapReduce应用程序的数据输入格式,首先要定义一个JobConf类对象
然后调用其setInputFormat方法来设置格式,设置输入路径等;
JobConf jconf;
jconf.setInputFormatClass(KeyValueTextInputFormat.class);
FileInputFormat.setInputPaths(jconf,MapReduceConfig.getInputDirectionary());
FileInputFormat是所有以文件为数据元的InputFormat的实现,这些都实现了InputFormat接口
InputFormat接口定义了两个抽象方法:getSplits和createRecordReader方法,
其中getSplits方法将输入数据切片并返回一个InputSplit类型的数组,createRecordReader方法为InputSplit对象生成一个RecordReader对象;
InputSplit类定义了三个方法,getLength,getLocationInfo和getLocations方法,分别用于湖区切片大小,(方便排序);用来获取输入数据所在节点的名称;获取切片的存储信息;
createRecordReader类实现了Closeable接口,用于将输入数据切片转换成key/value对来作为Map的输入;该类定义了六个抽象方法,intialize,nextKeyValue,getCurrentKey,getCurrentValue,getProgress和close方法,分别用来调用RecordReader对象时惊醒实例化该对象;用于读取下一个key/value对 返回true or false;用于获取当前key值,并返回当前key值;用于获取当前的value值;获取当前RecordReader处理转换数据的进度,并返回相应进度值longyi关闭RecordReader;