基于Spark平台的Oracle数据库并行迁移技术制造技术

技术编号:20117485 阅读:45 留言:0更新日期:2019-01-16 12:01
本发明专利技术公开了基于Spark平台的Oracle数据库并行迁移技术,使用Spark来作为数据迁移的工具,并且Oracle也有特定的rowid来作为特定的字段来分割表,然后指定Spark某个excutor读取特定的分区。本发明专利技术解决了Spark并行读取Oracle,必须要指定特殊的字段来分割表的问题,提高了Spark并行读取Oracle的通用性,不用考虑数据表的结构和内容。与此同时,可以手动按照需求设定每个分区的数据量,充分利用Oracle数据库机器的性能,避免性能浪费,提高数据迁移效率。

Parallel migration technology of Oracle database based on Spark platform

The invention discloses parallel migration technology of Oracle database based on Spark platform, uses Spark as a tool for data migration, and Oracle also has a specific ROWID to partition tables as a specific field, and then specifies an excutor of Spark to read a specific partition. The invention solves the problem that Spark reads Oracle in parallel and must specify special fields to divide tables, improves the universality of Spark reads Oracle in parallel without considering the structure and content of data tables. At the same time, the data volume of each partition can be set manually according to the requirements, and the performance of Oracle database machine can be fully utilized to avoid performance waste and improve the efficiency of data migration.

【技术实现步骤摘要】
基于Spark平台的Oracle数据库并行迁移技术
本专利技术涉及数据库迁移技术,具体是一种基于Spark平台的Oracle数据库并行迁移技术。
技术介绍
由于目前很多公司的业务系统设计时间较早,系统架构和数据存储选择了关系型数据库Oracle只满足于当时的业务需求,随着数据量的增大以及业务需求的越来越复杂,使用Oracle来做较复杂的数据分析效率就比较低,不能满足需求。若想满足这些需求就需要引入大数据系统来进行数据的分析和处理。引入大数据系统,这就涉及到了两个系统之间的数据交换,也就是数据迁移。在使用目前现有的数据迁移工具Sqoop发现效率很低。Sqoop脚本开始执行时,会将我们定义的脚本按照Sqoop自身的内部逻辑转换成MapReduce任务。MapReduce是Hadoop生态圈的一种编程模型,主要分为两部分map端和reduce端。而Sqoop脚本在转换为MapReduce任务时需要指定-m参数,-m的缺省值为1,如果不指定-m就意味着map端的任务只有一个线程来执行,效率非常非常低。若想指定-m参数就必须要指定-split-by参数,split-by的作用就是切分表,假设有一张表test,Sqoop命令指定参数-split-by‘id’,-m10。首先Sqoop会去查表的元数据,向关系型数据库比如mysql发送一个命令:selectmax(id),min(id)fromtest。然后会把max、min之间的区间平均分为10分,最后10个并行的map去找数据库。然而,并不是所有的表都有适合平均分配数据条数的字段。-split-by对非数字类型的字段支持不好,使用Sqoop导入大批量的表就会有数据倾斜引起的效率问题。但是很多数据表不具备明确的可以用作分割表的字段的条件,所以更改使用Spark来代替Sqoop进行数据迁移。Spark默认读取Oracle是单线程读取,若想并行读取,需要指定特定的分割列,这样就有一定的局限性,使得很多表不能并行读取或者并行读取出现数据倾斜,最终效率很低。Spark读取Oracle数据库示例代码:PropertiesconnectionProperties=newProperties();connectionProperties.put(″user″,″username″);connectionProperties.put(″password″,″password″);Dataset<Row>jdbcDF2=Spark.read().jdbc(″jdbc:postgresql:dbserver″,″schema.tablename″,connectionProperties);这样是单线程读取数据,效率很低,不能发挥Spark分布式计算引擎的优势。若想发挥Spark优势就需要用到官网的并行读取的示例代码:defjdbc(url:String,table:String,columnName:String,#根据该字段分区,需要为整形,比如id等lowerBound:Long,#分区的下界upperBound:Long,#分区的上界numPartitions:Int,#分区的个数connectionProperties:Properties):DataFrame这个方法虽然可以比较高效的读取数据,但是局限性太高,columnName必须要是整形而且需要数据均匀分布在lowerBound和upperBound之间,否则会出现数据倾斜,影响效率。第二种并行读取的方式示例代码:jdbc(url:String,table:String,predicates:Array[String],connectionProperties:Properties):DataFrame其中参数为:valpredicates=Array(″AAAR3sAAEAAAACXAAA″->″AAAR3sAAEAAAACXAAB″,″AAAR3sAAEAAAACXAAC″->″AAAR3sAAEAAAACXAAD″,″AAAR3sAAEAAAACXAAE″->″AAAR3sAAEAAAACXAAF″,″AAAR3sAAEAAAACXAAG″->″AAAR3sAAEAAAACXAAH″,″AAAR3sAAEAAAACXAAI″->″AAAR3sAAEAAAACXAAJ″).map{case(start,end)=>s″rowid>=date′$start′″+s″AND<=date′$end′″}predicates参数是一个字符串数组,Spark内部会根据数组来分割表数据,交给不同的executor来进行读取。这个方法的缺点是必须手动指定分区。且每个分区的数据数量分配要接近,这对大数量的Oracle数据库的自动化迁移是不现实的。由此可以看出,若想并发的读取Oracle数据,只能选择最后一种并行的读取方式,并且程序要具有很高的通用性,就需要找一个所有Oracle数据表都存在的列。也就是Oracle数据库特有的列rowid。
技术实现思路
本专利技术的目的是提高Spark读取Oracle数据库的表的效率,且很大程度提高Spark并行读取Oracle的通用性,对Oracle数据库表字段类型和表内容没有特殊要求。为实现上述专利技术目的,采用的技术方案如下:基于Spark平台的Oracle数据库并行迁移技术,包括如下步骤:(1)spark平台根据oracle数据库表名获取当前MaxRowid、MinRowid和记录总数,并设置spark平台上每个executor处理记录的条数,,若数据表的总记录数小于设置的记录条数,不用进行分区,直接进行整张数据库表的迁移操作。(2)若数据表的总记录数大于设置的记录条数,则进行初步分区操作,在该步骤中,判断MaxRowid和MinRowid的FILE_ID是否相同。(3)如果MaxRowid和MinRowid的FILE_ID相同,则分别截取10-12位的BLOCK_ID,并通过base64解码,获得最大的BLOCK_ID和最小的BLOCK_ID;最大的BLOCK_ID减去最小的BLOCK_ID后加1得到当前表切分的数据块的总块数,最后执行迁移操作。(3)如果二者FILE_ID不同,则将FILE_ID和BLOCK_ID结合起来用base64解码,然后类似计算数据表的分区数目,最后完成迁移操作。本专利技术的有益效果:1、解决了Spark并行读取Oracle,必须要指定特殊的字段来分割表的问题,提高了Spark并行读取Oracle的通用性,不用考虑数据表的结构和内容。2、可以手动按照需求设定每个分区的数据量,充分利用Oracle数据库机器的性能,避免性能浪费,提高数据迁移效率。附图说明图1:为本专利技术rowid组成结构示意图。图2:为本专利技术工作流程图。具体实施方式下面,结合附图及实施例对本专利技术进行详细说明。实施例一:本专利技术使用Spark来作为数据迁移的工具,就是利用Spark分布式的优势,并且Oracle也有特定的rowid来让我们使用作为特定的字段来分割表。然后指定Spark某个excutor读取特定的分区。Oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称本文档来自技高网
...

【技术保护点】
1.基于Spark平台的Oracle数据库并行迁移技术,其特征在于,包括如下步骤:A)spark平台根据oracle数据库表名获取当前MaxRowid、MinRowid和记录总数,并设置spark平台上每个executor处理记录的条数,,若数据表的总记录数小于设置的记录条数,不用进行分区,直接进行整张数据库表的迁移操作;B)若数据表的总记录数大于设置的记录条数,则进行初步分区操作,在该步骤中,判断MaxRowid和MinRowid的FILE_ID是否相同;C)如果MaxRowid和MinRowid的FILE_ID相同,则分别截取10‑12位的BLOCK_ID,并通过base64解码,获得最大的BLOCK_ID和最小的BLOCK_ID;最大的BLOCK_ID减去最小的BLOCK_ID后加1得到当前表切分的数据块的总块数,最后执行迁移操作;D)如果二者FILE_ID不同,则将FILE_ID和BLOCK_ID结合起来用base64解码,然后类似计算数据表的分区数目,最后完成迁移操作。

【技术特征摘要】
1.基于Spark平台的Oracle数据库并行迁移技术,其特征在于,包括如下步骤:A)spark平台根据oracle数据库表名获取当前MaxRowid、MinRowid和记录总数,并设置spark平台上每个executor处理记录的条数,,若数据表的总记录数小于设置的记录条数,不用进行分区,直接进行整张数据库表的迁移操作;B)若数据表的总记录数大于设置的记录条数,则进行初步分区操作,在该步骤中,判断MaxRowid和MinRowid的FILE...

【专利技术属性】
技术研发人员:颜鹏丁圣超李增发
申请(专利权)人:北京所问数据科技有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1