Storm 分布式BP神经网络(开源)

来源:互联网 发布:ios 10.0越狱工具 mac 编辑:程序博客网 时间:2024/06/03 15:04
一 、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代码,大家一看便明白了。
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static class CCU extends BaseBasicBolt {  
  2.         int CCUcount = 0//CCU数量  
  3.         @Override  
  4.         public void execute(Tuple tuple, BasicOutputCollector collector) {  
  5.             int Type = tuple.getInteger(1//类型 0登入 1登出  
  6.             if(Type==0){  
  7.                 ++CCUcount;  
  8.             }else{  
  9.                 --CCUcount;  
  10.             }  
  11.             collector.emit(new Values(CCUcount));                 
  12.         }  
  13.         @Override  
  14.         public void declareOutputFields(OutputFieldsDeclarer declarer) {  
  15.             declarer.declare(new Fields("CCUcount"));  
  16.         }         
  17. }  
简单吧,就这么一小段代码,只要你熟悉Storm,并且懂一点点Java,2分钟搞定大笑。就这么简单?如果你是一个Storm初学者,可能会觉得撸大湿在忽悠你。是的,我是在忽悠初学者!Storm没那么简单,所谓的"简单"只针对那些熟悉Storm的技术人员。初学想要完成这段代码前,一定会经历很多波折,就像我当初学习Hadoop那样。所以我建议新手好好去学习一下Storm的相关基础,少走弯路。
Storm讲的差不多了,现在进入下一个主题“神经网络”,在介绍神经网络之前,首先介绍一下我们公司SkyNet(天网)系统。

二 、神经网络(NN)

  
看过施瓦辛格主演的电影《魔鬼终结者》的童鞋,应该对“天网”很熟悉。《魔鬼终结者》中终结者机器人就是天网制造的。
在电影中,天网是一个智能AI计算机系统(和黑客帝国中的Matrix很相似),天网和我们人类一样有自己的意识,并且具有很强的学习能力。
我们团队很想做一个像天网那样的智能系统(美好的梦想大笑),所以最后绝对把系统起名为“SkyNet:天网”。

作为一个半智能系统,天网的一个重要工作就是解决数据分类问题。
数据分类很重要吗?我很负责任的回答:是的,非常重要!在数据分析难题中,解决数据分类问题就等于解决了90%的问题。

数据分类在天网系统中由“决策树”和“智能分类”组成,而智能分类中有一个重要组件:“神经网络”。

在天网系统中,Hadoop/Storm/Spark好比一架空客A380骨架,而智能分类则是A380其中的一个发动机引擎(A380有4个引擎)。两者结合在一起才能发挥最大威力!


文章来源:http://blog.csdn.net/tntzbzc/article/details/19974515

0 0