Storm Akka Finagle对比及使用场景分析

标签: storm akka finagle | 发表时间:2013-12-13 00:16 | 作者:jmppok
出处:http://blog.csdn.net

本文翻译自: http://blog.samibadawi.com/2013/04/akka-vs-finagle-vs-storm.html

By jmppok at 2013.12.12


Storm Akka Finagle对比及使用场景分析


1 概述

Storm、Akka、Finagle是三个开源的分布式并行处理框架,都基于JVM运行。
他们在解决下面这些问题上十分有用:
1)实时数据分析;
2)构建包含大量输入输出的复杂网站;
3)金融;
4)多人在线游戏;
5)大数据;

三个框架针对不同的问题进行了优化,但我们具体应该使用哪个框架来解决哪些问题呢?下面进行具体的分析。

2.30秒,简单回顾并行处理历史


并行/并发程序设计十分困难,C/C++在1990s开始支持最基本的并行处理。

1995年Java引入了monitor机制(多线程),从而简化了在单机上的并行程序设计,但是当你有大量线程时很容易出现死锁问题,同时多线程也无法实现基于多台机器的并行计算。

随着数据量的不断增长,大数据越来越需要一个更好的并行处理框架。

3.MapReduce 和Hadoop

Hadoop是Google 并行处理框架MapReduce的开源实现,它是一个批处理系统,通过将一个算法拆分为一系列的Map和Reduce步骤实现并行。其中Map是完全并行的,Reduce收集Map的处理结果。

Hadoop本身的学习曲线很高,有大量的依赖库/软件,因此除非你没有其他选择,最好不要使用Hadoop。
其他的一些基于Hadoop的并行框架,如Hive,Pig,Scalding,Scoobi,Scrunch和Spark,虽然他们声称很简单,但实际上仍然是很复杂的。
Hadoop的响应时间很长,不适用于实时应用。

Storm,Akka,Finagle则更加简单,并且更适合实时应用。

4.Storm

Storm由twitter开发,并在2011年开源。它由Clojure和Java实现,但同时也支持Scala。Storm非常适合用于实时海量数据的统计和分析。
Storm通过一个称为Topology的图来描述流式计算:在一个Topology中,首先通过定义一些Spouts来收集输入数据,在Spout后面是一些Bolts,Bolts可以接收并处理任意Spouts或它前面的Bolts的输出数据,唯一的要求是不能出现环路。

Storm主要特性:
1)Storm封装了各个节点间,以及Bolts间的通讯;
2)维护Bolt的实例数,并平均分配所有Bolt到集群中;
3)在硬件或网络故障时,能很好的恢复;
4)Storm不处理计算任务内部的错误;
5)可以分析Twitter的多种数据
6)可以使用多种语言创建Bolt,因为它使用了thrift(译者:这一点说的不对,多语言支持是通过ShellBolt,原理是通过Std input和Output进行消息交互)
7)原生支持Ruby,Python和Fancy

下面是Storm的一个例子 Word counter,就不再翻译了,感兴趣的可以到Storm网站学习。

5.Akka

Akka 0.6版本在2010年第一次发布。现在版本是2.2,由TypeSafe负责更新维护(Scala也是由该公司更新维护),Akka由Scala和Java实现。

Akka特性:
1)Akka基于Erlang语言,Erlang语言出要用于电信系统,具有很好的并发性和容错机制;
2)Akka可以极大地简化并行处理程序的开发,你需要将任务划分成更小的字任务,这些字任务由大量的actors来处理;
3)可以实现双向通讯;
4)Actor间通过邮箱地址相互通讯,每个Actor都是单线程执行;
5)Akka的原则是:如果有错误,就让他尽早出现;
6)当一个Actor失效时,Akka有多种恢复机制;
7)多个Actor可以共享的访问一个资源,如果cache;
8)Actor是轻量级的,1GB内存中可以创建2700000个Actor;
9)在Akka的线程池中,有一个执行时上下文(execution context);
10)在带宽受限的情况向,Akka工作良好;
11)未来将会实现异步的原子计算;
12)将通过Oz语言引入数据流变量;

应用场景:
1)代理
2)建模
3)社会媒体
4)多人在线游戏
5)金融
6)在线赌博

6.Finagle

Finagle是由Twitter研发,并于2011年开源,它由Scala和Java实现。
Finagle使多种协议通讯成为可能,他实现了RPC Server和Client。

Finagle特性:
1)非常简单的就可以为应用创建Server和Client;
2)服务之间可以远程调用;
3)实现不同协议间的交互,如HTTP,Thrift,Memcashed;
4)server容错;
5)可以基于一个服务,查找其他服务
6)统一的错误处理;
7)统一的重试机制;
8)双向通讯;
9)负载均衡;
10)复杂的原子计算


应用场景:
1)复杂网站,使用多种服务和协议
2)网络爬虫

7.Storm VS Akka

Akka的actor可以实现双向通讯,但你必须维护所有actor的不同状态,Akka的actor更加灵活,但使用复杂。
Storm中stream是预先定义的,从一个Bolt流向另一个Bolt,使用非常简单。

8.Storm vs Finagle

Storm和Finagle都有很好容错机制。
Finagle可以实现双向通讯。
Storm只能实现单向通讯,但是十分简单。

9.Akka vs Finagle

Akka和Finagle都可以实现双向通讯;
Akka中所有东西都是一个Actor(本地或远程),各个Actor之间通讯非常简单。
Finagle相对比较复杂,它别是你要实现不同服务和协议之间的通讯时。

10.三个框架的对象序列化

三个框架都存在对象序列化的问题,因为他们都需要在机器之间传送数据,Java的serialization有以下问题:
1)繁琐
2)无法处理Scala的singleton object

下面是三个Scala的开源库:

    https://github.com/harrah/sbinary
    https://github.com/spray/spray-json
    https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/


11.个人的一些经验

对我来说,尽管作了很多调研,并有一些经验,也很难说使用哪个框架来解决哪个问题。
开始的时候,我在一个数据分析中使用Storm,Storm非常适合,而且十分简单。
后来我转而开始时使用Akka,因为以下几点:
1)很多子系统都是由scala实现的;
2)异步调用第三方服务是会失败;
3)需要启动后台服务;

现在,数据分析中需要使用一些内部或第三方的服务(Scala或其他语言实现),我正在考虑使用Finagle。

12.总结

学习并行处理是一个兴奋得话题,因为并行程序像大脑一样工作,他可以解决我们的协同问题。
我并不知道你如何使用它。
最后:
Storm,Akka,Finagle,MapReduce是不同的并行处理框架,他们都非常有用。
作者:jmppok 发表于2013-12-12 16:16:33 原文链接
阅读:107 评论:0 查看评论

相关 [storm akka finagle] 推荐:

Storm Akka Finagle对比及使用场景分析

- - CSDN博客云计算推荐文章
本文翻译自: http://blog.samibadawi.com/2013/04/akka-vs-finagle-vs-storm.html. Storm Akka Finagle对比及使用场景分析. Storm、Akka、Finagle是三个开源的分布式并行处理框架,都基于JVM运行. 他们在解决下面这些问题上十分有用:.

Akka 和 Storm 的设计差异

- - zzm
Akka 和 Storm 的设计差异. Akka 和 Storm 都是实现低延时, 高吞吐量计算的重要工具. 如果说 Akka 是 linux 内核的话, storm 更像是类似 Ubuntu 的发行版.然而 Storm. 并非 Akka 的发行版, 或许说 Akka 比作 BSD, Storm 比作 Ubuntu 更合适..

java 协程 实现 Akka

- - zzm
Akka是开源的,可以通过Apache 2许可获得. 可以从 http://akka.io/downloads/ 下载.         对并发/并行程序的简单的、高级别的抽象.         异步、非阻塞、高性能的事件驱动编程模型.         非常轻量的事件驱动处理(1G内存可容纳约270万个actors).

Akka简单性能分析

- - 并发编程网 - ifeve.com
因为最近工作的关系,要把异步任务从应用服务器中拆分到专门的异步处理服务器中. 是采用MQ的方式将任务消息发出,在服务端进行处理,如下图所示:. 这种方案是采用MQ作为中间的媒介,在服务端采用线程池异步处理任务,处理完成之后将结果发送到MQ中,客户端采用侦听的方式得到结果继续进行处理. 这种方案的不足是,可能在某些需求的情况下,需要将结果存放到共享的HashMap或者Threadlocal中进行存放结果,客户端会一直阻塞,直到得到结果,从多线程的角度来说,还是用了共享变量,虽然共享变量可能是线程安全的,但是从并发模型的角度来讲,并不是一个最好的方式.

storm简介

- - 搜索技术博客-淘宝
伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样、更加便捷,同时对于信息的时效性要求也越来越高. 举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这个宝贝马上就可以被卖家搜索出来、点击、购买啦,相反,如果这个宝贝要等到第二天或者更久才可以被搜出来,估计这个大哥就要骂娘了.

Storm Trident 学习

- - 小火箭
Storm支持的三种语义:. 至少一次语义的Topology写法. 参考资料: Storm消息的可靠性保障 Storm提供了Acker的机制来保证数据至少被处理一次,是由编程人员决定是否使用这一特性,要使用这一特性需要:. 在Spout emit时添加一个MsgID,那么ack和fail方法将会被调用当Tuple被正确地处理了或发生了错误.

Storm实战之WordCount

- - 编程语言 - ITeye博客
 在全面介绍Storm之前,我们先通过一个简单的Demo让大家整体感受一下什么是Storm. 本地模式(Local Mode): 即Topology(相当于一个任务,后续会详细讲解)  运行在本地机器的单一JVM上,这个模式主要用来开发、调试. 远程模式(Remote Mode):在这个模式,我们把我们的Topology提交到集群,在这个模式中,Storm的所有组件都是线程安全的,因为它们都会运行在不同的Jvm或物理机器上,这个模式就是正式的生产模式.

Finagle:一个支持多协议的RPC系统

- - 互联网旁观者
Finagle是一个协议不可知的,异步的,用于 JVM 的 RPC 系统,它使得在 Java、Scala 或任何基于 JVM 的语言重构建鲁棒的客户端和服务器非常容易. 在 Twitter.com 上面即使是渲染最简单的网页也需要十多个说着不同协议的网络服务的合作. 比如,为了渲染首页,应用程序需要向社交网络图(Social Graph)服务、Memcached、数据库、以及许多其它网络服务发出请求.

storm常见问题解答

- - BlogJava-庄周梦蝶
    最近有朋友给我邮件问一些storm的问题,集中解答在这里. 一、我有一个数据文件,或者我有一个系统里面有数据,怎么导入storm做计算. 你需要实现一个Spout,Spout负责将数据emit到storm系统里,交给bolts计算. 怎么实现spout可以参考官方的kestrel spout实现:.

Storm 实时性分析

- - CSDN博客架构设计推荐文章
都说Storm是一个实时流处理系统,但Storm的实时性体现在什么方面呢. 首先有一个前提:这里的实时性和我们通常所说的实时系统(芯片+汇编或C编写的实时处理软件)的实时性肯定是没法比的,也不是同一个概念. 这里的实时性应该是一个相对的实时性(相对于Hadoop之类 ). 总结一下,Storm的实时性可能主要体现在:.