,MapReduce是一种可用于数据处理的编程模型
Map阶段将大量数据进行拆分,并进行并行处理,此阶段的处理阶段可能是最终的结果,如果不是最终的结果,则在转入到ruduce阶段
Reduce阶段作用是将mao输出进行整合汇总,两个阶段互相配合,以可靠,容错的方式在集群上并行处理大量的数据
为什么引入?
海量数据的处理
集群运行的困难
业务逻辑与底层资源分配的隔离
Map系统将数据分为若干个分片split
将分片的数据以键值方式传递给map进行处理
Map方法将数据进行业务处理
将处理的数据写入到磁盘当中
Reduce阶段
通过多个赋值线程去拉去不同的map节点的输出的数据文件
对于这些数据文件进行排序合并,然后传入到reduce方法
Reduce方法对数据进行业务处理
输入数据到文件系统当中HDFS
HDFS创建目录的实例
Hadoop fs -mkdir /wordcount
Hadoop fs -mkdir /wordcount/input
上传处理文件到HDFS
Hadoop fd -put $HADOOP_HOME /*text/wordcount/input
执行wordcount程序
Hadoop jar $HADOOP_HOME/sahre/hadoop/mapreduce/hadoopmapreduce-examples-x.x.x.jar wordcount /wordcount/input /wordcount/output
查看处理的结果
Hadoop fs -cat /wordcount/output/part-r-10000
关于shuffle
从map段产生输出,到reduce输入之前的这一阶段被称为shuflle
在shuflle过程当中,系统会产生大量的磁盘I/O和网络I/0
并且进行大量的分区,排序和合并操作
输入分片->map-》环形缓冲区-.>分区,排序,磁盘分割-0》磁盘合并-》复制-》合并-》排序阶段=》合并阶段
Reduce阶段
Reduce段不会等待所有的map任务结束再去获取map段的输出的数据,他的一个线程会定期询问Application MAster,一旦有map任务结束,就开始复制数据
Reduce会启动若干个复制的线程,以并行的方式从各个map节点复制数据
他只复制属于自己分区的数据
复制完成以后所有的map的数据后,会将二哥哥部分的数据进行排序,合并,reduce数据默认情况下只有一个,可以同构JOB类的setNumReduceTasks()设置
Map本地化
Map任务有本地化的局限,意思是map任务一般情况下都会运行在分片所在的节点上,这样的好处是可以不同跨节点传输数据,从而大大提高了程序的运行的效率
当然如果本地节点正在忙碌,无法分配出资源运行map任务,那么就会在分片所在的节点的同一个机器上分配阶段(机架本地化),总的来说就是在距离数据最近的节点上运行,这也符合大数据“数据在哪,计算就在哪”的思想。与map任务不同,reduce任务可以在集群的任何位置运行。
Combiner
Combiner是一个继承了Reducer类
他的作业是当map生成的数据过大的时候,可以精简压缩传送给Reduce的数据
他的使用可以让maop的输出在基于reduce之前做一下合并或者计算,把具有相同的key的value做一个计算
多数情况下,Combiner和reduce处理的是同一种逻辑
Partitioner
默认情况下,使用的是HashPartitioner就是使用hash方式对键进行分区
通过继承Partitioner类,定义了自己的分区的规则
通过Job的setPartitionClass()方法和setNumRedcueTasks()设置使用分区
输入处理类
输入的分片在JAVA当中表示无InputSplit接口,文件,数据等不同的类型的数据有不同的IputSplit实现,但是对于开发人员来说是不必处理InputSplit因为他是由InputFormat创建的,InputFormat负责创建输入的分片并将他们分割成为记录
Hadoop默认使用的是FileINputFormat下的TextInputFormatFileInputFormat当中定义了如何针对文件进行进行分区’
可以编写自己的InputFormat类和RecordReader类来实现自己的读取的逻辑
Output主要是用于描述输出的数据的格式
他能够将用户提供的key/value对写入到特定的格式的文件当中,hadoop自带了很多的PutOUTFormat的实现,他们和InputFormat实现相对应所有的MapReduce输出都实现了OutputFormat接口
Hadoop默认使用的是FileOutputFormat下的extOutputFormat类
可以通过继承OutputFormat(fileOutputFormat)和RecordWriter类来实现自己的输出逻辑