分布式数据库和Hadoop都不够好,于是我们设计分布式SQL计算系统
举例说下如下的几种策略: 列表:以登录省份作为均衡字段为例 取模 hash:按 4 取模,以用户 id 作为均衡字段 范围: 从 0 到一亿,以用户 id 作为均衡字段 取模 hash 和范围结合:先范围,再取模,以用户 id 作为均衡字段 查询举例说明查询操作,基本信息如下: 用户表 tab_user_info 如下: 用户登录表 tab_login_info 的结构如下: 排序排序的关键点是节点之间存在大小关系,大的 key 或者 key 范围放到节点 id 大的节点上,然后在节点上排序,获取数据的时候根据节点 id 大小依次获取. 以如下 sql 为例,某一注册时间范围内的用户信息,按照年龄和 id 排序: select * from tab_user_info t where u_reg_dt>=? and u_reg_dt<=? order by u_id 执行计划可能为: Map: 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: select * from tab_user_info t order by u_id 分组聚合关键点和排序类似,节点之间存在大小关系,然后在节点上分组聚合,某一注册时间范围内的用户,按照年龄分组,计算每个分组内的用户数: select age,count(u_id) v from tab_user_info t where u_reg_dt>=? and u_reg_dt<=? group by age 执行计划可能为: Map: 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: select age,sum(v) from t where group by age 连接 ?(编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |