公怀予1,徐劲松2,王攀2
(1.中国电信股份有限公司济源分公司,河南济源454650;2.南京邮电大学,江苏南京210003)
摘要:针对现有数据库向大数据迁移的背景,Apache推出了Sq oop作为关系数据库向大数据迁移的主要工具,Sqoop简单地将数据表切分并随机存储到不同的节点上。针对Ha doop的这种存储方式带来的关系查询的低效率问题,设计了一种关联度感知的数据导入预处理方法。将关联度较高的表尽量存储在相邻的虚拟机节点,以降低关联数据查询带来的网络传输时延,提高系统的性能。对比实验表明,将关联性较强的数据表存放在相同或相邻节点上,可以成倍提高数据查询的性能。
关键词:大数据;Sqoop;Hadoop;No QL
中图分类号:TP393 doi: 10.11959/j.issn.1000-0801.20160441 引言
大数据从最初为Google、Facebook等公司解决大量数据的存储问题,到现在被越来越多的企业应用。目前,对于大数据的解决方案,主要有商业解决方案和Hadoop生态系统解决方案两种。商业解决方案具有使用方便、集成度高以及性能稳定的特点。但Hadoop生态系统多样、灵活、高扩展性等优势吸引了中小企业的注意并成为其主要的大数据解决方案。
大数据应用中,数据主要源于互联网和已有的结构化数据两者。其中,互联网数据催生了各种各样的大数据创新应用。而结构化数据是已有应用的保障,在我国,7成以上的大数据来源都是结构化数据。为了实现关系型数据仓库向大数据的迁移,Apache提供了Sqoop工具,以协助传统的关系型数据库管理系统(relational databasemanagement system,RDBMS)与Hadoop之间进行高效的大数据交流。
实践发现,在使用Sqoop导入Hadoop的过程中,初始的设定将会把一张表切分成4等分,再使用mapper通过JDBC将数据导入NoSQL(如HDFS、HBase等),而这些mapper会根据Hadoop的工作配置,随机地存储在被启动空间的节点上,当数据库应用中的查询语句中包含jom语法时,需要将两个表中的相应字段进行合并,这时候数据的传输需要通过网络传输来完成。考虑到网络传输会比直接在硬盘上读取数据慢了很多,本文提出一种称为基于关联感知Sqoop (association-based Sqoop,AB_Sqoop)的数据导入算法,通过数据表关联性分析的方法对关系数据库进行预处理,在数据导入的过程中,将相关性较高的数据表尽量存放在同一硬盘或相邻节点,以减少数据的网络传输,加速大数据应用的整体性能。
2相关研究
由于现在的企业环境中有着大量的结构化数据,这些数据并不能简单地使用MapReduce来处理,因此需要建立一种不更改复杂的Hadoop架构的机制来处理结构化数据。大多数的NoSQL查询语句使用Hive来作为SQL到MapReduce的翻译工具,但很多论文提到Hive所翻译出的MapReduce并不是很有效率。提出将整个查询语句根据其关联性将不必要的joln进行合并,以减少非必要的join操作,大大降低了查询所需要的时间,这种做法在2012年被Hive合并。
由于j01n是数据库中常见的耗时操作,许多的研究都针对join操作的优化进行探索,在reduce阶段将中间产物重新分区并复制给其他已经完成的节点上以加速运算,使用Map Reduce的简化join模型,使用Map Reduce模型的自然延伸加入过滤动作,使Map Reduce先使用逻辑过滤来省略中间而让整个完成时间减少。
3基于关联度感知的Sqoop导入
基于关联感知的Sqoop导人的流程如图1所示,第一步是分析数据库的日志,根据数据表之间的关联查询的数目获得数据表之间的关联性,第二步是考虑数据表的大小,计算获得数据表之间关联度的关系效用,最后查表获得数据表之间的关联度,再根据这个关联度导入Hadoop环境中。
3.1 分析数据表之间的关联性
关系数据库中的日志记录了数据库中的所有操作,包括数据库的设定、数据的修改以及查询。设计关系数据库的日志的目的是在数据库发生问题的时候,可以通过查询日志的方式解决问题。
由于关系数据库的日志记录了数据库查询的记录,因此发生的关联查询也会在日志中体现,因此,分析数据库日志可以获得关系数据库之间表的关联性,比如表1与表2之间产生的关联查询为15次,则该两表之间的关联性记为15。且记表n与表n之间的关联性为0。将这些关联性通过一个二维表可以将其列出,记该表为table association(TA)。
3.2数据表之间的大小
除了考虑表之间的关联性以外,还需要考虑数据表的大小问题。这是因为当两张表的关联性非常大,但其大小相对于数据库中其他的表很小的情况下,将两张表放在一起与否,并不能对关联查询的性能起到很好的作用。这是因为,Hadoop在执行任务的时候,会在数据量比较大的节点上发起任务,通过这样的手段减少网络传输,从而提高执行的效率。
同样,将数据库中的表两两比较,选出较小的表作为代表,形成一个二维列表TS(table size)。如表1的大小是10 MB,而表2的大小是30 MB,则表1行与表2列的数据记录为10,同样,记表n与表n之间的大小记录为0。
3.3关系效用的计算
关系效用( effective association)使用TA和TS对应的位置两两相乘即可得出,即求TA与TS的点积:
3.4 Sqoop导入
考虑到需要将关系效用最大的表尽量存放到一起,因此,首先需要明确每个虚拟机(VM)能存放的表的分片( table split)的大小,该容量限制记为CA (capacity),则导人的流程如下:
步骤1 将ECT'中的每行取CA -1个较大的值相加为St;
步骤2取S中最大的为S max,并首先将S max组成的表首先导入,并将S max组成的表标示为已导人:
步骤3如果剩余表的数量大于CA,则重复步骤1、步骤2:
步骤4将剩余的表做最后一次导入。
为了验证算法的有效性,在步骤2中引入变量数据位置(data locality,DL)。在这一步骤的导入过程由于数据存放在相同节点,因此可以理解为这些数据的关联查询不需要网络传输。假设S max的组成为第n行上的i 、j、k……列,则该DL的值为:
由式(3)可知,DL的值包括了所有需要标记为已导人的表的效用关系量,该值累加得到最后的DL值。当DL值越大,则意味着所需要的网络传输数据越小。
Sqoop导人的算法描述如下。
算法基于感知度的Sqoop导人算法
输入ECT':关系效用表
n:数据库表的数量
CA:每一个节点可以存储的数据表分片的数量
DL=0:初始化DL值
4实验与对比分析
4.1 模拟实验
模拟实验主要以原始的Sqoop与使用了基于关联感知的Sqoop对DL值进行模拟比较。
首先定义模拟实验的相关数据如下。
·数据表大小:1~10 GB,指一个表的随机大小值。
·数据表关联性:1~1000,指模拟数据库日志中的关 联查询书目。
·节点容量:2~50,指节点能够存储数据表分片的上限。
·表的数目:20~300,指数据库中表的数量。
·节点数目:20~100,指数据节点的数量。
如图2所示,当取数据表的数目为100、节点容量为20、表的大小取随机1~10 GB、关联性取随机1~500的时候,随着节点数目的变化,其DL值的变化。
从图2可知,当数据节点很少的时候,使用关联感知导入的效率并不占优,但随着节点数目的变大,该算法的DL值的变化比较稳定,而原始Sqoop会随着节点数目变大,其DL值不断变小。从第2.4节的分析可知,由于数据随机存放在不同节点,因此,数据查询的性能不断降低,到了节点数为100的时候,关联感知算法的性能达到了传统算法的397%。
4.2实测比较
实测环境使用Apache Am bari工具在实验室局域网环境下搭建一个Hadoop集群,15台PC,其中1台为master节点,14台为slave节点。安装Hive、Map Reduce和Sqoop。为了凸显网络传输对性能的影响,将PC的网络传输调为10 Mbit/s共享。使用苏州锐创公司的运营Oracle数据库作为导入的数据源,该数据源数据241 MB,分别进行传统的Sqoop导入和AB_ Sqoop导人,使用join操作进行关联查询,其实验结果如图3所示。
从图3可知,当数据查询参与的数据表变多的时候,查询的时间相对增大,而AB_ Sqoop基本维持在Sqoop的一半时间,即使用AB_S qoop能提高一半以上的性能。
5 结束语
基于Ha doop构建大数据的分析平台是目前中小企业的共同选择。在传统的关系数据库导人大数据平台时,虽然Apache提供了S qoop工具供数据的导入导出,但由于设计思想和数据查询的方式不同,传统的关系查询应用会产生不利的影响,特别是join操作会激起消耗运算资源。本文的分析和实验证明:将关联性较大的数据表存放到相同节点或相邻节点的做法可以有效地避免网络传输带来的性能影响。下一步需要进行的工作是考虑HDFS中数据副本对导入Hadoop后性能的影响。此外算法中节点容量上限的定义虽然简化了节点存储的问题,但实际情况中导人数据库的过程不可能有一个空置的大数据平台给用户使用,需要更进一步考虑每个节点拥有的容量。
下一篇:返回列表