S4实现机理介绍

news/2024/11/8 15:04:08/

         S4yahoo开源的一套流式数据处理系统,什么是流式处理系统,顾名思义,我们把实时处理模块作为一个黑盒(这个黑盒的具体实现我们在下文中讨论),这个黑盒有很多接入管道,待处理数据可以从这些管道实时接入,并实时从出口产生分析后的结果数据。构建的整套系统可以称为流式数据处理系统。

         该系统主要的应用场景可以在:系统状态实时监控,用户行为实时监控,营销&广告效果实时统计。

         在这里先举个例子:用户行为实时监控:

         用户浏览页面行为的log被实时接入到流式数据处理系统,经过实时分析后,系统可以实时输出到每天到当前时间为止,访问网站各个页面的浏览量和用户数(用户数需要针对用户进行去重)。而当我们遇到的计算任务和分析数据都非常庞大时,分布式解决方案便顺理成章的成为救命稻草。

         接下来我们介绍S4系统的实现:

         S4的主要特点:1.decentralize设计,2.同质化设计

         Decentralize:系统并没有任何master机器,可以近似认为没有任何主控角色,这样的设计使得系统扩展性有非常好的表现,系统可以非常方便的按照处理的数据量压力进行横向扩容。

         同质化设计:系统中所有模块执行的程序都一样,在系统设计时也是一视同仁,并没有任何不同,简单的设计原则,便于实现和验证,而且并不失系统功能性。

 

我们先看一下系统设计架构,非常简单,系统只分为两层网络层和业务逻辑层

 

 

 

接下来我们看系统是如果运作的,其实设计理念非常简单,用户逻辑部分主要是EventEventProcess以及dispatcher的封装。

不同的数据接入进来被抽象成不同的Event,而每个Event会有对应的EventProcess进行处理,EventProcess处理Event的过程中也会产生很多中间结果的Event类型,而这些Event又被PUSH的网络层,网络层通过配置的dispatcher进行转发。

为了便于理解我们再举一个稍微复杂的一个统计需求的具体例子:

假如我们有银行用户实时取款记录如下:

类型1:用户|地区|取款金额|其他冗余信息

类型2:用户|地区|存款金额|其他冗余信息

银行需要监控资金流动性,需要统计每个自然月到当天为止,每个地区的存款金额总数和每个地区的取款总数。

 

于是乎:数据接入的类型就有两种SaveEvent  TakeEvent

 

1.SaveEvent处理

SaveEvent被网络层接收到后,调用用户配置的dispatcher接口的dispatch方法,将该Event发送到某台机器,这台机器反序列化数据后得到该EventSaveEvent便调用SaveEventProcess进行处理,去除冗余信息生成SaveTakeEvent并调用该Event对用的dispatcher接口,将该Event发送到某台机器。

2. TakeEvent处理

TakeEvent被网络层接收到后,调用用户配置的dispatcher接口的dispatch方法,将该Event发送到某台机器,这台机器反序列化数据后得到该EventTakeEvent便调用TakeEventProcess进行处理,去除冗余信息也生成SaveTakeEvent并调用该Event对用的dispatcher接口,将该Event发送到某台机器。

3. SaveTakeEvent处理

同一地区的SaveTakeEvent被发送到一起,系统对Event反序列化知道该EventSaveTakeEvent类型,便调用TakeAndSaveEventProcess进行处理,将Save操作和Take操作的钱数进行对应的累加。

 

这里面有几个关键点:

1.       dispatcher接口,这个接口起到的重要职责有两个:1.负载均衡。2:将关联数据发布到同一台机器。

2.       不同类型的Event有对应的EvenProcess进行处理。

 

如上例,distpatcher接口完全可以按照地区进行散列,既保证同一地区的数据落在一起,又保证不同地区数据分散均匀。

 

上例可以用一个如下一个有向无环图进行表示:

 

接下来我们就看S4的流程控制如何实现,其实很简单,上述过程基本上也已经描述清楚,S4充分利用了java的反射机制结合通过数据序列化和凡序列化实现了上述框架。一个Event类型的数据被disaptch不同机器上,成功反序列化出来以后,可以通过反射机制得到Event类型,然后再通过反射机制生成处理这个EventEventProcess,然后缓存EventProcess实例,用以不断接受此类Event进行处理,产生的中间结果Event也会通过网络层传送出去,并再次经历上述过程,直到DAG任务的结束。

通过EventEventProcess的对应可以非常方便的构建出一个DAG

 

还有一个关键就是刚才的dispatcher,这个不再详细赘述了,至于系统通过zookeeper进行名字映射等细节问题,这里也不做过多介绍了。

 

这样的设计可以看到所有的机器上的程序都一样,任何一台机器都需要承载EventEventProcess,而且毫无二致,dispatcher也通过反射机制得到Event的某些关键属性值,并通过这个属性值进行dispatch

 

上述只是S4的大致实现思路,详细细节分析以后补充。

 

 

 

 


http://www.ppmy.cn/news/477319.html

相关文章

R语言基础:S3和S4 class

用R进行数据处理时,经常出现S4 class的数据类型,或在软件包的帮助文件中描述为S4 class,那么什么是S3和S4 class呢? 参考资源:R语言S3类的理解与构建 - ywliao - 博客园 R语言基础教程——第7章:面向对象编…

LQB,手打,at24C02,S7按键保留char数据,S6按键读取char数据,S5存入int数据,S4读取int数据

任务, 将提供的i2c.c和i2c.h文件复制到工程目录路径中; 修改i2c.c和i2c。h的头文件,改为stc15.h 将i2c头文件,延时时间,修改成15单片机的时间,需要乘以10倍以上才行, 不然时序不对 在i2c.h文件…

S4——数组

目录 1. 一维数组的创建和初始化 1.2 一维数组的使用 1.3 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.2 二维数组的使用 2.3 二维数组在内存中的存储 3. 数组越界 4. 数组作为函数参数 4.1 冒泡排序 4.2 数组名是什么? 1. 一维数组的创建 …

Atcoder Beginner Contest 269(A-G)

Atcoder Beginner Contest 269 A - Anyway Takahashi 题目太水了&#xff0c;一年级小朋友都可以做 #include<bits/stdc.h> using namespace std; int main(){int a,b,c,d;cin>>a>>b>>c>>d;cout<<(ab)*(c-d)<<endl;cout<<&…

S4语法整理

1. VALUE type( ... )&#xff0c;DATA(WA) 临时定义类型并且赋值给构造 TYPES:BEGIN OF TY_TAB,ZCHAR1 TYPE C LENGTH 10,ZCHAR2 TYPE C LENGTH 10,ZCHAR3 TYPE C LENGTH 10,ZCHAR4 TYPE C LENGTH 10,END OF TY_TAB.DATA(WA) VALUE TY_TAB( ZCHAR1 1 ZCHAR2 2 ZCHAR3 3 Z…

S4 MIGO屏幕增强

1.创建结构和表 结构&#xff1a;ZSMIGO_ITEM 表类型&#xff1a; 表 &#xff1a;ZTMIGO_ITEM&#xff08;用来保存增强字段的值&#xff09; 2.创建函数组 TOP里的代码&#xff1a; FUNCTION-POOL zfg_migo. "MESSAGE-ID ..* INCLUDE LZFG_MIGOD..…

三星性能测试软件,13款软件压力测试 Galaxy S4性能体验

第1页:前言 第2页:第一轮测试&#xff1a;检阅综合性能 第3页:第二轮测试&#xff1a;考验CPU单元 第4页:第三轮测试&#xff1a;考验GPU单元(一) 第5页:第四轮测试&#xff1a;考验GPU单元(二) 第四轮测试&#xff1a;考验GPU单元(二) 除了这些国内用户耳熟能详的工具外&#…

S4 BP详解

ECC中客户和供应商是分开管理的&#xff0c;这种模式具有部分局限性&#xff1a; 客户和供应商不能是同一实体关系&#xff0c;建两个主数据会造成数据的冗余 客户/供应商只能有一个地址 属性无时间相关性 S4中使用BP业务伙伴模型解决这个问题(代替了传统的FD01/VD01/FK01/…