G7和阿里云,一个是国内最专业的物流数据服务公司,一个是全球3A云计算服务商。他们的强强联合,会创造出怎样的火花?
2015年,随着业务的发展,用户超过三万家,车辆超过30万的G7数据量呈几何倍数地增加。
如何用数据连接每一辆卡车、货主、运力主和司机,提升运输服务效率?G7一番慎重调研后,决定放弃自建机房,而是采用云计算服务快速构建系统,响应业务变化。
在对比了国内比较成熟的云服务后,阿里云的可靠性,安全性,低成本给G7留下比较好的印象,再加上阿里云提供了很多云服务,比如数据存储,消息中间件,大数据运算,防火墙,安全策略等,让技术的落地成本更低,所以最终选择使用阿里云搭建公司的IT设施。
总体技术架构
简单介绍下数据处理的整个流程:
-
安装在车辆上的硬件设备通过传感器采集车辆数据,通过网络传输到后台程序的接口。
-
网络层通过防火墙、网关过滤异常访问,其他的合法请求通过SLB进行均衡分发到后台解析机。
-
解析机根据对应的消息协议解析数据,将解析后的数据写入到MQ中。
-
MQ类似于一个巨大的buffer池,实现读写解耦。
-
数据计算中心包括流式计算、离线计算等从MQ中消费数据并根据业务处理数据,最后将计算数据写入存储层,这个是比较复杂的业务;数据入库机将数据进行业务处理,负责将数据写入存储层,这个是比较固定的业务;ETL引擎根据预先设置的规则将数据处理后写入存储层,为下面的数据分析做准备。
-
数据分析主要是利用大数据的处理能力,比如spark、hive、mapreduce等对数据进行分析处理,包括指标分析,统计报表,数据挖掘和机器学习。
-
通过对数据分析产生的结果进行更进一步的分析和汇总,形成应用层的一些数据产品并提供相应的服务接口,比如公司的一些主要业务:里程、油耗、轨迹等。
从整个架构图中可以看到数据链路比较长,从硬件上传到数据应用中间要经过5个环节,其中最为重要的就是数据存储层。
存储层要保证由数据生产方传输到的数据一条不差的写入到库中,提供大数据写入的幂等性、完整性、事务性、容灾性;也要保证数据应用方在查询数据时的及时的返回,提供数据大量访问的实时性、正确性和稳定性。基于此基本要求,公司建设了数据存储中心。
数据存储中心
首先,因为我们是做物流行业,数据的来源是车辆、传感器等,数据量大、数据结构多、查询相应即时特点,因此我们需要的数据存储介质是一种支持大量写入、无模式(no schema)、快速查询以及强大的扩展性,是一种典型的nosql使用场景。我们的查询场景比较单一,通常都是两个维度左右。所以最终决定使用云HBase作为主数据库。另外一些数据量不是很大,查询条件较为复杂的使用阿里云的RDS。
其次,物流行业的数据都是有时间维度,是标准的实际序列数据,通常最近的数据查询的频率会较高,越久的数据使用频率越少。我们把数据分成了三部
分:
热数据、温数据、冷数据
。
数据分层
热数据(在线查询)是6月以内的数据,会大量被访问,占总访问的90%左右。使用云HBase,RDS 存储。
温数据(近线查询)是6个月到12个月的数据,访问量相对较小,大概占比在6%~9%左右。使用自建机房的HBsae存储。
冷数据(离线查询)是12个月以前的数据,访问量在1%以下。使用hdfs存储。通过spark/mapreduce/hive访问。这部分数据在存储时,为了提高存储效率和查询效率,使用了Parquet格式和gzip压缩的组合。
大致过程是这样,我们相应的提供了两套查询接口。查询12个月以内数据时,通过HBase SDK的接口,自动路由到在线数据库或者近线数据库的HBase访问数据,将结果返回给调用方,通常都会在秒级别内完成调用。查询12个月以后数据,调用spark/mr接口,通过访问hdfs中的离线数据,将结果返回给调用方,调用时间会根据查询数据量而不同,通常在半小时内。在保证数据调用的同时,实现了最低的系统成本。
混合云
公司自有的私有云在使用成本、安全性方面更有竞争力,公有云在计算资源、可扩展性方面更有优势,基于以上考虑,公司将数据中心搭建成混合云模式。在线数据库放在阿里云中,近线数据库和离线数据库放在自建机房的私有云中。云之间通过专线VPN进行连接,保证数据能安全、可靠地进行同步。
数据同步/恢复
数据的同步,主要有两种同步方式,一种是实时同步,通过RDS的binlog,HBase的replication机制实时的将数据同步到HBase中,这种方式的好处是实时性强和没有延迟,坏处是数据一致性难保证,稳定性要求很高,开发工作能力大。
离线同步的,是通过MapReduce程序读取出HBase/RDS的数据,通过yarn的集群运算能力将数据写入到HBase,好处是稳定型强,开发简单,缺点是数据会有一定延迟。经过权衡,我们选用了第二种数据同步机制。
数据恢复与数据同步相反,通过mapreduce读取下层数据恢复成上层数据,这就很简单了。
HBase设计
主要分享下里程计算的表设计:
里程计算,算是公司最核心的业务:传感器会收集每辆货车的定位数据上传到MQ中,其中包括经度、纬度、设备上报时间、车辆状态等。首先Storm会从MQ中捞取实时的定位,通过合并、聚合、相应的距离的算法,计算出车辆的里程数据并存储到HBase中。这是初步结果,因为网络原因,GPS漂移等问题,准确率在80%左右,所以还有一个补偿算法。最后Spark会每小时从HBase捞取到初步结果,进行深度计算,包括补偿算法,缺失值修复,异常值剔除,最后计算出最终里程数据回写到HBase中。通常是计算同一辆车的两个相邻点的经纬度差值。查询条件通常是“车辆号+时间”,有时也会带一些其他条件比如机构号,设备状态,停留时间等。
车辆号(imei)是具有一定规律的,通常是由机构号做为前缀,长度15~20字节,为了防止HBase中出现Hotregion,我们对 imei(md5处理)保证数据散列,这样imei也定长了。
Rowkey设计
|
字段名
|
字段类型
|
字段长度
|
描述
|
Imei
|
md5处理,取byte
|
16字节
|
没有取tostring的值,否则会变成32字节
|
Time
|
Long
|
8字节
|
没有取tostring的值,否则会变成20170214171232的长度
|
查询时rowkey过滤掉大部分数据之后,剩下的查询条件通过filter过滤就不太多了。通过这样的设计每个rowkey占用24字节空间,节约了不少存储空间,也满足了查询条件。
Tips:在设计rowkey时,尽量使用数据的基本类型可以节约不少空间。比如int类型存储到HBase中占用4字节,long类型占用8字节,如果用成了字符串空间会翻倍。
由于使用了阿里云的E-MapReduce和云数据库HBase产品,比起通过私有云进行HBase设计,整体应用效率都有极大的提升。
其他数据库的应用
另外由于HBase在多条件查询方面的限制,我们也在探索多种维度的数据查询和存储。比如最近对phoenix做了详尽的研究, 首先phoenix是基于Hbase作为底层存储的,存储量和稳定性有保证。另外,它在HBase之上增加了SQL解析执行层,支持通过SQL语句访问HBase中的数据,并且对多维度的支持相对HBase有了显著的提高,可以用来存储一些数据量较大的多维数据。