复习-Hadoop第6章 分布式计算框架MapReduce

,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类来实现自己的输出逻辑

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容