# Hadoop(MapReduce)
1.MapReduce
是一个分布式运算程序的编程框架
2.优点:
MapReduce 易于编程,良好的扩展性,高容错性,适合PB级以上海量数据的离线处理
3.缺点:
不擅长实时计算,不擅长流式计算,
1)不擅长DAG(有向无环图)计算
流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。
2)不擅长DAG(有向无环图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。
在这种情况下,MapReduce并不是不能做,而是使用后,
每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。
4.MapReduce核心编程思想:
(1)分布式的运算程序往往需要分成至少2个阶段。
(2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
(3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
(4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
总结:分析WordCount数据流走向深入理解MapReduce核心思想。
(1)需求:统计其中的每一个单词出现的总次数
查询结果:a-p 一个文件
q-z 一个文件
(2)通过传入的数据:进入第一个阶段MapTask阶段,有多个MapTask阶段,完全并发运行,互不相干。
在MapTask里:
1)读数据,并按行处理
2)按空格切分行内单词
3)KV键值对(单词,1)
4)将所有的KV键值对中单词,按照单词首字母,分成2个分区溢写到磁盘
注:分区1(a-p)
分区2(q-z)
(3)接下来第二个阶段ReduceTask,可以有多个,并发实例互不相干,但是他们都依赖与上一个阶段的所有MapTask并发实例的输出。
在ReduceTask里:
1)第一个ReduceTask对接每个MapTask的分区1(a-p),统计a-p开头的单词,输出结果到文件
2)第二个ReduceTask对接每个MapTask的分区2(q-z),统计q-z开头的单词,输出结果到文件
(4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
5.查找WordCount源码
1)进入虚拟机
2)cd /opt/module/hadoop-3.1.3/share/hadoop/mapreduce
3)里面有:hadoop-mapreduce-examples-3.1.3.jar
4)下载到本地:sz hadoop-mapreduce-examples-3.1.3.jar
注:rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具
sz:将选定的文件发送(send)到本地机器
rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到Linux服务器
public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {}
//参数分析:LongWritable:偏移量(这里用LongWriteable写死,因为底层也是LongWri