快速理解SAMZA, streaming on kafka

来源:互联网 发布:视频剪辑的电脑软件 编辑:程序博客网 时间:2024/05/17 22:49

作者:刘旭晖 Raymond 转载请注明出处

Email:colorant at 163.com

BLOG:http://blog.csdn.net/colorant/


==是什么 ==

 

要了解Samza,最好先了解Kafka : http://blog.csdn.net/colorant/article/details/12081909

 

samza是一个分布式的流式数据处理框架(streaming processing),它是基于Kafka消息队列来实现类实时的流式数据处理的。(准确的说,samza是通过模块化的形式来使用kafka的,因此可以构架在其他消息队列框架上,但出发点和默认实现是基于kafka)

 

==如何实现 ==

 

作为一个分布式的消息队列系统,kafka已经实现了流式处理框架底层的许多核心基础架构,把消息串联流动起来就是Streaming了。但是要构建一个可用的流式数据处理框架,还是有许多事情要做。例如生产者和消费者进程的管理,作业调度和容错处理,辅助工具和监控管理手段,更友好方便的用户接口等等,本质上说,Samza是在消息队列系统上的更高层的抽象,是一种应用流式处理框架在消息队列系统上的一种应用模式的实现。

 

 

核心思想

 

Samza的一个job的基本处理流程是一个用户任务从一个或多个输入流中读取数据,再输出到一个或多个输出流中,具体映射到kafka上就是从一个或多个topic读入数据,再写出到另一个或多个topic中去。多个job串联起来就完成了流式的数据处理流程。




这种模式其实有点像MapReduce的过程,stream输入部分由kafkapartition决定了分区和task数目,类似于一个Map过程,输出时由用户task指定topic和分区(或者框架自动由Key决定分区),这相当于一次shuffle的过程,下一个job读取新的stream时,可以认为是一个reduce,也可以认为是下一个map过程的开始。

 

不同之处在于job之间的串联无需等待上一个job的结束,类实时的消息分发机制决定了整个串联的job是连续不间断的,亦即流式的。

 

调度

 

Samza使用Yarn进行资源分配和任务调度(调度模块同样是可以替换的)

 


 

Samza AM负责job调度,Task runner 负责用户task的运行,依靠kafkaYARN的帮助,samza得以实现其分布式 /容错性 /可扩展 /持久性等方面的特性。

 

kafka相关

 

由于samza默认实现是基于kafka的,由此kafka的系统设计也给samza带来了一些其它流式处理系统框架所没有或难以实现的特性。比如kafkamessagePull模式和持久化的设计带来的Buffer缓冲空间,使得每个samzajob可以无需要求实时完成数据处理,加上task的串联是通过对相关消息的订阅来实现的,也就是说串联的task之间可以独立的运行/停止,更不容易发生阻塞在一个处理节点上等问题,相互进度也无需保持严格一致,应用模式上更加灵活,比如可以串联批量处理任务等。

 

状态管理

 

流式处理框架通常需要处理的一个问题就是状态管理,由于数据是连续流动的,本身并不提供任何历史状态信息,在需要依靠历史数据完成相关处理的应用场合(比如窗口类的数据应用,Join类操作等等),就需要一个机制来获取历史数据,samza提供了一个内建per taskKey-valuebased的数据库(基于LevelDB,运行在JVM外部,延续kafka减少JVM内部内存使用的原则)来存储历史数据,同时也可以通过向特定topicmessage的方式来log本地数据。

 

不采用外部数据库来存储的原因,一是考虑外部数据库的吞吐率,二是为了减少并发操作带来的复杂性,再有就是在任务失败重起时很难回滚数据。

 

==小结 ==

 

总体来说,Samza基本上就是一个使用Yarnkafka的流式数据处理应用程序框架,自身额外提供了本地数据库保存状态信息,代码量并不大(数千行代码),本质上是为了更加方便的使用kafka来处理数据。

 

== Links ==

 

http://samza.incubator.apache.org/

https://github.com/apache/incubator-samza

https://github.com/linkedin/hello-samza

原创粉丝点击