这一页提供了关于流处理的背景知识,描述什么是Samza,以及它为何而生。
what is messaging?什么叫消息?
消息系统是用来实现近实时异步计算的一种流行方式。当事件发生时,消息可以被放在消息队列里(ActiveMQ, RabbitMQ),发布-订阅系统(Kestrel, Kafka)里,或者日志汇集系统(Flume,Scribe)里。下游的消费者从这些系统里读消息,进行处理,或者根据消息内容采取行动。
假如你有一个网站,并且每次有人加载一个网页,就发送发一个"用户查看了页面"的消息到消息系统。你可能会有做以下任意事情的consumer:
- 把消息存储到Hadoop,用来以后分析
- 计算页面访问量并且更新到dashboard
- 如果页面访问失败,触发一个警报Background
- 发送一个电子邮件通知另一个用户
- 把页面访问事件和用户的档案合在一起,把合并后的消息发回给消息系统
一个消息系统使你将以上的工作和实际的网页服务解耦合。
What is stream processing? 什么叫流处理
一个消息系统是相当低层级一部分基础设施——它存储消息,等待consumers来消费它。当你开始写代码来生产或消费消息,你很快就会发现在处理层有很多难对付的问题。Samza的目标就是帮助解决这些问题。
用上面的网页访问计数的例子(计算访问量,然后更新dashboard)来说。你的消费者运行在的机器出现故障,并且你当前的计数器的值丢失了,将会发生什么?你怎么来恢复?当处理程序重启时,它应该在哪运行?如果底层的消息系统发送给你两次同样的消息,或者丢失一个消息,应该怎么办?(除非你很小心,否则你的计数器可能就不正确了)。如果单独一台机器没有足够的计算能力,你怎么把计算分布到多台机器上。
流处理是消息系统之上的更高级别的抽象,它就是用来精确地解决这一类问题。
Samza
samza是一个流处理框架,它有以下特性:
- 简单的API:不像大多数低层级的消息系统的API,Samza提供了一个非常简单的,基于回调的 “消息处理” API,和MapReduce类似。
- 受控的状态:Samza管理“流处理器”的快照和恢复。当一个流处理器重启,Samza会恢复它的状态到一个一致的快照。Samza被构建来处理大规模的状态(每个分区数GB).
- 容错:当集群中的任何一个机器发生故障,Samza和YARN一起透明地迁移你的task到另一台机器。
- Durability持久性: Samza使用Kafka来保证消息按照他们写入一个partition的顺序被处理,并且不会有消息丢失。
- Scalability可扩展:Samza在各个层面上都是分区的以及分布式的。Kafka提供了有序的、分区的、可回放的、容错的消息流。YARN提供给Samza容器一个分布式的环境来运行。
- Pluggable可插拔的:虽然Samza自带对Kafka和YARN的支持,但是Samza同时提供了可插拔的API来让你在别的消息系统和运行环境中运行Samza。
- Processor isolation处理器隔离:Samza与Apache YARN一起工作。YARN提供了Hadoop的安全模型,以及利用Linux CGruops的资源隔离。
其它选择
现在可用的开源流处理系统都实际上非常新,没有一个单独的系统提供了所有的解决方案。这个领域的新问题包括:怎么管理流处理器的状态?是否一个流应该被远程缓存在硬盘上?当重复的消息被接收或者消息丢失时应该怎么做?怎么对底层的消息系统建模?
Samza的主要区分点在于:
- Samza支持本地状态的容错。状态可以被想象成一些表,它们被分成很多块,和各个处理工作分布到一起。状态本身被建模成一个流。如果本地状态由于机器故障丢失,状态流就会被回放,以重建它。
- 流是有序的、分区的、可以回放的、容错的
- YARN被用来做处理器隔离、安全、以及容错
- 任务之间是解耦合的:如果一个job很慢,积压了一些未处理的消息,其它的系统不会受影响。
如果想要一个对Smaza更深层的讨论,以及它和其它的流处理系统的关系,看一下Samza的Comparision文档吧。