标签: 大数据 |
市面上有很多的大数据厂商,也发布了很多大数据产品,光Hadoop生态圈就有数十种之多。这让很多企业无所适从,只觉得都是高大上,但真正用起来又很渣渣,“什么?不支持SQL!速度比我的笔记本还慢?!又出新版本了,不兼容老版本?”用户表示:内心是崩溃的、眼神是迷乱的、头皮是发麻的。
这情况让我们淡定不下去了,于是今天我们就要非常无聊的,手把手的教大家如何快速的研发一套分布式、并行计算的数据库系统,“SQL支持!原有数据库兼容!速度超快!”。
首先,要选一个关系数据库,Oracle、DB2、Mysql都可以,你熟悉什么就选什么,当然,如果要追求价格便宜、性能出众,可以重点考虑开源高性能数据库。选择的这个数据库将部署到分布式的节点上作为基础计算节点。
其次,要选一个SQL解析引擎,用户提交一段SQL,我们要能够解析出来,并发送到各个节点去执行。开源的SQL解析引擎有不少,大家可以去搜一下,这里我们就采用阿里的SQL解析引擎,解析效率不错,支持多数据库类型。
接着,要选一个分布式的通讯框架,实现各个节点间的信息交换和数据交换。这里我们采用的是RPC(远程过程调用协议),同样到网上去搜一下,有各种语言实现的RPC,我们选择JAVA的RPC来用。
有了关系数据库、SQL解析引擎和RPC通讯框架这三种食材,我们就可以开始手工制作了(编码)。
下面是简化的数据处理流程示意图及说明。
1、用户提交一段SQL查询
2、服务节点接收到SQL文本字符串后,
2.1交给SQL解析引擎,SQL解析引擎识别出SQL的各个部分,如select部分(查询字段集合)、from部分(查询表名)、where部分(过滤条件集合)、group部分(分组字段部分)、order部分(排列顺序字段集合)等等
2.2根据SQL不同部分的内容,将SQL转换为计算执行SQL和服务节点聚合SQL这两个SQL
2.3将计算执行SQL通过RPC调用框架发送给每个计算节点
3、每个计算节点接收到计算执行SQL后,
3.1在本地数据库中执行SQL
3.2获得本地查询数据后,通过RPC远程回调服务节点的处理程序
4、服务节点将获得的每个节点数据都插入到服务节点的内存数据库中
5、待所有节点的数据都返回后,执行聚合SQL,并将最终数据结果返回给用户
----------此处为分割线------------
整个过程中最主要的是SQL的转换,需要将单机执行的SQL转换为分布式并行执行的SQL,这里通过两个具体的SQL来说明:
1、selectcode,sum(high) from stock group by code;
这个SQL含义是查询stock表,并按code分组汇总high的值,由于sum具有分布式的叠加性(即“子集合上先分别汇总,再在合并的结果集上汇总的结果”与“全集上直接汇总的结果”是一致的),因此,这句SQL无需修改,直接作为在计算节点和聚合节点的SQL即可。
2、selectcode, avg(high) from stock group bycode;
这个SQL的含义是查询stock表,并按code分组计算每个code的平均值,由于avg不具有分布式的叠加性,因此,这句SQL需要调整,将其转换为具有叠加性的SQL,avg可转换为sum和count的组合,而sum和count都具有叠加性,
1)计算节点的SQL为selectcode, sum(high)as sum_high,count(high) as count_high from stockgroup by code;
2)聚合节点的SQL为selectcode, sum(sum_high)/sum(count_high) from stockgroup by code;
----------此处为分割线------------
至此,一个支持大数据、高性能的分布式并行计算的数据系统原型已开发完毕。使用这个分布式系统时,我们需要通过ETL将不同的数据分别装载到不同的计算节点。
当数据规模特别大时,数据分布的策略可根据应用场景进行选择:
1)如果大部分的查询都是全表数据的分析,则可以应采用随机算法,这样就可以使计算节点的数据分布均匀,从而达到最佳的全局计算性能;
2)如果主要的都是分析当月的数据,则可以采用Hash算法(选择与月份不相关的字段)将当月数据分散到不同节点上,从而充分利用多节点的计算资源。
通过测试,这个原型系统的性能可以随着节点数的增加实现近线性的扩展,即单节点查询需要10秒,5个节点只需要2.5秒左右,增加的时间消耗主要在网络延时和聚合上,如果返回结果数据量较小,则网络延时和聚合时间则基本可忽略不计。
----------此处为分割线------------
以上讲的原型系统比较适合基于星型模型的多维数据分析的场景,可明显提升计算性能,并可根据不同的应用场景进行进一步的优化设计,如将维表复制到多个节点上即可实现本地jion;部署多个服务节点可实现并发性的扩展;增加查询缓存,降低重复查询的资源消耗等。
当然,作为一个完善的分布式系统还有很多的挑战,比如服务监控、资源协调、容错处理、数据备份、全局算法优化等等,但实现以上内容足够各位零基础的同学在各类大数据场合装X了。