- 1、本文档共22页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用MR开发过哪些应用?思路?
精准广告推荐。
要求:统计微博日志中每条微博中对商品关键字的关注度。
日志格式:
微博id 微博内容
结果格式:
微博id 关键字1:关注度,关键字2:关注度…….
答:关注度权重W=TF*log(N/DF)。
TF:关键字在该条微博中出现的次数
DF:出现关键字的微博条数
N:微博的总条数。
思路:三个MR。
第一个mapreduce:计算TF、N。map中使用IK分词器(IKSegmenter)分出词组,计算TF(key:关键字_微博id,value:出现次数),并记录微博条数(key:count,value:1)。自定义分区,指定两个reduce,输出到两个文件中。
第二个mapreduce:以第一个mapreduce的输出作为输入,计算DF(key:关键字,value:微博条数)。
第三个mapreduce:计算关注度权重。将前两个mapreduce的输出作为输入。在setup()中预先读取TF、N、DF。
好友推荐
reduce:
人2 人3
人3 人2
人4 人1
人1 人4
…….
Combiner:
人1 (人2,人3,人3)
人2 (人4,人1,)
人3 (人1,人1)
人4 (人2)
…….
Map:
人1 人2
人1 人3
人3 人1
人2 人4
人2 人1
人3 人1
人1 人3
人4 人2
…….
原始数据:
人1 人2
人1 人3
人3 人1
人2 人4
…….
Map阶段:以主作为key,从作为value输出,同时以从作为key,主作为value输出
Reuduce阶段:将value存入set结构,set结构能够去重,然后对set数组自身做笛卡尔机运算,即双重循环,循环过程中去重每个元素自身与自身的推荐。
轨迹分析
Map/reduce接口体系,源码类结构关系?
(1)体系
整个编程模型位于应用程序层和MapReduce执行器之间,可以分为两层,第一层是最基本的Java api,主要有5个可编程组件,分别是InputFormat、mapper、partitioner、reducer、outputformat,hadoop自带了很多直接可用的inputformat、partitioner、outputformat,大部分情况下,用户只需要编写mapper和reducer即可。第二层是工具层,位于基本Java API之上,主要提供了4个编程工具包:
Jobcontrol:方便用户编写有依赖关系的作业,这些作业往往构成一个有向图(DAG),
Chainmapper/chainreducer:方便用户编写链式作业。(???)
Hadoop streaming:方便用户采用非java语言编写作业
Hadoop pipes:专门为c/c++程序员编写mapreduce程序提供的工具包。
(2)API类结构
旧版存放着org.apache.hadoop.mapred包中,新版API则放在org.apache.hadoop.mapreduce包及子包中。
上下文封装:易用性和扩展性。好处:首先函数参数列表经封装后变短;其次需要修改或添加某些变量或函数时,只需要修改修改后的上下文类。 (上下文概念和平时将参数封装为实体类有区别吗???)
序列化:要求key、value均可序列化,即让对应类实现其Writable接口,由于key是排序的关键字,还需实现WritableComparable接口。
回调机制,上述5个编程组件全是回调接口。
新旧API提交作业的区别:
(3)API解析
InputFormat:
功能:a、数据切分,将数据切分为若干个split,以确定maptask个数以及对应的split。b、为Mapper提供输入数据,给定某个split,将其解析成key/value对。
新版api在形式上与旧版差别较大,但仅仅是对之前一些类的封装,增强易用性和扩展性。对于基类FileInputFormat,新版api的inputsplit划分算法不再考虑用户设定的map task个数,而用mapred.max.split.size(记为maxSize)代替,即InputSplit大小的计算公式为splitSize=max{minSize,min{maxSize,blockSize}}
OutputFormat接口
getRecordWriter方法返回RecordWriter类型,该类中的方法wrier将一个key/value写入文件。在task执行过程中,mapreduce框架会将map()或者reduce()函数产生的结果传入write方法。
自带Outputformat实现,与InputFormat实现对应:
FileOutFormat主要有以下两个功
文档评论(0)