本文翻译自: 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
原文链接