基于storm的在线关联规则
基于storm的在线视频推荐算法。算法根据youtube的推荐算法 算法相对简单,能够觉得是关联规则仅仅挖掘频繁二项集。以下给出与storm的结合实如今线实时算法 ,
关于storm见这里。首先给出数据流图(不同颜色的线条代表不同的数据流。在storm里面bolt也是能够声明数据流的。)
关联规则挖掘数据项的时候,有事务的概念。这里的事务的定义为:给定时间窗体内用户看过的视频集。
所以。我们须要这样一个bolt,依据实时日志收集每一个用户看过的视频集----user_videos aggregate bolt。 我们如何挖掘频繁二项集呢?事实上就是视频对共同出现的次数。当视频a和b被共同观看的次数(用户看了视频a又看了视频b)大于某个阈值的时候。{a , b}就是一个频繁二项集。
所以我们定时的输出a:b这种视频对。然后对其计数就可以。
这个任务是由video_pair counter bolt完毕的。这样频繁项挖掘基本完了,假设对于推荐可能须要再走一步:对于看了a的人推荐b 的可信度有多高?假设为a推荐了b。那么对于b的曝光来说提升度是多少呢(能够这样理解。b本身非常热门,你再把b推荐出来对于b本身曝光量没有多大作用,这也叫打压热门)? 所以我们须要一个计数器,里面有每一个视频被观看的次数---video_counter_bolt。这样,我们就有了youtube算法公式所须要的全部值。
storm本身是流式的,我们这里须要用到统计用户看过的视频集,所以得有一个池子。不停的收集用户看过的视频。定时的放水(定时放水的任务就有timed_notifier_spout完毕)。所以总体的流程例如以下描写叙述:
1、rt-log spout按user分组,将数据流推给uva-bolt.
2、tn-spout 会定期向下游推送时间窗体关闭的通知
3、uva-bolt里面维护一个map , 里面是用户到其观看过的视频集的映射。它第接收到一条日志就会更新这个map 。 同一时候向计数器vc-bolt发送一条播放数据.当收到tn-spout的通知时,便会将map里面的数据构建成视频对,分组后推送给相关的vp-bolt.
4、vp-bolt 也会维护一个map , 用以视频对的计数。
当收到tn-spout的通知时向vc-bolt发送这些统计信息,并清空这个map.
3、vc-bolt内容也维护一个map , 里面是视频到其他被观看次数的映射 。
它每接收到一条日志都会分析日志的类型, 假设是计数类型的就会更新这个map .假设收到vp-bolt的数据。便会计算两两视频的相似度(youtube的公式)。
整个topology结构代码:
<span style="white-space:pre"> </span>TopologyBuilder builder = new TopologyBuilder();
SpoutConfig spoutConfig = new SpoutConfig(new ZkHosts(conf.getString("zk.server")),
conf.getString("topic"),conf.getString("zk.path"),conf.getString("myid"));
spoutConfig.scheme = new NginxLogScheme();
builder.setSpout("nt-spout" , new NotifierSpout(900) , 1);
builder.setSpout("log-spout", new KafkaSpout(spoutConfig), 3);
builder.setBolt("uv-bolt", new UserVideoAggregationBolt(), conf.getInt("blot.threads"))
.fieldsGrouping("log-spout" , new Fields("cookie")).allGrouping("nt-spout" , "nt");
builder.setBolt("vp-bolt", new VideoPairBolt(), 3).fieldsGrouping("uv-bolt" , "vp" , new Fields("vidPair"))
.allGrouping("nt-spout" , "nt");
builder.setBolt("vc-bolt", new VideoCountBolt(), 3).allGrouping("uv-bolt" , "vc")
.fieldsGrouping("vp-bolt" , "vc" , new Fields("vidPair"))
.allGrouping("nt-spout" , "nt").addConfiguration("mysql.host", conf.getString("mysql.host"))
.addConfiguration("mysql.usr",conf.getString("mysql.usr"))
.addConfiguration("mysql.pass",conf.getString("mysql.pass"))
.addConfiguration("mysql.port",conf.getInt("mysql.port"))
.addConfiguration("mysql.schema",conf.getString("mysql.schema"));
builder.setBolt("rec-redis-bolt" , new RedisRecBolt() , 1).allGrouping("nt-spout" , "nt")
.addConfiguration("mysql.host", conf.getString("mysql.host"))
.addConfiguration("mysql.usr",conf.getString("mysql.usr"))
.addConfiguration("mysql.pass",conf.getString("mysql.pass"))
.addConfiguration("mysql.port",conf.getInt("mysql.port"))
.addConfiguration("mysql.schema",conf.getString("mysql.schema"));
注意事项:
1、bolt的outputcollector对于并发可能报错。须要一个定制的线程安全的outputcollector 。
2、这样的实现方式属于试验性,不知其是否科学
3、storm会自己主动重新启动bolt , 理由是worker heartbeat timeout , 引起这个的问题可能是worker gc的问题。由于我这里有非常多的内存缓存,所以会出现频繁full gc
以至于超时。这样的频繁的full gc非常可能是因为定期向下游放水时短时间内生成大量对象造成的。
4、以上代码仅限结构參考,没有整理。
我们用到了kafka.
基于storm的在线关联规则的更多相关文章
- [翻译] Trident-ML:基于storm的实时在线机器学习库
最近在看一些在线机器学习的东西,看到了trident-ml, 觉得比较有意思,就翻译了一下,方便有兴趣的读者学习. 本文为作者(掰棒子熊)翻译自https://github.com/pmerienne ...
- 一种基于Storm的可扩展即时数据处理架构思考
问题引入 使用storm可以方便的构建一种集群式的数据框架,并通过定义topo来实现业务逻辑. 但使用topo存在一个缺点, topo的处理能力来自于其启动时设置的worker数目,在很多情况下,我们 ...
- 20个最强的基于浏览器的在线代码编辑器 - OPEN资讯
20个最强的基于浏览器的在线代码编辑器 - OPEN资讯 20个最强的基于浏览器的在线代码编辑器
- [项目回顾]基于Redis的在线用户列表解决方案
迁移:基于Redis的在线用户列表解决方案 前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案 ...
- 基于Django的在线考试系统
概述 基于Django的在线考试系统,适配电脑端,可以实现出题,答题,排行榜,倒计时等等等功能 详细 代码下载:http://www.demodashi.com/demo/13923.html 项目目 ...
- 三:基于Storm的实时处理大数据的平台架构设计
一:元数据管理器==>元数据管理器是系统平台的“大脑”,在任务调度中有着重要的作用[1]什么是元数据?--->中介数据,用于描述数据属性的数据.--->具体类型:描述数据结构,数据的 ...
- 基于Storm的WordCount
Storm WordCount 工作过程 Storm 版本: 1.Spout 从外部数据源中读取数据,随机发送一个元组对象出去: 2.SplitBolt 接收 Spout 中输出的元组对象,将元组中的 ...
- SSM开发基于Java EE在线图书销售系统
SSM(Spring+Spring MVC+MyBatis)开发基于Java EE在线图书销售系统 网站成功建立和运行很大部分取决于网站开发前的规划,因此为了在网站建立过程中避免一些不 ...
- 基于Android的在线播放器系统的设计与实现
文章结构: 1 引言 1.1系统的研究背景 现在的时代是互联网的时代,互联网高速发展的同时,无线网络也接入了互联网.社会的各个领域都已经被无线网络渗透.小的比如手机,电脑,电视.大的比如灯光系统,智能 ...
随机推荐
- java 面试 复习 II
1 break 多重 循环跳出当前循环到上层循环再执行. 如若想跳出多重循环可以使用标号 2 byte,short,char都可以隐含转换为int.可以用在switch 表达式.long和str ...
- HTTP基本协议(查看网页代码)
此示例已实现查看网页的代码来理解HTTP基本协议: (返回的是百度首页的网页代码) import java.io.BufferedReader; import java.io.IOException; ...
- PHP中用到的一些字符串函数
/*常用的字符串输出函数 * * echo() 输出字符串 * print() 输出一个或多个字符串 * die() 输出一条信息,并退出当前脚本 * printf() ...
- Android API 中文(77)——AdapterView.OnItemSelectedListener
前言 本章内容是android.widget.AdapterView.OnItemSelectedListener,版本为Android 2.3 r1,翻译来自"cnmahj",欢 ...
- js静态方法和实例方法
js静态方法 function foo(){} // 声明类 foo.method = function(){} // 方法体 使用:foo.method() js实例方法 function foo( ...
- .Net将多个DLL打包为一个DLL(ILMerge)
在做.Net底层编码过程中,为了功能独立,有可能会生成多个DLL,引用时非常不便.这方面微软提供了一个ILMerge工具原版DOS工具,可以将多个DLL合并成一个.下载完成后需要安装一下,然后通过DO ...
- Android学习之DragEvent
关于DragEvent Google Android API中是这么说的 Represents an event that is sent out by the system at various t ...
- JavaSE学习总结第04天_Java基础语法3
04.01 选择结构switch语句的格式及其解释 switch语句的格式: switch(表达式) { case 值1:语句体1;break; case 值2:语句体2;break; ...
- BZOJ 1820: [JSOI2010]Express Service 快递服务( dp )
dp(i,j,k)表示在处理第i个业务, 另外2个在j,k处. 第一维可以滚动... --------------------------------------------------------- ...
- javascript学习(9)——[设计模式]单例
单例模式,相信大家对此都不陌生,我们主要讲下javascript中几个比较常见的设计模式: (1).普通的单体 (2).具有局部变量的强大单体 (3).惰性单体 (4).分支单体 下面我们就一一进行介 ...