开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天
一、本篇笔记重点内容:
- 业务数据存储需求分析
- 数据模型设计
二、 详细知识点介绍:
业务数据存储需求分析
随着信息技术和经济社会的发展,我国成为全球最大的互联网、电子商务和智能终端市场,移动通信用户数达到 13 亿。电信业务数据中的详单查询是电信企业的一项主要应用。
计费详单数据分为语音详单及数据详单,包含用户当月的每一次语音通话及数据上网业务记录。其中语音详单主要记录用户的语音通话信息,包含用户ID、时间、通话时长、LAC、CI等信息;数据详单主要记录用户的上网信息,包含用户ID、时间、上行流量、下行流量、LAC、CI等信息。计费详单数据可以用来分析用户的业务行为、业务量,结合用户消费信息间接估算出收入情况。
某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询。HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力
某省语音话单业务数据和上网业务数据,业务数据表中最小超过4 亿条记录/天,最大超过100 亿条记录/天,数据总量超过20 TB/天,数据保存一个月,总存储量达到PB 级别,7×24 h 不间断进行数据处理,HBase 集群机器均衡配置各40 台机器。
数据模型设计
HBase 是构建于HDFS 上可伸缩、分布式、列式动态模式的Hadoop 数据库。HBase 的模型结构在Schema 声明的时候创建,与传统关系型数据库的差异在于没有固定的结构化。HBase 表的基本结构由rowkey、column family(列族)、column(列族中的列)、time stamp(时间戳)组成。每个数据单元格是由{rowkey、column、version}组成,每组单元格内容是不可分割的字节数组。在构建HBase 这种列式key-value 模型时,尽量少创建列族,以避免数据空缺差异很大,导致不均匀分布,影响查询性能。数据建模需要根据业务需求和集群硬件资源情况来设计,一般可以分为以下两种。
(1)高表:多行少列(可以存储大对象,也可以存储小对象), 方便管理, 耗费的资源多, 有利于做MapReduce 分析。
(2)宽表: 少行多列(如客户关系中某用户办理的业务),有利于提升查询性能,但MapReduce 分析处理相对较繁琐。
以CDR 的位置更新(CS_MM)数据为例来实现数据建模:首先需要设计Schema,指定表名、列族名、压缩方式、版本等设计如下:
create ‘TableName’, { NAME => ‘f’, COMPRESSION=> ‘snappy’, VERSIONS=3, BLOCKSIZE => ‘65536’, IN_MEMORY => ‘false’, TTL => ‘2147483647’}
其中,列族名必须指定,数据对应的列字段名可以任意松散式添加,但建议工整规则,不需要指定数据类型,存入的数据可以为任意数据类型。模型设计根据需要分别设计成高表、宽表两类结构。
高表结构的模型设计如图2 所示。
从文本数据至HBase 表结构的映射如图3 (图中粗字体表示组成rowkey 部分的字段)所示。
l rowkey 组成:号码、时间、位置信息(必查条件选项)组合。
l 时间戳:自动生成,按照入库时间生成,可以手工设置。
l column-family |column1:列族(f:c1,value="文本所有值"),没有结构,全部将所有的值放入一个列中。
宽表结构的模型设计如图4 所示。
从文本数据至HBase 表结构的映射如图5 (图中粗字体表示组成rowkey 部分的字段)所示。
l rowkey 组成:号码、时间、位置信息(必查条件选项)组合;
l 时间戳:自动生成,按照入库时间生成,可以手工设置;
l column-family|column1:列族(f:c1,value= ”文本所有值”),文本第一个值;
l column-family|column2:列族(f:c2,value= ”文本所有值”),文本第二个值;
l column-family|column3:列族(f:c3,value= ”文本所有值”),文本第三个值。