MapReduce基本操作及应用开发
l MapReduce简介
1 MapReduce编程模型
MapReduce采用”分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单地说,MapReduce就是”任务的分解与结果的汇总”。
在Hadoop中,用于执行MapReduce任务的机器角色有两个:
1.JobTracker用于调度工作的,一个Hadoop集群中只有一个JobTracker,位于master。
2.TaskTracker用于执行工作,位于各slave上。
在分布式计算中,MapReduce框架负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:map和reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果汇总起来。
需要注意的是,用MapReduce来处理的数据集(或任务)必须具备这样的特点:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。
2 MapReduce工作过程
对于一个MR任务,它的输入、输出以及中间结果都是<key, value>键值对:
· Map:<k1, v1> ——> list(<k2, v2>)
· Reduce:<k2, list(v2)> ——> list(<k3, v3>)
MR程序的执行过程主要分为三步:Map阶段、Shuffle阶段、Reduce阶段,如下图:
1.Map阶段
分片(Split):map阶段的输入通常是HDFS上文件,在运行Mapper前,FileInputFormat会将输入文件分割成多个split ——1个split至少包含1个HDFS的Block(默认为64M);然后每一个分片运行一个map进行处理。
执行(Map):对输入分片中的每个键值对调用map()函数进行运算,然后输出一个结果键值对。
Partitioner:对map()的输出进行partition,即根据key或value及reduce的数量来决定当前的这对键值对最终应该交由哪个reduce处理。默认是对key哈希后再以reduce task数量取模,默认的取模方式只是为了避免数据倾斜。然后该key/value对以及partitionIdx的结果都会被写入环形缓冲区。
溢写(Spill):map输出写在内存中的环形缓冲区,默认当缓冲区满80%,启动溢写线程,将缓冲的数据写出到磁盘。
Sort:在溢写到磁盘之前,使用快排对缓冲区数据按照partitionIdx, key排序。(每个partitionIdx表示一个分区,一个分区对应一个reduce)
Combiner:如果设置了Combiner,那么在Sort之后,还会对具有相同key的键值对进行合并,减少溢写到磁盘的数据量。
合并(Merge):溢写可能会生成多个文件,这时需要将多个文件合并成一个文件。合并的过程中会不断地进行 sort & combine 操作,最后合并成了一个已分区且已排序的文件。
2.Shuffle阶段:
广义上Shuffle阶段横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和merge/sort过程。通常认为Shuffle阶段就是将map的输出作为reduce的输入的过程。
Copy过程:Reduce端启动一些copy线程,通过HTTP方式将map端输出文件中属于自己的部分拉取到本地。Reduce会从多个map端拉取数据,并且每个map的数据都是有序的。
Merge过程:Copy过来的数据会先放入内存缓冲区中,这里的缓冲区比较大;当缓冲区数据量达到一定阈值时,将数据溢写到磁盘(与map端类似,溢写过程会执行 sort & combine)。如果生成了多个溢写文件,它们会被merge成一个有序的最终文件。这个过程也会不停地执行 sort & combine 操作。
3.Reduce阶段:
Shuffle阶段最终生成了一个有序的文件作为Reduce的输入,对于该文件中的每一个键值对调用reduce()方法,并将结果写到HDFS。
l MapReduce相关代码解析
Wordcount
https://blog.youkuaiyun.com/litianxiang_kaola/article/details/71154302
数据排序
https://blog.youkuaiyun.com/u0110263289/article/details/5290062
l MapReduce基本操作:Wordcount
实验操作方式有:
1. 需导出jar包的直接操作:
优点:无前提要求 缺点:复制包创建路径花费时间,需命令行操作
2. 使用eclipse插件帮助操作:
优点:无需重复创建路径,无需命令行操作 缺点:代码稍复杂需自己调试,路径多,容易出错。且需要已经提前安装好插件。
l 参考书目《Hadoop大数据处理技术基础与实践》(直接:P100)
(使用eclipse插件操作:P113)
l 参考网页http://dblab.xmu.edu.cn/blog/hadoop-build-project-by-shell/
https://blog.youkuaiyun.com/u011026329/article/details/52900628
http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/
*实验选择两方法之一即可。操作以参考书为准,网页内容,仅做参考。
实验步骤:
1. 使用eclipse创建Java工程
2. 导入Hadoop相关jar包并创建路径
3. 代码实现
1)创建wordmapper类并写入代码
2)创建wordruducer类并写入代码
3)创建wordmain驱动类并写入代码
*代码内容几乎无路径,去掉中文并做基本检查,无语法错误即可。
4. 打包工程为jar包
5. 创建文本数据
6. 将文本数据上传到hdfs
7. 运行jar文件
8. 查看结果
*eclipse插件下操作:
参照书p113即可,相比较直接操作,使用插件提交方便且更加直观,p118页部分修改Wordcount驱动类,可以不修改也能提交。如果只有一个节点,可以不修改直接提交。如果要修改,要将路径、IP地址等修改成自己各个节点的地址。
l MapReduce应用开发:数据排序
此实验与上个实验类似,同样使用MapReduce进行功能实现,此处实现的是数据排序。
l 参考书目《Hadoop大数据处理技术基础与实践》P100
l 参考网页https://blog.youkuaiyun.com/xw_classmate/article/details/50639848
https://blog.youkuaiyun.com/hunannanhu/article/details/41210627
http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html#_label1(参照网页上数据排序部分)
*本实验与Wordcount基本操作类似,数据上传和控制台操作等参照书上Wordcount部分,实验代码改为参考网页上代码即可。
*因为部分文件重名可能会导致错误,建议在做完Wordcount部分后,遇到实验中与Wordcount实验重名的文件,稍微修改名称,避免重名导致的错误,如file1等文件,最好改成其他名字。如果使用插件,输出文件名也需要修改。
实验步骤:
1.使用eclipse创建Java工程
2.导入Hadoop相关jar包并创建路径
3.代码实现
1)创建SortMapper类并写入代码
2)创建SortReducer类并写入代码
3)创建SotrRunner类并写入代码
4.打包工程为jar包
5.创建文本数据(文本数据可自行编写,格式符合即可)
6.将文本数据上传到hdfs
7.运行jar文件
8.查看结果
*eclipse插件下操作同上实验。