一次Hadoop开发思路分享-创新互联

困扰了自己1周的一个问题终于得到解决了,感谢给我帮助的同学,同时记录下来分享给大家.

成都创新互联长期为成百上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为兴宁企业提供专业的网站设计制作、成都网站制作,兴宁网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。

问题简化描述:

  • HDFS存在这样格式的文件:用户ID    主题ID    用户对此主题的偏好分数score。

  • 现在要求实现对给定的几个主题T1,T2,T3,...TN,每个主题要求筛选出指定数量的用户ID是M1,M2,M3,...MX。

  • 希望尽可能根据score来选出偏好的用户ID,并且主题之间的用户ID不可以重复。

  • 另外HDFS上distinct的用户ID数量是大于等于M1+M2+M3+...+MX的。

思路分析:

问题有几个关键点,第一,不重复,第二,数量上要满足,第三,偏好分数score。

如何保证,主题之间的用户不重复呢?

其实就是完成,一个用户只能属于一个主题的过程,当然,我们可以很简单的对一个用户下的所有偏好分数进行排序,取出最偏好的主题。

虽然这样避免了重复的问题,可是问题来了,如果偏好主题T1要求的数量是100W,而仅仅只有90W的用户ID对T1最偏好,这该如何补数呢?又如何通过程序来自动化的实现这个过程呢?越想越复杂!

这个问题好像有点类似于高考填自愿的问题,我们每一个人会填写几个志愿,但是我们终究只会被一个院校录取,这是怎么做到的呢?是否可以从中借鉴呢?

首先,我们根据HDFS的内容,写一个MapReduce完成一次计算,形成下面的用户志愿HDFS内容:

用户ID  主题ID-A:score1;主题ID-B:score2;...

很简单,希望得到一个用户ID下面按照score desc排序的主题列表,上面一行其实就是说:

用户ID的第一志愿是主题A,第二志愿是主题B...。

------------------------------------------

接下来,形成下面的一个列表list信息:

主题A  count-A

主题B  count-B

主题C  count-C

...

按照主题需要的用户ID的数量进行ASC排序。

------------------------------------------

下面,我们就来看如何进行主题选择用户的过程:

我们首先选择对数量要求最少的主题A完成下面的MapReduce计算:

一次Hadoop开发思路分享

这样,我们就完成了主题A的用户筛选问题。

接下来,我们取出list中数量要求比A多一点的主题B,那么它怎么取用户呢?

很简单,我们只需要在MAP处理阶段,传递主题A生成的结果HDFS路径(路径下面的文件内容当然是主题A的用户)用于reduce阶段取用户时进行过滤。

那么,主题C又如何取用户呢?

类似的,只需要给MAP多传递主题A,主题B已经占用的用户信息用于过滤,其他处理操作不变!

其实,我们可以发现,上面的MapReduce其实可以是一个通用的程序,类似于COMMAND:

hadoop jar XXX.jar 主题ID 数量  [input1,input2,input3,...] 用户志愿HDFS路径 输出路径

其中input1,input2,input3,...是可选的,其实就是用于用户过滤的。

最后,我们可以写一个Shell脚本,根据list的内容来进行重复调用上面的COMMAND,通过传递不同的参数信息达到目的,这样我们就可以自动化实现上面的要求了!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站标题:一次Hadoop开发思路分享-创新互联
当前路径:http://scyanting.com/article/dcojhe.html