S4分布式流计算引擎

S4分布式流计算引擎

背景

最近花了点时间研究了下分布式计算这一块的内容。领导给的第一个任务,就是学习下S4和GridGain。花了几天的时间把s4的源码看了下,把自己的理解和学习的内容做一个记录。 下一篇会是GridGain的分享

学习

  • s4的论文:
  • s4的官网:    s4是什么?    1.  s4的全称 :  Simple Scalable Streaming System (简单的描述:分布式流计算系统)    2.  特点:
  • distributed(分布式)
  • scalable(扩展性)
  • partially fault-toleran(部分容错性)
  • pluggable (可插拔)    3. 产生的原因:
  • Yahoo发起,主要用于解决"cost-per-click“广告,通过实时计算预测用户对广告的可能的点击行为。
  • 不用hadoop的原因: hadoop主要解决batch处理,基于mapReduce对可控的数据的进行处理。而流计算是针对不可控的点击事件,对实时性有严格要求。    4.  适用的场景:
  • 业务允许部分容错性。 (s4没有严格的failover机制,运行节点突然crash时,会导致当前节点中的数据丢失。后续的请求会failover到其他的节点上)

S4的设计:

容器概念()

  1. PE : Processing Elements (处理节点)
    * emit one or more events which may be consumed by other PEs,
    * publish results, possibly to an external data store or consumer.
  2. Events :  message   (消息)
    * arbitrary Java Objects
    * passed between PEs. (send and receive)
  3. PEC : processing element container  (处理节点容器)
    * invokes the appropriate PEs in the appropriate order
  4. node : a Processing Endpoint  (机器节点)
    * a jvm instance
    * contains a PEC
  5. cluster: a group nodes  (节点集群)

说明:

  • 一个cluster包含多个node
  • 每个node包含一个PE Container
  • 每个PE Container 包含多个PE
  • 每个PE消费Events,生成新的Events并传递给下一个PE

总体结构图:

www.zeeklog.com  - S4分布式流计算引擎
  1. PE Container/PE
  2. EventListenter
  3. Dispatcher, EventEmitter
  4. Communcation

PE内部概念:(4个部分组成)

  • its functionality as defined by a PE class and associated configuration,
  • the named stream that it consumes,
  • the keyed attribute in those events, and
  • the value of the keyed attribute in events which it consumers

PE类关系图:

www.zeeklog.com  - S4分布式流计算引擎



说明:

  • Persister : 每个PE对应一个Persister,s4中每个PE对应于一个key的value结果。每个value结构都将作为PE的一个instance
  • FrequenceType :  每个PE会定期进行flush output输出,可选择的策略(定时,数量阀值)
  • Clock : 每个PE的时间控制单元,有几种时间。(WallClock:基于系统时间处理 , EventClock:基于event事件时间控制)

重点理解一下: Keyless PE概念和PE Prototype

  • PE在底层实现了会以多实例存在。存储的key即为其keyed对应的value值,内部有个lookupTable概念。
  • 针对Keyless PE,其对应的存储key即为"*",所以每次通过lookupTable.get(value)返回的即为同一个节点,单例化
  • 针对prototype,其对应的存储就为其value,所以每次会根据当前keyed attribute确定返回的PE节点,基于这点可以实现PE节点数据的Join处理

EventListener/EventEmitter:


www.zeeklog.com  - S4分布式流计算引擎


 说明:

  • 每个PE Container是一个EventProducer,使用CommLayerListener做为其事件处理器,处理EventWrapper反序列化。
  • 每个PE包含一个Dispatcher,Dispatcher里包含了一个EventEmitter处理对应的EventWrapper对象的发送
  • 底层实际通讯的类: SenderProcess/ListenerProcess

Dispatcher类关系图:


www.zeeklog.com  - S4分布式流计算引擎


说明:

  • Partitioner, 每个dispatcher针对发送的目标cluster,会根据对应的key进行分区处理,路由到其中的node节点。(node节点的信息可以通过zookeeper进行动态管理)

考虑集群node节点的管理(node的新增 or 修改)

www.zeeklog.com  - S4分布式流计算引擎


说明:

  • ProcessMonitor 监控当前运行node节点的状态,有static/dymaic两种维护状态
  • TaskManager  创建node节点,主要是设置lock文件,有static/dymaic两种维护状态

运行(PE状态变化)

www.zeeklog.com  - S4分布式流计算引擎

S4缺点:

S4产品还是一个半成品,整体代码结构组织和风格上还是比较乱的,选择使用时需谨慎。存在的一些问题:

  1. failover (运行node节点出现crash,当前node上的PE数据将无法实施failover)
  2. persist (目前支持方式过于简单,需要考虑网络持久化,类似于nfs,分布式文件系统等,配合failover机制)
  3. communication  (只支持udp协议,数据传输可靠性上)
  4. load balancer (根据系统负载进行智能LB,目前暂时未看到相关实现。系统运行分为两种模式static or dymaic模式, static不存在智能调节LB处理)
  5. deploy  (手工方式介入deploy,无法支持apps的zero deploy模式。系统分为cluster/node两概念,node对应于一计算节点实例,cluster为一组处理相同业务的计算节点)

Read more

Spring学习总结(15)——Spring AOP 拦截器的基本实现

Spring学习总结(15)——Spring AOP 拦截器的基本实现

一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感。不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过。 什么是 AOP ? AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 以上内容引用自百度百科 翻译为人能听懂的话来说就是: AOP 可以理解为在方法执行前后可以去完成相同的业务逻辑,而不需要你去改业务代码。举个例子吧:现在有一个需求,要在项目中的每一个方法前面都输出一句:开始执行啦! 需求很明确了,常规的解决方式就是在每个具体的方法最前面加一句system.out.print(

By Ne0inhk
Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源

Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源

深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的。「读写分离」并不是多么神奇的东西,也带不来多么大的性能提升,也许更多的作用的就是数据安全的备份吧。 从一个库到读写分离,从理论上对服务器压力来说是会带来一倍的性能提升,但你仔细思考一下,你的应用服务器真的很需要这一倍的提升么?那倒不如你去试着在服务器使用一下缓存系统,如 Memcached、Redis 这些分布式缓存,那性能可能是几十倍的提升。而且,在服务器硬件异常强悍及性能廉价的今天,完全更没必要了,所以,在今天,我认为它更多的职责就是为了数据安全而设计的,同时又提升了一些性能,这样也挺好。 可能我们更应该称之为 主从分离 。 利用 AOP 实现读写分离 读写分离方式很简单,就是在你读数据是去连接 从库 ,在你写数据的时候去连接 主库 ,具体代码实现当然就是连接时候去操作了,这没什么难度,在代码里写就是了。可是,有追求的程序猿都是不是这么解决问题的呢! 我们知道 AOP 可以实现

By Ne0inhk
Gradle 学习总结(1)—— Gradle 入门详解

Gradle 学习总结(1)—— Gradle 入门详解

前言 网上关于 Gradle 的教程很多,但很多都是以“面”切入— 通过大量讲解其用法及其 API 分类来阐述。但 Gradle API 使用技巧众多,API 更是成千上百,臣妾记不住呀。个人深信,技术之道与练功之道是一致的,"想要旷世武功,先练内功"。本文尝试以“点”切入,阐述一下学习 Gradle 的门路。 为什么使用 Gradle 所谓构建,简单来说就是根据不同的输入信息,执行不同的任务,得到不同的输出的过程。而构建工具就是把这些过程自动化、管理执行不同的任务来满足不同需求。常见的构建工具有 Ant、maven 等。但它们都有一些缺点: * Ant 的缺点:依赖管理较弱,很容易变臃肿, XML 作为构建脚本 * Maven 的缺点:

By Ne0inhk
Spring学习总结(17)——Spring AOP权限管理

Spring学习总结(17)——Spring AOP权限管理

每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录、权限管理这些必不可少的业务逻辑。有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就算这样,但你肯定也会有后台管理及登录功能。 每个项目中都会有这些几乎一样的业务逻辑,我们能不能把他们做成通用的系统呢? AOP 实现用户权限验证 AOP 在实际项目中运用的场景主要有 权限管理(Authority Management)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging) 等。 所以,权限验证正好我们可以使用 AOP 来直接实现。具体你项目中权限怎么管理,管理的粒度是什么级别这些完全取决于项目需要,这里完全不做任何的讨论。 先说思路: 利用自定义注解及拦截器来在你需要的时候,进行你需要的一些权限认证。 这里依然涉及到的有 enum(枚举) 、 annotation(自定义注解) 及拦截器相关知识,废话不多说,直接开写代码。 开始撸一下代码 一、

By Ne0inhk