基于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系统的研究背景 现在的时代是互联网的时代,互联网高速发展的同时,无线网络也接入了互联网.社会的各个领域都已经被无线网络渗透.小的比如手机,电脑,电视.大的比如灯光系统,智能 ...
随机推荐
- WEB和APP谁是互联网未来
据中国多家权威报告显示,作为多年专业化互联网公司炎帝网络科技综合评估预测,预计2016年全球互联网设备将达到100亿部.如果届时全球人口达到73亿,意味着平均每人将有1.4部设备.智能交通将增长50倍 ...
- C/C++程序员面试大纲
基础篇:操作系统.计算机网络.设计模式一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会写 ...
- 使用Linux静态库
查看静态库.a文件包含的内容用下面的命令解压: ar x libgdal.a 然后就可以查看文件了: ls adler32.o cpl_recode.o dted_create.o gdalpamra ...
- 【水一发next_permutation】poj 1146——ID Codesm
来源:点击打开链接 求字典序下一位,没有直接输出没有.全排列函数秒水过. #include <iostream> #include <algorithm> #include & ...
- 感觉挺有意思的SQL题目
1.有如下数据,要求查询每个班最低分和最高分,并将最高分与最低分显示为同一列 ID Student CourseName Score1 张三 English 802 张三 Math 703 张三 Ch ...
- ASP.NET常用内置对象
ASP.NET 常用内置对象:Response对象.Request对象.Session对象.Server对象.Application对象 1.Response对象: (1) 用于向浏览器输出信息 常用 ...
- C#语言基础之数据类型
数据类型 1.值类型(1)整型:有符号整型和无符号整型. 区别是无符号整型要比有符号整型的正数范围大.2X+1 有符号整型:sbyte,short,int,long 带有正负数,范围按所写依次增大 ...
- Tableau Server 8.0 升级到 8.3 过程记录
一.使用账号(管理员权限),安装文件复制到服务器 二.检查维护状态 如果维护状态过期,更新到新版本会变成未授权. 先进Manage Product Keys刷新一下维护日期(其实不刷新也无所谓.到时候 ...
- 杭电ACM 2052 Picture
Picture Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 转: 如何实现jQuery的Ajax文件上传
[PHP文件上传] 在开始之前,我觉得是有必要把通WEB上传文件的原理简单说一下的.实际上,在这里不管是PHP,JSP,还是ASP处理上传的文件,其实都是WEB早已把文件上传到服务器了,我们只是运用上 ...