需求1:求出每一个url被访问的总次数,并将结果输出到一个结果文件中
思路:就是一个wordcount
map阶段: 解析数据,将url作为key,1作为value发出
reduce阶段:将一组数据的value累加
需求2:求出每个网站被访问次数最多的top3个url《分组TOPN》
思路:
map阶段——切字段,抽取域名作为key,url作为value,返回即可
reduce阶段——用迭代器,将一个域名的一组url迭代出来,挨个放入一个hashmap中进行计数,最后从这个hashmap中挑出次数最多的3个url作为结果返回
需求3:求访问次数最多的topn个网站(只能有1个reduce worker)《全局TOPN》
思路:
map阶段:解析数据,将域名作为key,1作为value
reduce阶段:
reduce方法中——对一个域名的一组1累加,然后将 <域名,总次数>放入一个成员变量Treemap中
cleanup方法中——从treemap中挑出次数最高的n个域名作为结果输出
要点1:每一个reduce worker程序,会在处理完自己的所有数据后,调用一次cleanup方法
要点2:如何向map和reduce传自定义参数
从JobSubmitter的main方法中,可以向map worker和reduce worker传递自定义参数(通过configuration对象来写入自定义参数);然后,我们的map方法和reduce方法中,可以通过context.getConfiguration()来取自定义参数
Configuration conf = new Configuration() //
这一句代码,会加载mr工程jar包中的hadoop依赖jar中的各默认配置文件*-default.xml
然后,会加载mr工程中自己的放置的*-site.xml
然后,还可以在代码中conf.set("参数名","参数值")
另外,mr工程打成jar包后,在hadoop集群的机器上,用hadoop jar mr.jar xx.yy.MainClass
运行时,hadoop jar命令会将这台机器上的hadoop安装目录中的所有jar包和配置文件通通加入运行时的classpath,
配置参数的优先级:
1、依赖jar中的默认配置
2、环境中的*-site.xml
3、工程中的*-site.xml
4、代码中set的参数
优先级一次增大,高优先级的参数值会覆盖低优先级的参数值