MapReduce小总结

## 什么是MapReduce(分布式运算框架(模型))

分布式:在一个操作中,需要多个系统之间配合才能完成的整个业务逻辑,叫做分布式系统
MapReduce:分布式运算框架,是hadoop的一个组件,用来计算的 可以统计hdfs里的数据
先map在reduce
怎么编程 本地运行
怎么运行 —> 集群上(yarn) (本地(local)运行模式 集群(yarn)运行模式)

## MapReduce主要有两部分组成

编程模式:提供简单的接口,实现几个简单的函数 实现分布式程序 Map Reduce
运行时环境:比较复杂节点的通信,节点失效,数据切分等(YARN)

MapReduce 编程框架处理的运算有一个共同点 问题可以分解成相互独立的多个子问题
子问题解决问题解决

①MapReduce是hadoop的核心组件之一.hadoop分布式包括两部分 一是分布式文件系统hdfs,一部分是分布式计算框架,就是MapReduce,缺一不可 也就是说,可以通过MapReduce很容易在hadoop平台上进行分布式的计算编程
②MapReduce是一种编程模型,是一种编程方法,抽象理论
Map函数和Reduce函数

## Map函数

:接受一个键值对(key-value pair),产生一组中间键值对.MapReduce框架会将map函数产生的中间键值对里面键相同的值传递给一个reduce函数

## Reduce函数

:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)

MapReduce是一种编程思想,可以使用java、C++来实现.map的作用是过滤掉一些原始数据,reduce则是来处理这些数据,得到我们想要的结果.

## ①

KEYIN: 处理文件当前行的 起始偏移量
VALUEIN: 当前行数据
KEYOUT: 业务逻辑输出的key 单词
VALUEOUT: 业务逻辑输出的value 1

## ②

1)当数据要在网络之间进行传输时,数据传输的是二进制,JAVA对象需要序列化才能传输
2)JDK提供了JAVA的序列化机制 实现接口即可
3)JDK知道对的序列化机制 存储的数据比较全(类名 包名 属性名 数据类型…)内容臃肿,存在大量多余数据
4)如果传输海量K V 不建议使用JDK的序列化机制

## ③

HDP有自己的序列化机制
Long — > LongWritable
String — > Text (io包)
Integer — > IntWritable

## MapReduce

:基本上都会写一个XxMapper类继承一个Mapper,还会写一个XxRedecer类继承Reducer,这两个类有两个方法一个是map方法,一个是reduce方法,这两个方法写完之后还会写一个启动类(main方法),这个main方法,写上一个job.getInstance,然后把configuration放进去,接下来把XxMapper类和XxReducer类也设置(job.setMapperClass)到启动类里面,接着设置这两个类的task类、设置K-V的数据类型、输入数据路径-输出结果路径,最后执行job.waitForCompletion(true);然后程序运行,(本地运行)
排序
程序运行根据,tostring拿到每行数据,根据自己的逻辑进行区分,生成新的K-V,context.write(k,v);把数据写进缓存区,写进去后,把每个新的K-V做分区标识(NK-V_0/1),然后按照key排序,前提得保证key是可排序的,排完序后就会将数据写进本地磁盘里,然后就等待(Rdeuce下载),把map运行后的结果写在本地磁盘程序就运行完了.
运行完后启动maptask,可以设置启动个数(job.setNumReduceTasks(3)😉,这里面有reduce方法处理数据,数据可能会在每一台机器上,遍历数据,合并在一起做一个合并排序,然后分组,用自己内部的逻辑判断相邻的两个key是否是同一个key,一组数据调用一次Reduce方法,(默认按照key分组,一组执行一次Reduce方法,然后做一个合并),context开始输出,结果就被保存到我们设置的输出路径里,几个reduce就几个文件.(part-r-000 part-r-001)

//1初始化配置对象 默认程序运行在本地 本地模式运行
Configuration conf = new Configuration();

	//2初始化一个Job
	Job job = Job.getInstance(conf);
	
	//3 执行maptask类  reducetask类
	job.setMapperClass(WordCountMapper.class);
	job.setReducerClass(WordCountReduce.class);
	
	//设置maptask的输出KV类型
	job.setMapOutputKeyClass(Text.class);
	job.setMapOutputValueClass(IntWritable.class);
	
	//设置reducetask的输出类型
	job.setOutputKeyClass(Text.class);
	job.setOutputValueClass(IntWritable.class);
	
	//4 处理数据路径
	FileInputFormat.setInputPaths(job, new Path("E://word.txt"));
	
	//5 结果输出
	FileOutputFormat.setOutputPath(job, new Path("E://res"));
	
	//提交Job  等待执行完毕
	job.waitForCompletion(true);
	/*
	 * Completion是执行完了  这句话是我是否等着你执行完
	 * 程序要提交  提交之后 驱动端要等 着程序运行完
	 * true 是等着执行完
	 */

## 总结(流程)

:先有mapper类,再有Reducer逻辑类,再有启动类,启动类里有个job,当job进行waitForCompletion的时候,就会去加载输入路径的数据,根据数据计算启动几个maptask,然后开始读输入路径的数据,读完后会生成一个K-V,交给map方法,一个K-V执行一次map方法,
然后切割每一行拿到单词1,写到缓存里面,缓存里做一个排序,分区标识,然后把分区标识里排好序的数据写在本地磁盘里来,然后启动Reducetask就可以去下载数据自己的数据,下载完数据后再进行一个合并排序分组,将分好组的数据放在一个迭代器里,一个迭代器(一组)交给Reduce方法做一个合并聚合,然后把结果写到输出路径.

## 补充

:在Mapper和Reduce中有两个方法,setup cleanup
执行:先执行setup()
While(){
Try{
Map() 如果在map里就hashnext(K-V) 在reduce里就hashnext(K)

}
}
先执行setup,执行之后有一个while循环里执行map方法,把map方法try起来
Finally{
cleanup()
}
Finally会执行对应的cleanup方法

Setup在执行map或reduce方法之前执行一次,cleanup是在map reducetask整个任务执行之后执行一次,.

setup()获取处理文件的文件名(FileSplit)context.getInputSplit().getPath().getName();
Cleanup 全局排序
注:仅个人见解

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值