最近分布式系统开发小结

用最简单的语言梳理一下最近十天做的分布式系统模块的开发。这是一个还在开发中的项目,配图也是设计原图。希望能更多地从开源项目里汲取营养,一边实战,一边积累。

系统概述

最近在设计和开发一个分布式系统的流式处理模块,整个系统用于跨集群、跨机房搬运不同数据源内的数据到另一份或多份数据源上,包括HDFS、MySQl、MongoDB、FTP等。功能比较像Hadoop的Sqoop,但是能扩展支持更多的数据源,且本身是个集群部署,不像Sqoop需要依赖Hadoop的MR。

我们整个cluster的资源管理借助Mesos来完成,由自己定制的Mesos Scheduler向Mesos Master申请可用的资源,具体把数据搬运的任务分发到Mesos Slave的Executor上,而我主要负责的就是Slave模块,包括Slave上Executors的实现、不同Slave上Executor之间的通信、消息处理、每次Task的容错和可靠性等内容。

Executor设计

一共有三种Executors,简单分为Input、Cache、Output,直观理解Input就是读取数据源,Cache用于从input到output的缓存,Output是获取cache里的数据,向目标数据源

导出数据。

Executor具体涉及到下面一些问题:

1.      Executor之间的网络通信

2.      数据流里每个Tuple在网络中的序列化、压缩等流通问题

3.      消息队列

4.      其他:多线程、双队列缓存设计、状态记录等

我们还具体考虑了Input、Cache、Output分别挂掉要怎样继续去执行整个数据流的搬运,这里涉及到了把一些描述和状态更新统一写到Zookeeper里,需要Cache模块做对消息的钝化/checkpoint/JournalLog。

整个模块的设计图如下:

网络通信

Netty有很优雅的设计,封装了Java的网络NIO接口,还重写了ChannelBuffer。利用Netty框架,Executors之间的通信简化为下面这样的模式:

我今天参考了Storm0.9.0里新增加的Netty模块,优化了下Slave模块里的Netty部分。其实Storm里的Netty部分蛮简单,比较我们想要做的实现更简单,主要体现在两处:

1.  Cache作为Netty Server,既要接收InputClient的写,又要接受OutputClient的读请求。

2.  Cache交互的Queue不是一个java concurrent包里的某个Queue容器,而是一个轻量级的workqueue:beanstalkd

消息队列

采用的是beanstalkd,每个tube对应一个output,之前的博文介绍了beanstalkd。

数据流通

数据的序列化和反序列化,本来想要使用kryo这样的在开源软件中经常见到的高效工具。后来参考了Storm里的TaskMessage结构,发现不如直接把POJO设计成一个byte[],自己定义一下byte数组的结构来的更高效。毕竟一个java对象转bytes,再高效也不如直接拼byte[]快。

数据压缩方面Snappy有很快的压缩速度。

Storm设计参考

其实我们的Input比较像Storm的spout,Cache和Output比较像bolt,但是又没有Storm里的shuffle grouping等机制,Input与Cache是指定的一对一的,Cache与Output是一对多,而这些对应关系会在物理执行计划模块里生成。

在Storm的设计里,参考了它的Acker。Storm能保证消息不会丢失,并且每条消息都会被完整处理,即这个tuple以及由这个tuple所导致的所有的tuple都被成功处理。而一个tuple会被认为处理失败了如果这个消息在timeout所指定的时间内没有成功处理。能做到这点,他的Acker起到了很重要的作用。(Arker模块的设计和源码分析)

我们打算做一个Acker模块,但消息的执行状态和更新会写在znode上,让Arker模块与ZK打交道,然后去更新Beanstalkd里已经reserve了的job。有时间还要把Storm的源码和模块仔细读读,尽量能多参考一些设计思路。

 

(全文完)

时间: 2024-08-23 07:57:21

最近分布式系统开发小结的相关文章

最近分布式系统开发小结: Slave模块Executors设计

更新一段我在linkedin上对这个项目的描述,目前项目已经开发完在使用了.本文并不是最新的设计. 背景解决HDFS/Hive/RDBMS/FTP/MongoDB等数据源之间的批量数据同步问题 特性跨机房场景下的链路优化:多路输入和输出的任务模型:数据容错和可持久化:任务失败恢复 任务调度把任务配置解析为物理执行计划,Master控制任务的调度和失败恢复,基于Mesos完成资源分配和任务调度.Slave分布在各个数据中心,具体传输任务的调起做到链路优化选择.高并发场景下,增加Mesos Slav

使用Websharp Service Locator简化分布式系统开发

web|分布式 使用Websharp Service Locator 简化分布式系统开发 什么是Websharp Service Locator对于多层的应用系统来说,我们通常把它们划分成客户端.应用服务层和数据库.在应用服务层,我们需要考虑至少两个方面的问题: ü 如何实现业务逻辑 ü 如何向客户端提供服务. 我们可能使用多种技术来实现服务的提供:Webservice..Net Remoting.甚至EJB等.如此多的实现技术,带来的很大的灵活性,但同时也带来了问题,其中一个就是,有多少种服务

android智能手机项目开发小结

 android智能手机开发项目小结        从上周六到截至今天下班时,历时一个星期,把一个客户的新项目的板子bring up起来,目前的状态是这个双卡双待的手机能正常运行,LCD色彩.声音.GSM call.sensor.camera.touchkey.keypad.backlight.fm.headphone等都正常工作,可以送QA作进一步的测试,还是有一些需要继续优化的地方.下周跟QA同志们,hardware同志们一起努力,争取客户样机早一点量产.下面就遇到的问题做一个小结吧!  

Chrome Web App开发小结_php实例

前言 这篇文章主要分享下自己在开发Web App遇到的问题和过程,以及一些很已经(如何)填平的坑.如果您想要"如何开发Web App"或<30分钟学会开发Web App>,请移步官方的开发手册(文档).(下有链接). 背景 感觉现在大家都在争论(讨论)两件事情,Web App和Native App.前不久参加的HTML5守望者活动,各方大佬都在针对这二者之间的优劣,差异,兼容,普及等进行探讨.当然,有争议的才说明有价值嘛. Chrome Web App 前不久Chrome又

suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)_javascript技巧

重要的键盘事件: 事件顺序:keydown -> keypress ->keyup 对于输入法开启时: keypress: 这三个事件中最最特别的事件的说,如果巧妙运用可以事半功倍: 1. 首先对于大部分功能键是没有keypress事件的 Caps lock ,shift,alt,ctrl,num lock...庆幸的是enter拥有此事件 2. 对于字母,数字,press返回的keyCode是不可靠的 在IE和webkit 下 返回的是ASCII code firfox下永远返回0 但是 对

开发小结(转)

  每次开发完一个功能后,总发现有很多可以改进的地方,但下次开发还是会犯同样的错误,这次决定记录一下可以改进的地方,以便下次不要在犯同样的错误. 1:排期估算错误,评估开发时间过于乐观.以为只是改改UI,加十几个动画,结果整个UI都被重写了,重写意味着要熟悉原来的需求,要读通原有代码的逻辑,虽然我对整体需求比较了解,但UI那块的代码之前尝试去读过,就是觉得晕(动画都是直接上原装定时器,没有任何包装,而且到处都是).重写完后,除了保留了原有的框架外,其他的代码都被删除重写了.虽然按时完成了开发任务

ocx开发小结 .

一. 关于ActiveX     ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼其中主要的技术是组件对象模型COM.在创建包括ActiveX程序时主要的工作就是组件一个可以自足的在ActiveX网络中任意运行的程序.这个组件就是ActiveX近控件.ActiveX是Microsoft为抗衡SunMicrosystems的JAVA技术而提出的此控件的功能和JAVAapplet功能类似.   二.   ActiveX的开发环境 基于ffmpeg的ocx开发使用了vis

Android 系统应用Setting开发小结

最近由于工作关系需要对系统应用Setting进行二次开发,选择的工具是eclipse,所以也可以看得出来,不是在源码的环境下开发的.第一步自然是把Setting源码导入到eclipse,这样的话问题就出现了,会有很多错误.原因就是Setting属于系统应用,而且它用到了很多系统级的api,这些api是隐藏的.不对外开放的(相对于一般应用来说).那如果想要使程序运行起来,就必须手动导入相应的jar包,  这些jar包是系统编译完成后生成的,而且jar包的顺序也要对应好,先后有序,类似这样就可以.而

JSP学习之数据库开发小结_JSP编程

本文总结了JSP学习之数据库开发方法.分享给大家供大家参考.具体如下: SQL语言的组成: 1>数据定义语言DDL 用于定义SQL模式,数据表,视图和索引等数据库对象 2>数据操纵语言DML 数据查询和数据更新语言 3>数据控制语言DCL 设定或更改数据库用户或角色 4>嵌入式SQL语言 SQL语句嵌入到宿主语言中 数据类型: 1>数字类型 INTEGER SMALLINT REAL NUMERIC DECIMAL FLOAT DOUBLE... 2>日期和时间类型 T