一次Hadoop开发思路分享

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

问题简化描述:

  • 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计算:

这样,我们就完成了主题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,通过传递不同的参数信息达到目的,这样我们就可以自动化实现上面的要求了!

时间: 2024-10-21 20:22:17

一次Hadoop开发思路分享的相关文章

会员管理系统的设计和开发(3)--主界面的设计思路分享

会员管理系统经过一段时间的紧锣密鼓开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续介绍这个开发过程中相关的技术要点,本章主要介绍会员管理里面,列表主界面的一些设计思路分享. 有时候,遵循一些固定的套路做事情,总是很容易,如果每个地方搞一些创新和改进,那么往往需要花费很多时间,但是创新是有积极意义的,虽然可能会遇到困难,但是很值得去做.在Winform的界面设计上,虽然我可以使用代码生成工具生成比较标准的界面了,但是我总是喜欢参考学习,并改进一些界面方面

渗透测试一些思路分享

渗透测试一些思路分享 (1)  收集网站信息 首先确定网站采用何种语言编写.或者是否有混用的情况.此处可以通过查看网站源文件,观察网站链接,捕获提交请求等方式获取. (2)  爬行网站目录 使用工具对网站目录进行爬行,可以辅助上一步让结果更加精准.将爬行结果存档,如果可以,此处应分析出网站是否使用通用程序,如果是,记录下来.进行下一步. (3)  暴力目录探测 根据上一步的爬行结果,对网站根目录或者关键目录进行暴力目录探测,如果网站为通用程序,判读是否有过二次开发,如非通用程序,在探测到的目录中

HyperLedger Fabric 学习思路分享

HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常流行并广为人知的区块链网络框架的实现方案.作为一种基于模块化架构开发应用程序或解决方案的基础,HyperLedger Fabric支持如共识和会员服务等即插即用的组件,它的设计初衷是支持不同组件的可插拔实现,并适应整个经济生态系统的复杂性和高精度性.HyperLedger Fabric利用容器技术运

OpenWRT - WEB界面开发思路和基本方法

想要对OpenWRT的WEB界面(*下称界面)进行修改.修改的目标是: 1.修改页面的样式,设计为企业的风格(stylesheet) 2.新建自己的功能,实现 访问页面后,用户就可以对配置文件(也就是系统的一些参数)进行修改. 甚至是与远端服务器交互,实现验证. 一. 几种可行的开发路线: 1.改用PHP.JSP等语言开发 2.修改已有的界面,实现自己的功能 2.1 修改已有样式表 2.2 仍然利用lua开发 第一种比较容易操作,但需要在设备里安装nginx和PHP环境,然后在 /www下放PH

好程序员大数据学习路线Hadoop学习干货分享

好程序员大数据学习路线Hadoop学习干货分享,Apache Hadoop 为可靠的,可扩展的分布式计算开发开源软件.Apache Hadoop软件库是一个框架,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集(海量的数据).包括这些模块: Hadoop Common:支持其他Hadoop模块的常用工具. Hadoop分布式文件系统(HDFS?):一种分布式文件系统,可提供对应用程序数据的高吞吐量访问. Hadoop YARN:作业调度和集群资源管理的框架. Hadoop MapRedu

Maven构建Hadoop开发环境

Maven构建Hadoop开发环境 软件环境:Eclipse Kepler x64 & Hadoop 1.2.1 & Maven 3 硬件环境:Centos 6.5 x64 1.Maven创建项目 使用CMD命令在工作空间执行 E:\ws\mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=org.conan.myhadoop.mr -DartifactId=myHadoop -Dp

AppleWatch开发入门一——Watch的开发思路与应用框架

AppleWatch开发入门一--Watch的开发思路与应用框架 一.引言 Apple Watch无疑是apple在智能手表领域的一次革命,如何在Watch上开发出实用且具有美感的应用,是iOS开发者们开始思考的一个问题,由于watch的随身性和快捷性,在某些方面,它有比iphone更加大的优势,要抓住watch的这些特点,开发出淋漓尽致的应用,就需要改变一些在iphone开发的思路,正如一句话:只有忘掉经验,才会有意想不到的突破. 这一系列博客,首先是总结我在公司watch项目开发中的一些经验

hadoop开发环境搭建(1)

作为初学Hadoop的新手,搭建Hadoop开发环境花了我很大功夫.倒不是hadoop搭建复杂,由于hadoop本身是一个分布式.多jvm进程的运行环境,我们想达到能用eclipse进行代码跟踪调试目的,还真不是一般的费劲. 一边在网上向给位前辈学习,一边自己动手尝试,花了我整整一天的时间终于完成了,为了使自己好不太容易完成的成就,后续被轻易忘记,也为了帮助其他hadoop小白同类脱贫致富,花了一晚上总结了此篇博文,以兹鼓励. 一.准备篇 言归正传,首先是准备篇.这里我们需要准备不少东东: 1.

linux在线预览pdf文件开发思路

准备:swftools,flexpaper 基本思路: 1,将pdf文件转化成swf文件 2,使用flexpaper预览swf文件 主要代码: 1,在linux中安装swftools.官网下载swftools 安装包,解压 2,./configure --prefix=安装路径 make install 执行完之后,执行pdf2swf -help 如果显示.说明安装成功 如果执行pdf2swf -help  显示commond not find 的话,可能需要配置swftools的环境变量,具体