参考链接:
正文
MapReduce简介和优点
- mapreduce是一个分布式运算程序的编程框架,是hadoop数据分析的核心
- mapreduce的核心思想是将用户编写的逻辑代码和架构中的各个组件整合成一个分布式运算程序,实现一定程序的并行处理海量数据,提高效率.
- 海量数据难以在单机上处理,而一旦将单机版程序扩展到集群上进行分布式运行势必将大大增加程序的复杂程度
- 引入mapreduce架构,开发人员可以将精力集中于数据处理的核心业务逻辑上,而将分布式程序中的公共功能封装成框架,以降低开发的难度
- MapReduce分三个阶段执行,map阶段,shuffle阶段,reduce阶段。
- 一个完整的mapreduce程序有三类实例进程
MRAppMaster:负责整个程序的协调过程
MapTask:负责map阶段的数据处理
ReduceTask:负责reduce阶段的数据处理
详细流程图文详解

1.切片
- 在FileInputFormat中,计算切片大小的逻辑:Math.max(minSize, Math.min(maxSize, blockSize))
- minSize的默认值是1,而maxSize的默认值是long类型的最大值,即可得切片的默认大小是
blockSize(128M)
- maxSize参数如果调得比blocksize小,则会让切片变小,而且就等于配置的这个参数的值
- minSize参数调的比blockSize大,则可以让切片变得比blocksize还大
- hadoop为每个分片构建一个map任务,可以并行处理多个分片上的数据,整个数据的处理过程将得到很好的负载均衡,因为一台性能较强的计算机能处理更多的数据分片
- 分片也不能切得太小,否则多个map和reduce间数据的传输时间,管理分片,构建多个map
任务的时间将决定整个作业的执行时间(大部分时间都不在计算上)
- 如果文件大小小于128M,则该文件不会被切片,不管文件多小都会是一个单独的切片,交给一个maptask处理.如果有大量的小文件,将导致产生大量的maptask,大大降低集群性能.
- 大量小文件的优化策略:
(1)在数据处理的前端就将小文件整合成大文件,再上传到hdfs上,即避免了hdfs不适合存储小文件的缺点,又避免了后期使用mapreduce处理大量小文件的问题。(最提倡的做法)
(2)小文件已经存在hdfs上了,可以使用另一种inputformat来做切片(CombineFileInputFormat),它的切片逻辑和FileInputFormat(默认)不同,它可以将多个小文件在逻辑上规划到一个切片上,交给一个maptask处理。
2.环形缓存区
- 经过map函数的逻辑处理后的数据输出之后,会通过OutPutCollector收集器将数据收集到环形缓存区保存。
- 环形缓存区的大小默认为100M,当保存的数据达到80%时,就将缓存区的数据溢出到磁盘上保存。
3.溢出
- 环形缓存区的数据达到其容量的80%时就会溢出到磁盘上进行保存,在此过程中,程序会对数据进行分区(默认HashPartition)和排序(默认根据key进行快排)
- 缓存区不断溢出的数据形成多个小文件
4.合并
- 溢出的多个小文件各个区合并在一起(0区和0区合并成一个0区),形成大文件
- 通过归并排序保证区内的数据有序
5.shuffle
- 从过程2到过程7之间,即map任务和reduce任务之间的数据流称为shuffle(混洗,很多人也称之为洗牌),而过程5最能体现出混洗这一概念。一般情况下,一个reduce任务的输入数据来自与多个map任务,多个reduce任务的情况下就会出现如过程5所示的,每个reduce任务从map的输出数据中获取属于自己的那个分区的数据。
6.合并
- 运行reducetask的节点通过过程5,将来自多个map任务的属于自己的分区数据下载到本地磁盘工作目录。这多个分区文件通过归并排序合并成大文件,并根据key值分好组(key值相同的,value值会以迭代器的形式组在一起)。
7.reducetask
- reducetask从本地工作目录获取已经分好组并且排好序的数据,将数据进行reduce函数中的逻辑处理。
8.输出
- 每个reducetask输出一个结果文件。
正文结束