基于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系统的研究背景 现在的时代是互联网的时代,互联网高速发展的同时,无线网络也接入了互联网.社会的各个领域都已经被无线网络渗透.小的比如手机,电脑,电视.大的比如灯光系统,智能 ...
随机推荐
- kinect for windows - DepthBasics-D2D详解之三
这篇文章我们将总结一下,之前两篇文章中提到的Kinect SDK的函数接. 函数接口: NuiGetSensorCount: 获取连接的Kinect设备个数 原型:_Check_return_ HRE ...
- paip.最新的c++ qt5.1.1环境搭建跟hello world
paip.最新的c++ qt5.1.1环境搭建跟hello world 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://bl ...
- 无法编辑的word解密
打开文档后,将其另存为XML文件,然后用UltraEdit(或者EditPlus,下载华军里搜索一下就行了)这个编辑软件打开刚刚存储的 XLM文件,查找<w:documentProtection ...
- Arduino101 中使用 Mirf 库的问题(2016-04-04)
Mirf 库在使用 NRF24L01 的时候接触到,感觉很好用.但在用 Arduino101 的时候遇到一些问题,记录一下,对于底层不了解,希望有熟悉的同学能给点指点: 编译会提示 MirfHardw ...
- POJ 1256.Anagram
2015-06-04 问题简述: 输出一串字符的全排列,顺序不同于一般的字母序,而是 A<a<B<b......<Z<z.所以应该重写一个比较函数. 原题链接:http: ...
- nginx根据条件跳转+跳转规则
好的参考博文: nginx rewrite规则 自己写的时候参考这两个 Nginx 伪静态Rewrite,重定向Location配置总结(转) nginx rewrite规则语法 一.输入子目录跳转 ...
- [LeetCode]题解(python):018-4Sum
题目来源: https://leetcode.com/problems/4sum/ 题意分析: 这道题目和3Sum的题目类似,找出所有的4个数,使得这4个数等于target. 题目思路: 这道题做法和 ...
- Android 网络交互之MD5为什么要加盐
MD5为什么要加盐 之前面试的时候,遇到一个面试的哥哥.不停的跟我确认我对网络传输过程中的password进行MD5加密的时候,是否加key了. 当时我很纳闷,因为MD5本身已经是不可逆的了,需要破解 ...
- 图的BFS代码
图是严蔚敏书上P168的图, 图的邻接表存储,DFS可以看以前写的文章:http://www.cnblogs.com/youxin/archive/2012/07/28/2613362.html ]; ...
- kinect for windows - 环境搭建
我是在虚拟机上搭建的开发环境,需要准备如下软件: 1)vmware workstation 10.0.2 (可以去官网下载,key就自己百度吧) 2)win7 32位(一定是32位的) 3)vs201 ...