摘 要随着电子设备在各个地交通领域内普及,交通安全分析系统里的数据正在以前所未有的速度增长。这给传统关系型数据库的数据查询也带来了前所未有的压力。本文采用列存储数据格式并结合分布式SQL查询引擎Drill工具的使用,将该安全分析系统的数据查询速度提升12倍-74倍。
【关键词】大数据 查询优化列 存储分布式技术 Drill
我们生活的二十一世纪是一个信息时代,也是一个数据大爆炸的时代。随着“电子警察”等多种装备在各个省市普及,交通安全分析应用系统里的数据正在以前所未有的速度增长。据悉,某个用于城市交通安全研究的交通安全分析系统中,以城市为单位的数据表,每年数据增长量超过5000万条,一个城市的历史交通信息更是难以计数。交通安全分析正是一门基于交通历史数据的全样本数据进行分析的科学,数据的完整性、全面性对交通安全分析有着至关重要的意义。
1 关系型数据库面临的挑战
在传统关系型数据库中,数据表是按照行优先存储的,对于一个有很多列的数据表,系统先集中存储完表的一行,再去存储下一行。在访问数据库的时候,为了查找某一行某个字段的值,则必须将这一行所在的数据块从磁盘上完整地读到内存,再去判断这一行的某个字段的值的属性。当某个数据库表有很多列的时候,这种行存储的实现方式就有一个很明显的不足,就是为了读取数据库表的某一列,必须将其余的列也全部读取。要完整地读取该表所有行的某个字段的值,需要将整张表分前后顺序加载到内存。
交通历史数据信息十分丰富,包含多种字符串信息,比如用来记录违法行为的数据表包含违法编号、违法时间、警队编号、违法类型、车辆类型、车牌号、执法类型、违法地点、电子坐标等52个数据列,一条数据最大长度可达到5670字节。大约5000万条数据,该表单表数据量将会达到264GB。使用传统基于行存储的关系型数据库Oracle存储这些数据,在此基础上执行简单的交通安全分析业务的响应时间平均在25分钟左右,当数据量超过1亿条,Oracle的响应时间需要一个半小时左右。传统的关系型数据库根本难以支持一个城市历年历史数据的查询,更深层次的交通安全分析业务因此受阻。
2 分布式计算与“数据相关”
分布式计算是一种计算方式,它是一门计算机科学,它研究如何将一个需要很多计算机资源或者需要很多时间的计算分割成许多“小部分”,然后将这些部分的计算分配给许许多多不同的机器节点,利用这些分散的机器节点的计算能力完成这些被分割成的“小部分”计算。分布式集群中的并行计算不仅要求计算任务是分散在集群中的不同节点之上的,还要求尽可能地去发掘这个计算中可以并行处理的部分,从而缩短整个计算过程的时间。利用分布式技术进行查询优化就是基于这样一个基本思想,就是将相互之间“不相关”的数据分割,分别存储在不同的机器上,然后由这些不同的机器“同时”在被分割的数据集上去查找符合某个条件的数据,最后向用户返回结果,利用分布式计算空间上的分布性和时间上的并行性,缩短总的查询时间,从而达到优化查询的目的。
数据相关的概念最先来自于现代CPU指令流水线技术,它是指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况。如果把一个分布式集群看成一台超大规模的计算机,集群中的每一台机器都是这台计算机中的某个部件,不同部件分别承担着不同的计算任务,那么在这个分布式计算框架里,也存在着数据相关问题。
根据某一次计算中,处理数据的函数与函数之间的关系,数据之间的相关性大致可以分为如图1中展示的三種拓扑结构。每种数据计算(查询)活动都可以被分割成如图1中所示的n个子活动。活动1最先执行,它作为整个计算的开始,可以是数据加载,初始化之类的工作。根据拓扑排序算法的原理,所有入度为0的活动都可以并行执行,因此,图1中所示的三种拓扑图中,拓扑(1)属于迭代计算,并行度最差,拓扑(2)中,在活动1完成之后,活动2和活动4可以并行执行。在拓扑3中,活动1执行之后,活动2到活动m,它们的入度为0,可以通过增加参与计算的机器节点,降低总的活动处理时间。
交通安全分析系统里的数据处理过程,就属于拓扑3结构,2002年违法数据对2003年的违法数据没有影响,对它们之间的处理也不存在前后依赖的关系,数据的分割不破坏数据处理算法的完整性,处理一年的数据是一个算法,数理N年的数据还是同一个算法,这样的拓扑模型数据之间弱相关,可以通过增加机器节点并行处理,加大整个过程中的数据处理速度。这是本文里利用分布式技术并行处理数据,提高数据查询速度的理论基础。
3 使用Drill和Parquet文件优化查询
Parquet格式文件是一种按列存储的数据文件,专为数据的高效查询而设计的数据格式。它可以将用户的数据按照相同的数据列压缩存储,用户查询数据时,计算机只需要加载需要读取的数据列,而不必将整行数据全部加载到内存,降低磁盘IO次数,优化查询时间。可以利用Hadoop分布式文件系统,将数据文件分布式地存储在Hadoop集群上。Drill是一种分布式大数据SQL引擎,可以将用户的SQL语句分割成无数个子查询,然后分发给不同的机器节点,同时查询,最后将各个机器节点上的查询结果汇总,返回给用户。比如,某用户需要查询的数据有1000万条,记为datasetALL,其中300万条存储在集群的A机器节点上,记为datasetA,500万条数据存储在集群的B机器节点上, 记为datasetB,200万条存储在集群机器的C机器节点上,记为datasetAC,Drill会把用户selectcolumnA from datasetALL,转换成selectcolumnA from datasetA、selectcolumnA from datasetB和selectcolumnA from datasetC三个子任务,分别分发给集群中的机器A、B、C三个节点,分别由机器A、B、C执行完相应的子查询后,将结果汇总,再返回给用户。
4 实验过程与结果
使用Sqoop工具将数据从Oracle迁移到Hadoop中,以Parquet文件格式存储,使用Drill工具进行查询。表1中的Test1和Test2是Oracle和Drill工具执行单表查询和多表联合查询的时间对比。通过数据可以看到,在执行单表查询是,Drill的速度是Oracle的25倍-74倍,在执行多表联合查询时,Drill的速度是Oracle的12倍-43倍。
5 结论
综上所述,分布式SQL查询引擎Drill和基于列存储的Parquet格式文件能通过降低一次查询中读取的数据量和SQL语句分布式查询这两种方式,有效地降低传统关系型数据库的查询时延。可以将该查询优化方式应用在交通安全领域及其它领域,充分发挥计算机的计算能力,让数据分析师们能够更加便捷地进行数据分析,充分发挥大数据时代下数据的价值。
参考文献
[1]董西成.Hadoop技术内幕[M].背景:机械工业出版社,2013.
[2](美)怀特(White, T.),周敏奇,等. Hadoop权威指南:第2版[M].清华大学出版社,2011.
[3]刘云飞.基于Hadoop的数据迁移与存储的研究[D].北京邮电大学,2015.
[4]http://drill.apache.org/docs/
[5]Melnik S,Gubarev A,Long J J, et al. Dremel: Interactive Analysis of Web-Scale Datasets[J].Communications of the Acm,2010,3(12):114-123.
作者简介
邹小彤(1989-),男,河南省信阳市人。硕士学历,毕业于同济大学。研究方向为软件工程。
作者单位
同济大学软件学院 上海市 201800