大数据 ---分布式并行计算框架MapReduce

分布式并行计算框架MapReduce

是指实现某项任务或某项工作从开始到结束的计算过程或流的结构。
游戏中,目标是计算每组纸条中每个图形的总个数。一共八个步骤,每个步骤都是计算的一部分,是框架的一部分。
MapReduce计算框架
大数据 ---分布式并行计算框架MapReduce
分布式并行计算框架
一个大的任务被拆分成多个小任务,每个小任务同时执行。按照执行流程进行计算。
大数据 ---分布式并行计算框架MapReduce
大数据为什快
横向扩展
移动程序到数据端
多个数据副本
分布式存储(减小磁盘IO的瓶颈)
分布式计算(众人拾柴火焰高-人多力量大)

WordCount 单词总和
需求:
计算aaa.txt文档中每个单词出现的次数
例如:
zhangsan,lisi,wangwu
zhaoliu,qianqi,niuba
zhangsan,wangwu
zhaoliu,niuba
目标结果:
zhangsan 2
lisi 1
wangwu 2
zhaoliu 2
qianqi 1
niuba 2
代码
第一步:配置pom文件
见讲义
偏移量
指的是每行行首字母移动到文办的最前面需要一定的字符。
MapReduce的数据类型
java: long int double float string Boolean
hadoop : LongWritable IntWritable DoubleWritable FloatWritable Text BooleanWritable
编写Map代码
1、实例一个实体类,继承Mapper<输入放入key的类型,输入的value的类型,输出放入key的类型,输出的value的
类型>
2 、重写map(LongWritable key, Text value, Context context)
key 每行行首的偏移量
value 每一行的数据
context 上下文对象
3、实现自己业务逻辑的代码
将数据进行拆分,并进行逐一输出。
编写Reduce代码
1、实例一个实体类,继承Reducer<输入放入key的类型,输入的value的类型,输出放入key的类型,输出的value的
类型> 2、重写reduce(Text key, Iterable values, Context context)
key: 每一个唯一的数据(游戏中的图形)
values: 每一个图形 ,1 的标记(1的list)
context:上下文对象
3、遍历values(1的list)
进行求和
4、将key 和这个key对应的value(总和)输出。
Driver代码流程
大数据 ---分布式并行计算框架MapReduce
//1 、实例一个job //2、使用job 设置读物数据(包括数据的路径) //3、使用job 设置MAP类(map 输入和输出的类型) //4、使用job 设置Reduce类(Reduce 输入和输出的类型) //5、使用job 设置数据的输出路径 //6、返回执行状态编号
Map的输出 是key,value的 list
Reduce的输入 是key value的list

MapReduce核心思想
分而治之,先分后和(只有一个模型)
Map负责数据拆分 map: [k1,v1] → [(k2,v2)]
Reduce负责数据合并 reduce: [k2, {v2,…}] → [k3, v3]、
大数据 ---分布式并行计算框架MapReduce
大数据 ---分布式并行计算框架MapReduce
Mapreduce的输入是一个目录,那么会将目录内的所有文件进行读取计算,
若是一个文件,那么只计算该文件。

Mapreduce的输出路径绝对不能已存在

Mapreduce Maptask不能人为设置
Reducetask可以人为设置,task越多速度越快
job.setNumReduceTasks(5);

将代码打包(jar)上传到集群运行需要在driver中添加以下代码
job.setJarByClass(WordCountDriver.class);

运行的命令
hadoop jar jar包名 driver主类(包名类名)
hadoop jar original-mapreduce-1.0-SNAPSHOT.jar com.czxy.WordCountDriver

MapReduce执行流程

第一步:InputFormat
InputFormat 在HDFS文件系统中读取要进行计算的数据
输出给Split
第二步:Split
Split 将数据进行逻辑切分,切分成多个任务。
输出给RR
第三步:RR
RR 将切分后的数据转换成key value进行输出
key : 每一行行首字母的偏移量
value: 每一行数据
输出给Map
第四步:Map
接收一条一条的数据(有多少行数据Map运行多少次,输出的次数根据实际业务需求而定)
根域业务需求编写代码
Map的输出是 key value的 list
输出给Shuffle(partition)
---------------------------------------Map-------------------------------------------------------
第五步: partition
partition: 按照一定的规则对 key value的 list进行分区
输出给Shuffle(sort)
第六步:Sort
Sort :对每个分区内的数据进行排序。
输出给Shuffle(Combiner)
第七步:Combiner
Combiner: 在Map端进行局部聚合(汇总)
目的是为了减少网络带宽的开销
输出给Shuffle(Group)
第八步:Group
Group: 将相同key的key提取出来作为唯一的key
将相同key对应的value提取出来组装成一个value 的List
输出给Shuffle(reduce)
------------------------------------Shuffle--------------------------------------------
第九步:reduce
reduce: 根据业务需求对传入的数据进行汇总计算。
输出给Shuffle(outputFormat)
第十步:outputFormat
outputFormat:将最终的额结果写入HDFS
------------------------------------reduce--------------------------------------------
大数据 ---分布式并行计算框架MapReduce
Map的输出到Partition(
*
计算逻辑:对map输出的key 取哈希值,用这个哈希值与reducetask的值取余。余几,就将这个key,value放在
对应的分区编号里(分区有多个编号)。
reducetask的设置: job.setNumReduceTasks(2);

Combiner作用
Map结束后,在Map端进行局部聚和。作用:较少网络传入次数,降低了网络开销。
job.setCombinerClass(WordCountReduce.class);