当前位置: 首页 > 科技观察

MySQL到HBase迁移策略的研究与实现

时间:2023-03-13 19:59:06 科技观察

随着Web2.0的到来,互联网数据飞速增长。海量数据的采集、处理和应用直接影响用户体验,决定企业发展。对比传统关系型数据库和分布式非关系型数据库处理大数据的性能,将本地数据迁移到分布式数据库势在必行。本文分析了现有迁移工具的优缺点,提出了一种有效的基于HBase数据库的数据迁移策略,并基于该策略实现了半自动迁移工具。以美国城市和方言系统的CityDetail数据库数据为例,阐述了迁移工具的工作原理,并对迁移后的数据进行了多次查询和对比,证明了使用该工具进行数据迁移的效率。关系型数据库;数据库;迁移工具Web2.0时代,网络技术飞速发展,个人和企业都在不断创造海量数据。在新一轮的淘金热潮中,如何利用数据,以及将数据转化为有价值信息的速度,越来越成为企业成败的决定性因素。实现数据的快速分析和制导,对数据存储提出了更大的挑战。传统数据库虽然经过多年发展,在企业应用中已形成规模化使用,但在应对大数据应用方面仍存在不足[1]。首先,传统关系型数据库无法完成大规模水平扩展。网络解决方案虽然在一定程度上解决了这个问题,但是无法在网络中动态创建集群;其次,关系数据库不能有效存储半结构化和非结构化数据;此外,传统的关系型数据库已经无法满足大数据时代对海量数据高效查询的需求。非关系型数据库的出现弥补了传统关系型数据库在处理大规模数据方面的不足。非关系型数据库是许多支持非关系型和弱关系型数据存储的数据库的统称,如Cassandra、MongoDB、HBase等。非关系型数据库中的表主要采用聚合存储结构,使得数据管理更加方便[2];通过预分配空间机制轻松实现海量数据存储;可通过不断增加服务节点实现扩容,无需停机维护和数据迁移。此外,很多非关系型数据库具有很强的业务针对性,与传统关系型数据库相比,在应用性能上有颠覆性的提升。其中,HBase以其与Hadoop的无缝集成、强大的高扩展性以及拥有庞大多样的社区等优势,正在被各大互联网公司应用[3]。HBase的广泛应用使得将存储在传统关系数据库中的历史数据迁移到HBase成为当前的研究热点。一、国内外研究现状对于传统关系型数据向HBase迁移的研究,目前业界只是提出了一些数据迁移的方法,而权威的数据迁移工具还很少,更不用说原表schema或自动化迁移工具。现有的迁移工具如Hadoop的官方工具Sqoop只支持单表的增量加载,无法完成数据库系统中很多表schema的迁移;HBase的Importtsv工具只支持TSV等指定文件的迁移;Put方法简单直接,但也只是完成数据迁移,迁移效率不高。此外,微软、华为等国内外大型互联网公司也在争先恐后地开发自己的迁移工具,但大多基于自己的商业应用[4]。综上所述,需要实现一个自动化或半自动化的数据迁移工具。这样可以最大程度地利用原有关系型数据库中存储的历史数据,减少数据间关系等宝贵资源的浪费。此外,还将避免手动重新输入。本文对关系型数据库MySQL和非关系型数据库HBase的存储原理和表结构进行深入研究,并以CityDetail系统为例说明传统关系型数据库向HBase迁移的思路,以及设计并实现迁移工具。最后验证了通过该方法进行数据迁移后数据库查询的效率。2.数据库存储原理分析2.1.关系数据库存储原理关系数据库[5]是一种基于关系模型的数据库。在关系数据库中,二维表用于表示现实世界中的实体,表中的字段用于表示实体的属性,外键等联合操作用于表示实体之间的关系。表中的一行,即一条记录代表一个实体,一个或多个这样的表以及表之间的关系构成了一个关系数据库。INFORMATION_SCHEMA数据库默认安装在关系数据库MySQL中。INFORMATION_SCHEMA数据库存储了MySQL中所有数据库的表名、列名、记录数、主键、外键、过程和方法等信息。INFORMATION_SCHEMA中存储的数据称为数据库系统的元数据。如图1所示。元数据是用于描述数据的数据[6],用于支持数据存储位置、历史数据、资源搜索等功能。元数据可以被认为是协助数据检索的电子目录。当使用DESCRIB等SQL语句在关系数据库中进行搜索时,查询的正是数据库中的这些元数据。因此,在数据迁移过程中,可以通过查询关系数据库中的元数据表,快速获取关系数据库中各个表的schema以及表之间的关系,进而进行迁移。2.2.HBase的存储原理非关系型数据库HBase是Google的BigTable数据库的开源实现。它通常被描述为稀疏、分布式、持久的多向映射[7]。HBase中的逻辑视图如图2所示。从图2可以看出,HBase表是一个稀疏矩阵。HBase与传统关系型数据库表的区别在于它可以存储半结构化数据,即HBase[8]中对表的设计没有严格的限制,数据记录可能包含不一致的列、不确定的大小等另外,与关系型数据库不同,HBase是按列存储而不是按行存储的,因此对同一列的数据有更好的查询性能。HBase表可以有数百万列和数十亿行,因此可以用来存储大规模数据。HBase实际上定义了如下思维数据模型[7],分别为:(1)表。HBase使用表来组织数据,表名是字符串。(2)行键。在HBase表中,数据存储在行中。行由行键***标识,它没有数据类型,始终被视为字节数组。(3)列族。表中的数据按行组织成列族,列族也会影响HBase数据的物理存储。系统会将列族存储在HBase自带的数据库中,所以列族必须在建表时定义,不能轻易修改。另外,HBase中的每一行都有相同的列族,同一个列族可以有不同的列限定符。(4)列限定词。列族中的数据由列限定符或列定位。与列族不同,列限定符不必预先定义。列限定符也不必跨行保持一致。列限定符没有数据类型,并且始终被视为字节数组。(5)单位。行键、列族和列限定符一起定义一个单元。存储在单元格中的数据称为单元格值。该值没有数据类型,被视为byte[]数组。(6)时间版本。HBase中使用版本来存储不同时间的cell值,默认存储3个版本。时间版本用时间戳标识。在物理上,HBase的数据存储在HDFS中,可以很好的利用HDFS的分布式处理模式,受益于Hadoop的MapReduce程序模型。HBase逻辑表在行方向上分为多个HRegion,HRegion是按大小划分的。每张表仅从一个区域开始。随着记录数量的增加,Region不断增加。当它增加到一定程度时,HRegion将被平分为两个新的HRegion。HRegion是HBase中分布式存储和负载均衡的最小单元,但不是存储的最小单元。HRegion由一个或多个Stores组成,每个Store在表中存储一个列族。每个Store由一个Memstore和0到多个StoreFiles(HFiles)组成。StoreFiles用于存储数据,以HFiles[9]的形式存储在HDFS上。3.迁移工具的主要模块迁移系统的主要模块如下。3.1.提取源数据库中的表模式通过分析传统关系型数据库中的存储结构可知,INFORMATION_SCHEMA数据库存储了MySQL中所有数据表的元数据,因此可以通过访问这些元数据快速提取。MySQL数据库中所有源数据的表模式。INFORMATION_SCHEMA数据库中的SCHEMATA表提供了当前MySQL实例中所有数据库的信息,SQL查询语言showdatatables的结果就来自这张表。TABLES表提供了数据库中表的信息,详细描述了一个表属于哪个SCHEMA以及表的类型、表名、每个表的记录数、创建时间。COLUMNS表提供了表中的列信息,详细描述了一个表的所有列以及每一列的信息。STATISTICS表除了提供描述表的用户权限的元数据外,还提供表中的所有索引信息。通过对这些表的联合访问,可以快速提取源数据库模式,避免因访问数据库中的数据表而导致的响应时间延长。3.2.表模式的转换通过对HBase数据库存储结构的研究,可以知道HBase数据库中的表结构不同于传统的关系型数据库。HBase中没有表与表之间的关系,关系型数据库中也没有连接查询等操作。迁移tableschema,需要将传统关系型数据库中相互关联的数据迁移到HBase中的同一行。考虑到HBase数据库特殊的表结构和存储结构,为使迁移的数据尽可能不影响业务功能,对数据表模式[10]进行如下转换:(1)转换基础表对CityDetail系统中的所有表都有效基础转换是直接将源数据表迁移到HBase端。源数据表的表名用作HBase表的表名,主键用作行键,表名和列名的组合用作HBase侧表中的列限定符,版本设置为1。(2)嵌入转换CityDetail系统中,Country表与City表之间存在关联关系,Country表与CountryLanguage表之间存在关联关系。HBase中的物理存储结构决定了HBase表的不同列族存储在不同的Store文件中,并且由于源数据中不同表的join查询操作远少于单表操作,City表和CountryLanguage表可以存储为Country表的列族。因此,要实现这类表的迁移,必须保留Country的表模式,然后拆分City表和CountryLanguage表作为Country表的列族加入Country表中。(3)递归转换CityDetail系统中除了Country表与City表的关联关系外,还有下一层如Detail表与City表的关联关系。要完成这类表的迁移,需要在Country表和City表的嵌入式改造的基础上,对City表和Detail表进行深度嵌入式改造。根据递归原理,先将Detail表划分为City表对应行的列族,再将City表划分为Country表的列族并迁移。(4)切分和转换根据关系数据库[11]的关系范式,可能存在同一张表Describe是表中其他三个表Country、City和CountryLanguage的子表的情况。这种关系的转换可以通过拆分Describe表,分别添加到三张表对应的列族中来完成。通过以上四种转换方式的综合应用,最终完成了CityDetail系统所有表模式的迁移。4.设计与实现本文设计的迁移系统流程图如图3所示。(1)连接关系型数据库MySQL,首先在Java程序中使用Class.forName语句加载MySQLJDBC驱动,然后使用语句“Connectionconn=DriverManager.getConnection(url,user,password)”创建一个新的连接,然后访问数据库的元数据得到表架构。(2)Schema转换遍历(1)中得到的所有表Schema,使用上面提到的四种转换方式,对迁移后的HBase中的表Schema进行转换。(3)连接HBase数据库通过语句“Configurationconf=HBaseConfigurAtion.create”获取HBase数据库中的配置信息,然后使用语句“table=newHTable(conf,tablename)”在其中新建表HBase,根据(2)转换后的表schema,使用语句“byte[]family=Bytes.toBytes("n")”来指定每个列族的名称。至此,迁移系统表模式的迁移就完成了。(4)数据迁移在数据迁移模块中,需要分别连接两个数据库。首先连接MySQL数据库,在MySQL中创建一个MySQLObject访问指定的数据库,使用SQL查询语句循环遍历数据,获取数据库中的记录,然后连接创建的HBase数据表生成HBase对象,并使用Put方法依次将SELECT查询得到的数据记录插入到HBase表中,最后关闭数据对象,完成数据迁移。5.测试与结论实验测试是在Hadoop集群上进行的。集群包括4台主机,每台主机都安装了Hadoop、HBase和Zookeeper。集群信息如表1所示。本次实验采用本文提出的数据迁移工具和Apache为Hadoop配置的官方数据迁移工具Sqoop对CityDetail系统进行迁移,迁移过程和结果为使用不同大小的数据集对这两种工具进行了比较。首先,在迁移过程的复杂度上,Sqoop工具通过指定参数在终端完成数据迁移,包括连接数据库的语句、迁移前后的数据表名、属性名。指定参数繁琐,操作不方便。而本文的迁移工具从获取表schema到建立HBase数据表、迁移数据都是由系统自动完成的。相比之下,自动化程度比较高。其次,在查询性能方面,由于本文的迁移工具完成了表模型的转换和迁移,Sqoop只是机械地迁移了特定表中的数据,而没有迁移表的schema。两者相比较,前者的迁移结果有很大的不同。大优势。以典型的SQL查询语句:“SELECTName,LanguagewhereCountry.CountryCode=Language.CountryCode”为例,两者的查询结果如图4所示。从图4可以看出,本文的迁移工具与Sqoop相比,查询性能有了很大的提升。因为本文的迁移工具通过表模式的转换,将属于同一条记录的信息存储在一个HRegion中,同一张表中的数据存储在同一个Store文件中,减少了查询时多次寻址的过程.,从而减少系统响应时间。6.结论本文分析了CityDetail系统从MySQL数据库到HBase数据库的迁移案例,研究了MySQL数据库和HBase数据库中数据存储的原理,提出了一种通过访问MySQL数据库元数据快速提取表模式并转换迁移的方法,这解决了问题以前,迁移工具无法迁移表架构。在尽可能保证数据完整性的前提下,提高迁移数据的迁移速度、自动化程度和查询性能。但是由于HBase中存在***索引,在多条件查询上的查询性能肯定会低于MySQL,所以索引的优化还是需要学习和研究的。