分布式数据库和Hadoop都不够好,于是我们设计了分布式SQL计算系统

设计思想

为了解决分布式数据库下,复杂的 SQL(如全局性的排序、分组、join、子查询,特别是非均衡字段的这些逻辑操作)难以实现的问题;在有了一些分布式数据库和 Hadoop 实际应用经验的基础上,对比两者的优点和不足,加上自己的一些提炼和思考, 设计了一套综合两者的系统,利用两者的优点, 补充两者的不足。具体的说, 使用数据库水平分割的思想实现数据存储,使用 MapReduce的思想实现 SQL 计算。

这里的数据库水平分割的意思是只分库不分表,对于不同数量级别的表,分库的数量可以不一样,例如 1 亿的数据量分 10 个分库,10 亿的分 50 个分库。对于使用 MapReduce的思想实现计算 ; 对于一个需求,转换成一个或多个有依赖关系的SQL,其中的每个SQL分解成一个或多个 MapReduce任务,每个 MapReduce任务又包含 mapsql、洗牌(shuffle)、reducesql,这个过程可以理解为类似 hive,区别是连 MapReduce任务中的 map 和 reduce 操作也是通过 SQL 实现, 而非 Hadoop 中的 map 和 reduce 操作.

这是基本的 MapReduce的思想,但是在 Hadoop 的生态圈中, 第一代的 MapReduce将结果存储于磁盘,第二代的 MapReduce根据内存使用情况将结果存储于内存或磁盘,类比一下用数据库来存储,那么 MapReduce 的结果就是存储在表中,而数据库的缓存机制天然支持根据内存情况决定存储在内存还是磁盘 ; 另外,Hadoop 生态圈中, 计算模型也并非一种,这里的 MapReduce的计算思想,可以用类似 spark 的 RDD 迭代计算方式来替代 ; 本系统还是基于 MapReduce来说明的。

架构

根据以上的思想, 系统的架构如下:

没有代理节点

有代理节点

模块说明

关于系统中的模块,由于和绝大部分的分布式系统类似,这里仅做简要说明:

两种架构的区别

无代理节点的时候,客户端担负着比较大的工作,包括:发送请求、解析 SQL、生成执行计划、申请资源、安排执行、获取结果等;有代理节点的时候,代理节点担负着接受请求、解析 SQL、生成执行计划、申请资源、安排执行、返回结果给客户端等大部分责任,另外代理节点提供支持外部协议的接口,如 mysql 的 c/s 协议,使用 mysql 的命令行可以直接连接进来执行 SQL,整个系统就像普通的 mysql server 一样。

应用架构

实际应用环境可能是正式环境一套, 正式备份环境一套, 线下环境一套, 可以按照如下的架构进行部署。

 

基本概念 说明

下面针对架构中的一些概念做些说明

增删改操作

当插入数据的时候,根据均衡字段和均衡策略将记录插入到对应的数据库节点中。

当更新数据的时候,需要根据均衡策略判断数据更新前的和更新后的数据库节点是否变化:如果没有变化,直接更新;如果有变化,在更新前的数据库节点中删除老数据,在更新后的数据库节点中插入新数据。

当删除数据的时候,根据均衡策略在相应的数据库节点中删除。

这三种变更数据的操作,只要涉及到多个节点的数据变更,都需要使用分布式事务保证一致性、原子性等事务特性。

查询操作

查询操作的原理类似 hive,大家可以对比来理解 ; 为了方便解释查询操作, 首先来说明阶段树和阶段的结构,如下图所示:

阶段树

阶段

查询步骤

结合上面的图, 查询操作的具体过程如下:

  1. 将输入 SQL 经过词法、语法、语义分析,集合表结构信息和数据分布信息,生成包含多个阶段(简称 stage)的执行计划,这些阶段具有一定的依赖关系,形成多输入单输出的任务树。
  2. 每个阶段包括两种 SQL,称为 mapsql 和 reducesql,另外每个阶段包括三个操作,map、数据洗牌和 reduce;map 和 reduce 分别执行 mapsql 和 reducesql。
  3. 先在不同的数据库节点中执行 map 操作,map 操作执行 mapsql,它的输入是每个数据库节点上的表内部的数据,输出根据某个字段按照一定的规则进行分割,放到不同的结果集中,结果集作为数据洗牌的输入。
  4. 然后执行数据洗牌的过程,将不同结果集拷贝到不同的将要执行 reduce 的数据库节点上。
  5. 在不同的数据库节点中执行 reduce 操作,reduce 操作执行 reducesql;
  6. 最后返回结果。

例子

由于系统核心在于存储和计算, 下面对存储和计算相关的概念举例说明

均衡策略

举例说明均衡策略,基本信息如下:表名字:tab_user_login表描述:用于存储用户登录信息节点数:4,分为 0、1、2、3

举例说下如下的几种策略:

列表:以登录省份作为均衡字段为例

取模 hash:按 4 取模, 以用户 id 作为均衡字段

范围: 从 0 到一亿,以用户 id 作为均衡字段

取模 hash 和范围结合:先范围,再取模, 以用户 id 作为均衡字段

查询

举例说明查询操作,基本信息如下:

用户表 tab_user_info 如下:

用户登录表 tab_login_info 的结构如下:

排序

排序的关键点是节点之间存在大小关系,大的 key 或者 key 范围放到节点 id 大的节点上,然后在节点上排序,获取数据的时候根据节点 id 大小依次获取。

以如下 sql 为例,某一注册时间范围内的用户信息,按照年龄和 id 排序:


  1. select * from tab_user_info t where u_reg_dt>=? and u_reg_dt<=? order by u_id 

执行计划可能为:

Map:


  1. select * from tab_user_info t where u_reg_dt>=? and u_reg_dt<=? order by u_id 

Shuffle:

执行完成之后,这种情况下由于需要按照 u_id 进行数据洗牌,所以各个存储节点上需要按照 u_id 进行划分。例如有 N 个计算节点,那么按照(最大 u_id- 最小 u_id)/N 平均划分,将不同存储节点上的同一范围的 u_id,划分到同一个计算节点上即可(这里的计算节点存在大小关系)。

Reduce:


  1. select * from tab_user_info t order by u_id 

分组聚合

关键点和排序类似,节点之间存在大小关系,大的 key 或者 key 范围放到节点 id 大的节点上,然后在节点上分组聚合,获取数据的时候根据节点 id 大小依次获取。

以如下 sql 为例,某一注册时间范围内的用户,按照年龄分组,计算每个分组内的用户数:


  1. select age,count(u_id) v from tab_user_info t where u_reg_dt>=? and u_reg_dt<=? group by age 

执行计划可能为:

Map:


  1. select age,count(u_id) v from tab_user_info t where u_reg_dt>=? and u_reg_dt<=? group by age 

Shuffle:

执行完成之后,这种情况下由于需要按照 age 进行数据洗牌,考虑到 age 的唯一值比较少,所以数据洗牌可以将所有的记录拷贝到同一个计算节点上。

Reduce:


  1. select age,sum(v) from t where group by age 

连接

首先明确 join 的字段类型为数字类型和字符串类型,其他类型如日期可以转换为这两种。数字类型的排序很简单,字符串类型的数据排序需要确定规则,类似 mysql 中的 collation,比较常用的是按照 unicode 编码顺序,按照实际存储节点的大小等;其次 join 的方式有等值 join 和非等值 join;以如下常用且比较简单的情况为例。

以如下 sql 为例,某一注册时间范围内的用户的所有登录信息:


  1. select t1.u_id,t1.u_name,t2.login_product 
  2. from tab_user_info t1 join tab_login_info t2 
  3. on (t1.u_id=t2.u_id and t1.u_reg_dt>=? and t1.u_reg_dt<=?)  

执行计划可能为:

Map:

由于是 join,所有的表都要进行查询操作,并且为每张表打上自己的标签,具体实施的时候可以加个表名字字段,在所有存储节点上执行


  1. select u_id,u_name from tab_user_info t where u_reg_dt>=? and t1.u_reg_dt<=? 
  2.  
  3. select u_id, login_product from tab_login_info t  

Shuffle:这种情况下由于需要按照 u_id 进行数据洗牌,考虑到 u_id 的唯一值比较多,所以各个存储节点上需要按照 u_id 进行划分,例如有 N 个计算节点,那么按照(最大 u_id- 最小 u_id)/N 平均划分,将不同存储节点上的同一范围的 u_id,划分到同一个计算节点上。

Reduce:


  1. select t1.u_id,t1.u_name,t2.login_product 
  2.  
  3. from tab_user_info t1 join tab_login_info t2 
  4.  
  5. on (t1.u_id=t2.u_id)  

子查询

由于子查询可以分解成具有依赖关系的不包含子查询的 SQL,所以生成的执行计划,就是多个 SQL 的执行计划按照一定的依赖关系进行依次执行。

与已有系统的区别和优点

  • 相比 hdfs 来说,数据的分布是有规则的,hdfs 需要启动之后执行命令去查询文件具体在什么节点上;元数据的较小,记录规则即可,管理成本较低,在启动速度方面很快。
  • 数据是放在数据库中的,可以很好的使用索引和数据库本身的缓存机制,大大提高数据查询的效率,特别是在大量数据的情况下,利用索引查询返回少量的数据。
  • 数据可以进行删除和修改,这在基于 hdfs 的系统中一般比较麻烦和低效。
  • 在计算方面,和 MapReduce 或者其他的分布式计算框架(如 spark)并没有本质的区别(需要进行 shuffle)。但是由于数据的分布是有规则的,在有些地方可以做的更好,在分布式全文索引体现。
  • 由于线上系统一般使用数据库作为最终的存储位置,而把数据库同步到 hdfs 中是比较麻烦的,并且对于有删除和更新的情况,同步数据麻烦低效,速度较慢;相比之下,这个方案可以使用数据库本身提供的镜像复制功能来同步,基本没有额外的麻烦和低效的工作。
  • 基于以上,可以把线上系统(主系统)和线下的数据分析挖掘(从系统)做成统一的方案, 参见应用架构图。

应用场景

最后列举一些应用场景

 

本文作者:佚名

来源:51CTO

时间: 2024-11-01 08:54:44

分布式数据库和Hadoop都不够好,于是我们设计了分布式SQL计算系统的相关文章

分布式数据库和Hadoop都不够好,于是我们设计分布式SQL计算系统

设计思想 为了解决分布式数据库下,复杂的 SQL(如全局性的排序.分组.join.子查询,特别是非均衡字段的这些逻辑操作)难以实现的问题;在有了一些分布式数据库和 Hadoop 实际应用经验的基础上,对比两者的优点和不足,加上自己的一些提炼和思考, 设计了一套综合两者的系统,利用两者的优点, 补充两者的不足.具体的说,使用数据库水平分割的思想实现数据存储,使用 MapReduce的思想实现 SQL 计算. 这里的数据库水平分割的意思是只分库不分表,对于不同数量级别的表,分库的数量可以不一样,例如

基于分布式数据库的存储和hadoop的分布式计算的分布式sql计算方法

    1.  目录 2.      目录... 1 3.      背景和设计思想... 3 4.      架构... 3 没有代理节点... 4 有代理节点... 4 模块说明... 5 两种架构的区别... 5 5.      应用架构... 5 6.      基本概念说明... 6 7.      增删改操作... 6 8.      查询操作... 7 阶段树... 7 阶段... 7 查询步骤... 8 9.      例子... 8 均衡策略... 8 查询... 10 9..

分布式数据库的存储设计改进

  分布式数据库的存储设计改进       目录 背景... 4 核心思想... 5 负载情况... 5 数据分布规则... 7 基本均衡策略... 8 列表... 8 范围... 9 取余(节点数为除数,即除以节点数取余数) 9 基本均衡策略的分析... 10 基本均衡策略下的数据重新分布... 11 组合均衡策略... 13 两个基本均衡策略的组合... 13 三个基本均衡策略的组合... 15 数据动态重新分布... 19 场景... 19 业务影响分析... 20 如何处理数据重新分布.

基于Sql Server 2008的分布式数据库的实践(二)

原文 基于Sql Server 2008的分布式数据库的实践(二) 从Win7连接Win2003的Sql Server 2008 1.新建链接服务器链接到Win2003的Sql Server 2008 2.查看Win2003上面的IP地址,配置"新建链接服务器"中的"常项"   3.配置"新建链接服务器"中的"安全项",本地登录为"sa",远程用户也为"sa" 4.链接成功 Win7启动

Hadoop白皮书(2):分布式数据库HBase简介

HBase 是一个面向列的分布式数据库.HBase 不是一个关系型数据库,其设计目标是用来解决关系型数据库在处理海量数据时的理论和实现上的局限性.传统关系型数据库在上世纪七十年代为交易系统设计,以满足数据一致性 (ACID)为目标,并没有考虑数据规模扩大时的扩展性,以及单点系统失效时的可靠性.虽然经过多年的技术发展,产生了一些对关系性数据库的修补(并行数据库),然而受限于理论和实现上的约束,扩展性从来没有超过 40 个服务器节点.而 HBase 从一开始就是为 Terabyte 到Petabyt

云计算的时代,出现分布式存储和分布式数据库的解决方案

数据存储主要有两种方式:Database和FileSystem,后面发展出了Object-oriented storage,但是总的来看就是存储结构化和非结构化数据两种. DB开始是为了结构化数据存储和共享而服务的.FileSystem存储和共享的是大文件,非结构的数据,像图片,文档,影音等.随着数据量的增大,单机存储已经不能满足结构化和非结构化数据的需求,那么在云计算的时代,就出现了分布式存储和分布式数据库的解决方案. 1,File System, Object-oriented storag

细说分布式数据库的过去、现在与未来

主题简介: 分布式数据库的历史和现状 TiDB架构和特点 分布式数据库未来趋势   随着大数据这个概念的兴起以及真实需求在各个行业的落地,很多人都热衷于讨论分布式数据库,今天就这个话题,主要分为三部分:第一部分讲一下分布式数据库的过去和现状,希望大家能对这个领域有一个全面的了解:第二部分讲一下TiDB的架构以及最近的一些进展:最后结合我们开发TiDB过程中的一些思考讲一下分布式数据库未来可能的趋势.   一.分布式数据库的历史和现状       1.从单机数据库说起   关系型数据库起源自197

分布式数据库 Hbase 的高可用管理和监控(一)

HBase 作为 BigTable 的一个开源实现,随着其应用的普及,越来越被各大企业应用于海量数据系统中.本文将向读者简要介绍 Apache HBase 的基本知识,并展开介绍 IBM 对 HBase 的改进和扩展,HBase Master 多结点高可用支持,以及如何利用 IBM BigInsights 在 IBM Hadoop 集群中对 HBase 服务和作业提交进行监控和管理.本文将帮助读者在大数据云计算 Hadoop 集群应用中利用 HBase 更加高效.直观.便捷地进行存储,查询和优化

大数据来袭 传统数据库的Hadoop梦想

大数据时代已经来临,并悄悄的影响着我们的生活.根据IDC最近一项研究显示,在Facebook上每20分钟就有100万个新链接被分享,1000万条用户评论被发布.Facebook和其他所有互联网网站.互联网应用,已经逐渐变成了整个数据采集.分析.处理.增值的数据架构. 在中国,社交网络同样如火如荼.新浪副总裁王高飞就曾表示,新浪微博的注册用户已超过3亿,用户平均每天发布超过1亿条微博内容,相当于每10个中国人里面,就会有一人每天发布一条微博.每位用户的平均在线时长为60分钟,活跃用户中有60%通过