前言:
去年我们团队开始研究Storm,并成功的利用其框架优势解决了很多MapReduce无法涉及的实时计算业务。
接下来我将介绍如何在Storm上实现BP神经网络(BP Neural Networks,以下简称BNN或NN),并提供一套我去年写的Demo源码(Java)。我们SkyNet系统中的神经网络模块就是基于这个Demo改编的,整体效果还算令人满意。
源码我在CSDN社区公开了,欢饮各位拍砖:http://bbs.csdn.net/topics/390717623
本文不会对Storm做太多的介绍,如果你是一位Storm初学者,可以去徐明明的博客学习。
本文是CSDN-撸大湿原创,如要转载请注明出处,谢谢:http://blog.csdn.net/tntzbzc/article/details/19974515
----------------------------------------------------------------------------------------------------------------------
一 、Storm
“Storm是一个分布式的、容错的实时计算系统,基本是用Clojure写的。Storm也可被用于“连续计算”(continuous computation),对数据流做连续查询,在计算时就将结果以流的形式输出给用户。它还可被用于“分布式RPC”,以并行的方式运行昂贵的运算。”(引用自百度百科)
Storm(左图) / MapReduce(右图)
特别要注意这两个关键字:分布式和连续计算。
Storm和MapReduce一样,有很好的水平扩展能力,伸缩性很强。它可以像Hadoop那样被部署在多台机器上,实现集群架构。
虽然Storm和MapReduce有很多相似之处,但是他们任然有很大的区别:
1、Job的生命周期:MapReduce是一个批量计算框架,Storm更像一组水管,它可以不停的计算。Storm Job(Topology)的生命周期是永久的,只要我们不关闭它,Job将一直运行下去。而MR的Job一旦结束后,整个计算也就结束了。如果想要在跑一个相对同的job,就需要重新启动它。
2、数据传递方式:MR中Map与Reduce之间传递的数据必须落地(写入磁盘),而Storm则不需要(通过ZeroMQ/Netty实现消息传递)。
3、计算单元层数:MR实际上就是一层Map和一层Reduce单元组成,而Storm则有一层Spout单元和N层Bolt单元组成。在Storm中Bolt的层数是可以被自定义的。而在MR中就很难做到这样一点,往往我们都是利用多个MR Job的叠加,去实现一些复杂的运算。
4、计算延时:Storm通过DRPC可以实现很多实时的数据查询业务,而MR做不到(也没必要去实现这个功能)。
为了弥补MR的缺陷,我们才引入了Storm解决方案。接下来通过一个场景(CCU的实时计算)来解释一下Storm的作用。
CCU 是 Concurrent user 的缩写,意思是“同时在线人数”,表示某个时间,同时有多少玩家在进行游戏。同时在线玩家越多,表示游戏越受欢迎。因为付费玩家数量通常和同时在线人数呈现一定比例,因此知道CCU就可以大致推算出一个游戏的营收水平,所以CCU是衡量游戏运营好坏的重要指标之一。依照使用环境不同,有时可以特指“平均在线人数”或“最高在线人数”。(最高在线人数也称为PCU或PCCU)。CCU和PV/UV指标很相似。
一天,CTO跟我说:管理层想看新上线游戏的实时CCU。当时,这个需要很让我头疼,因为我们游戏的CCU是通过玩家登入/登出游戏的日志数据算出来的。我们后台有一个MapReduce Job,每10分钟跑一次算出当前CCU再写入HBase/MySQL中,业务人员每10分钟可以查到一个新数据。
其实CCU的算法很简单,问题并不是算法,而是计算框架。我们的离线计算全部用MR实现的,但这10分钟一次的Job根本无法满足需求,咋办?还好Storm救了我,我们只要实现一个"通过Log File"流读取的方法(Spout),并把数据输送给计算CCU的Bolt。这样Bolt就可以把源源不断的新数据进行CCU计算,并把结果emit出来。我贴一段CCU的Bolt代码,大家一看便明白了。
public static class CCU extends BaseBasicBolt {
int CCUcount = 0; //CCU数量
@Override
public void execute(Tuple tuple, BasicOutputCollector collector) {
int Type = tuple.getInteger(1) //类型 0登入 1登出
if(Type==0){
++CCUcount;
}else{
--CCUcount;
}
collector.emit(new Values(CCUcount));
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("CCUcount"));
}
}
简单吧,就这么一小段代码,只要你熟悉Storm,并且懂一点点Java,2分钟搞定。就这么简单?如果你是一个Storm初学者,可能会觉得撸大湿在忽悠你。是的,我是在忽悠初学者!Storm没那么简单,所谓的"简单"只针对那些熟悉Storm的技术人员。初学想要完成这段代码前,一定会经历很多波折,就像我当初学习Hadoop那样。所以我建议新手好好去学习一下Storm的相关基础,少走弯路。
Storm讲的差不多了,现在进入下一个主题“神经网络”,在介绍神经网络之前,首先介绍一下我们公司SkyNet(天网)系统。
二 、神经网络(NN)
看过施瓦辛格主演的电影《魔鬼终结者》的童鞋,应该对“天网”很熟悉。《魔鬼终结者》中终结者机器人就是天网制造的。
在电影中,天网是一个智能AI计算机系统(和黑客帝国中的Matrix很相似),天网和我们人类一样有自己的意识,并且具有很强的学习能力。
我们团队很想做一个像天网那样的智能系统(美好的梦想),所以最后绝对把系统起名为“SkyNet:天网”。
作为一个半智能系统,天网的一个重要工作就是解决数据分类问题。
数据分类很重要吗?我很负责任的回答:是的,非常重要!在数据分析难题中,解决数据分类问题就等于解决了90%的问题。
数据分类在天网系统中由“决策树”和“智能分类”组成,而智能分类中有一个重要组件:“神经网络”。
在天网系统中,Hadoop/Storm/Spark好比一架空客A380骨架,而智能分类则是A380其中的一个发动机引擎(A380有4个引擎)。两者结合在一起才能发挥最大威力!
下面来介绍一下什么是神经网络,它到底是怎么工作的。
今天就写到这,明天继续更新
待续。。。。。