[置顶] 【Apache Samza 系列】实时流数据处理框架Samza中文教程 (二)-- 背景

背景

本章介绍了关于流式计算的一些背景,描述了什么是samza,以及samza为什么会被构建出来。

什么是消息?

消息系统是实现近实时的异步计算的流行方式。当有消息产生时可以被放入一个消息队列(ActiveMQ,RabbitMQ)、发布-订阅系统(Kestrel,Kafka)或者日志聚合系统(Flume、Scribe)。下游消费者从这些系统中读取信息,并对其进行处理,或基于该消息的内容执行下一步操作。

假设你有一个网站,每次有人加载一个页面,你发送一个“用户浏览的网页”事件消息系统。那么你可能会有消费者对其做以下的操作:

  • 将数据存储到Hadoop以提供未来数据分析之用
  • 对页面访问量进行统计,并更新到仪表板提供数据参考
  • 当页面访问异常时出发告警
  • 发送邮件通知其他用户
  • 加入页面查看事件与用户的配置文件,并返回消息系统发送消息

总的来说,消息系统能解耦所有这些来自实际网页服务的工作。

什么是流式处理?

一个信息系统是一个相当低层次的基础设施–其存储消息并等待消费者去消费信息。当你开始编写代码去产生或消费消息时,你很快就会发现,有很多棘手的问题,必须在处理层解决。samza旨在帮助解决这些问题。

在我们上面提到的消费者操作实例(计算PV以及更新仪表板)中:
如果你的消费者挂掉,而且你的计算数值丢失时会发生什么?
你又要如何去恢复?
当服务重启之后又该从哪里开始处理?
如果底层的消息系统重复发送了一条信息或者丢失了一条消息又该怎么办?(如果你的处理不够细致,那么你的计数会是错误的)
如果你想根据用户访问的网页URL进行分组统计呢?
当一台服务器访问量过大时,你如何将数据分流到多台机器上进行分布式计算?

流处理是在消息系统中的一个高层次的抽象,它所要解决的正是以上提到的这类问题。

Samza

samza是流处理框架具有以下特点:

  • 简单的API:Samza提供了一个简单基于回调且兼容MapReduce的消息处理API
  • 状态管理:Samza提供了一个基于LevelDB的Key/Value数据库来存储历史数据,从而实现了有状态的消息管理
  • 容错处理:每当集群中的一台机器发生故障时,YARN将会透明地将相关任务迁移到其他机器上
  • 持久性:Samza使用Kafka保证消息的有序处理,并能够持久化到分区,不存在发生消息的丢失的可能
  • 可扩展性:Samza在每个层结构都是可分区和分布式的,Kafka提供了有序、可分区、可追加、容错的流;YARN提供了一个分布式、供Samza运行的容器环境。
  • 可插拔/开箱即用:Samza提供了一个可插拔特性的API,该API使得Samza不仅能够使用Kafka和YARN,还能够使用其他的消息系统和执行环境。
  • 资源隔离:通过使用YARN实现了对Hadoop安全模型和资源隔离的支持

目前可用的开源流处理系统实际上是相当年轻,没有一个系统提供了完整的解决方案。
在这方面的新问题:如何一个流处理器的状态进行管理,是否流应该缓冲远程磁盘上,当重复接收信息或信息丢失时应该怎么做,以及如何模型底层消息传递系统。
Samza与现有开源流处理系统主要区别:

  • Samza支持本地状态的容错。状态本身作为一个流被构造。如果本地状态丢失,那么状态流会回放重新存储它
  • 流是有序、分区的、可回放的并且是容错的;
  • YARN用来处理隔离、安全和容错
  • 任务之间是相互解耦的:如果有一个任务慢了并且造成了消息的积压,系统其它部分不会受到影响

samza上更深入的讨论,以及它如何与其他数据流处理系统的比较,请看samza的概述文档。

你可能感兴趣的:(实时计算,Samza,流处理)