简介:
mapreduce中心思想是分而治之,将数据处理的过程分为map和reduce两步,
特点:
开发简单:用户不需要了解mapreduce深层实现掌握使用方法即可实现分布式编程
扩展性强:可水平扩展
容错性强:多节点,可用性高
编程思想:
执行过程:{key,value}——>{key,list<value>}——>{key,value},分词——》分组——》技术
最小单位:键值对
执行过程:将数据拆分成键值对-》经过map输出新的中间键值对-》经过reduce输出聚合和计数后的键值对
运行环境:
CDH5中的运行环境是yarn,向yarn提交任务,yarn做分配处理
CDH3中是以jobTracker为主角色,taskTracker为从角色的主从架构,客户端提交任务到主节点,主节点做任务分配,从节点处理数据
jobTracker任务:任务调度和资源监控
taskTracker任务:汇报心跳和执行map或者reduce函数
局限性:
资源配置不灵活:tasktracker能够启动的任务数量由tasktracker的任务槽决定,槽是mapreduce的计算资源表示模型,hadoop将槽分为map槽和reduce槽,槽已经分配边无法更改,故mapreduce无法灵活分配资源
执行速度慢:大量的中间结果需要写入磁盘,磁盘I/O耗费时间长
过于底层,java以外的用户存在使用门槛
代码片段展示
map:
reduce:
main:
···java
public static void main(String[] args) throws Exception{
System.setProperty("HADOOP_USER_NAME", "hadoop");
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS","hdfs://192.168.199.233:8020");
// 创建一个Job
Job job = Job.getInstance(configuration);
// 设置Job对应的参数: 主类
job.setJarByClass(WordCountApp.class);
// 设置Job对应的参数: 设置自定义的Mapper和Reducer处理类
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
// 设置Job对应的参数: Mapper输出key和value的类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// 设置Job对应的参数: Reduce输出key和value的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
// 如果输出目录已经存在,则先删除
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.199.233:8020"),configuration, "hadoop");
Path outputPath = new Path("/wordcount/output");
if(fileSystem.exists(outputPath)) {
fileSystem.delete(outputPath,true);
}
// 设置Job对应的参数: Mapper输出key和value的类型:作业输入和输出的路径
FileInputFormat.setInputPaths(job, new Path("/wordcount/input"));
FileOutputFormat.setOutputPath(job, outputPath);
// 提交job
boolean result = job.waitForCompletion(true);
System.exit(result ? 0 : -1);
}
```
执行过程:
input->map->comine->reduce->output
工作机制: