GoldenGate 19.1实时文本文件加载攻略

前言

    传统的数据仓库存储分析平台,常见的有Oracle, Teradata, Greenplum, Netezza, MySQL集群等;利用Oracle GoldenGate,可以实现从业务系统到这些数据仓库平台的实时加载,从而实现准实时的数据分析。除Oracle Exadata平台外,针对频繁的OLTP数据写入,其它平台对单条大批量的Update/Delete操作支持都较弱,在数据量特别大的情况下,往往会有较大的延迟。这些平台,如果用传统的ETL加载,一般会基于文本文件进行加载,从而发挥这些平台海量数据处理的优势,但这种处理,一般又是非实时的。现在,通过Oracle GoldenGate for Big Data (OGG4BD),我们可以将增量数据导出为文本,实现准实时加载,从而既满足海量数据的处理,又满足实时性的要求。当然,要实现准实时的数据加载和处理,也会面临一些限制,此类注意事项,我们也会在文中提及。

    另外,针对大数据平台的实时数据加载,在Oracle GoldenGate for Big Data中,产品已经内置了实时投递数据给HDFS, Hive, Hbase, Kafka, MongoDB, Cassandra, ElasticSearch, Flume等组件的功能,所以,只要具备相应的大数据环境,即可直接通过GoldenGate for Big Data开始实时数据投递。

本文测试环境:GoldenGate 19.1 for Big Data,如果是12c以前的版本,配置可能不同。

示例架构

利用GoldenGate实现传统数据仓库的文本加载,测试架构如下:

clip_image002

    从上面架构可以看到,源端数据抽取的配置与传统的数据库抽取是一致的,不在此赘述。针对目标端平台,我们主要利用OGG4BD软件,将增量数据导出为文本,需要配置以下几个参数。

  • 目标端文本字段的定义文件:由于OGG源端抽取一般采用全表字段(也可以指定抽取的字段),而且表结构定义默认已经保存到队列文件中(OGG 12.2及以后的版本),目标端的文本可能只要部分字段,比如源端有clob/blob字段,而目标端不需要这些字段,所以需要额外配置一个目标文本的字段定义文件。
  • 目标端OGG参数文件:用于数据投递的参数文件,即replicat进程参数。
  • 目标端大数据平台属性文件:用于定义文本写入的属性文件,如生成的文件名、文件切换的大小、文本分隔符等。

    文本如何加载到数据仓库,与对应的目标平台有关,如Greenplum使用gpfdist或copy方式加载文本,而Teradata使用fastload加载文本,不同数据库语法不同。本文只是就如何生成文本进行说明,如何加载到数据仓库,可参考对应数据库的命令手册。针对准实时加载处理,可通过定时脚本的形式进行加载。

配置说明

本示例中,以OGG4BD自带的队列文件为增量数据,路径如下:

OGG4BD安装目录\AdapterExamples\trail\tr000000000

源表定义

此队列文件中包含有两张表的变更数据,分别是TCUSTMER, TCUSTORD, 本文以TCUSTMER为源表进行配置,该表的字段定义如下:

字段名

字段类型

其它说明

CUST_CODE

Varchar2(4)

PK

NAME

Varchar2(30)

CITY

Varchar2(20)

STATE

Char(2)

目标表定义

在输出的文本中,我们只需要cust_code, name两列,所以对应的文本字段定义文件 (dirdef/dbo.tcust.mdp.avsc) 内容如下:

{

"type" : "record",

"name" : "tcust",

"namespace" : "dbo",

"fields" :

[

{

"name" : "ID",

"type" : [ "null", "string" ],

"default" : null,

"primary_key" : true

},

{

"name" : "status",

"type" : [ "null", {"type": "bytes", "logicalType": "decimal", "precision": 38, "scale": 0} ],

"default" : null

},

{

"name" : "name2",

"type" : [ "null", "string"],

"default" : null

}

]

}

以上示例中的字段名与源端不同,目的在于演示可以在不同字段名之间进行映射。

OGG投递参数文件dirprm/test.prm:

REPLICAT test

MAP QASOURCE.TCUSTMER, TARGET dbo.tcust, COLMAP (

ID = CUST_CODE,

status = 2,

name2 = name

);

将源表的cust_code映射到目标端的ID列,目标端新增一列status,默认为2,name字段映射到name2。 需要注意的是,目标表名必须要与提供的avsc文件名一致。

添加进程:

GGSCI>add replicat test, exttrail AdapterExamples/trail/tr

输出文本的属性文件dirprm/test.properties

gg.handlerlist=fw

gg.mdp.type=avro

gg.mdp.schemaFilesPath=./dirdef

gg.format.timestamp=yyyy-MM-dd:HH:mm:ss.SSSSSS z

gg.format.timestamp.zoneId=America/Chicago

gg.handler.fw.type=filewriter

gg.handler.fw.mode=op

gg.handler.fw.pathMappingTemplate=./dirout

gg.handler.fw.stateFileDirectory=./dirout

gg.handler.fw.fileNameMappingTemplate=${fullyQualifiedTableName}_${currentTimestamp}.txt

gg.handler.fw.fileRollInterval=0

gg.handler.fw.inactivityRollInterval=0

gg.handler.fw.finalizeAction=none

gg.handler.fw.partitionByTable=true

gg.handler.fw.sync=false

gg.handler.fw.bufferSize=10485760

gg.handler.fw.format=delimitedtext

gg.handler.fw.format.fieldDelimiter=|

gg.handler.fw.format.multiCharacterDelimiter=true

gg.handler.fw.format.metaColumnsTemplate=${optype}

gg.log=log4j

gg.log.level=INFO

详细的参数定义可参考OGG4BD的部署文档。

测试及结果分析

配置完成之后,启动test进程,并查看统计信息

GGSCI>start test

GGSCI > stats test, total

Sending STATS request to REPLICAT TEST ...

Start of Statistics at 2020-02-17 22:32:57.

Replicating from QASOURCE.TCUSTMER to dbo.tcust:

*** Total statistics since 2020-02-17 22:32:44 ***

Total inserts 5.00

Total updates 1.00

Total deletes 0.00

Total upserts 0.00

Total discards 0.00

Total operations 6.00

End of Statistics.

可以看到,有正常投递增量数据。

查看test进程的日志信息

2020-02-17 22:32:44 INFO OGG-02243 Opened trail file U:\soft\oracle\OGG\big-data\19.1\Winx64_19.1.0.0.1\AdapterExamples/trail/tr000000000 at 2020-02-17 22:32:44.157000.

2020-02-17 22:32:44 INFO OGG-03506 The source database character set, as determined from the trail file, is UTF-8.

2020-02-17 22:32:44 INFO OGG-06505 MAP resolved (entry QASOURCE.TCUSTMER): MAP "QASOURCE"."TCUSTMER", TARGET dbo.tcust, COLMAP ( ID = CUST_CODE, state = 12345, name2 = name ).

2020-02-17 22:32:44 INFO OGG-15057 The definition for table dbo.tcust is obtained from the metadata provider.

2020-02-17 22:32:44 INFO OGG-02756 The definition for table QASOURCE.TCUSTMER is obtained from the trail file.

2020-02-17 22:32:44 INFO OGG-06510 Using the following key columns for target table dbo.tcust: ID.

2020-02-17 22:32:53 INFO OGG-01021 Command received from GGSCI: STATS.

可以看到,目标端字段定义是从metadata provider(即我们提供的avsc文件)中得到,源端的表结构定义是从trail文件中得到。

最终的输出结果:

dbo.tcust_2020-02-17_22-32-44.236.txt

文件内容:

OP_TYPE|ID|Status|Name

I|WILL|2|BG SOFTWARE CO.

I|JANE|2|ROCKY FLYER INC.

I|DAVE|2|DAVE'S PLANES INC.

I|BILL|2|BILL'S USED CARS

I|ANN|2|ANN'S BOATS

U|ANN|2|

由于在属性文件中metaColumnsTemplate设置的是{optype},所以在每一行的第一列包含了每条记录对应的操作类型。因此,创建的目标表需要增加这额外的一列才能顺利加载。另外,最后一行的U代表源表上进行了update操作,Name字段为空,表示源端更新没有变更此字段的内容。

在文本的批量加载时,不同的操作类型(I/U/D)是不能进行一次性处理的,根据业务情况,有可能要考虑每条记录变更的先后顺序,同一主键可能有不同的操作,如果一次性加载替换目标表,一方面数据可能有重复,另一方面可能会打乱源端数据更新的先后顺序。更好的解决办法是实时加载只有insert操作的增量数据,比如事件表或流水表等。

小结

经过本文的测试,我们看到GoldenGate除了可以支持在不同数据库之间实时同步,也可以根据目标端的需求定制输出结果,包括以json, xml, avro, csv等形式将增量数据实时输出到目标端,从而为后续的数据处理提供支持。

参考文档

l https://docs.oracle.com/en/middleware/goldengate/big-data/19.1/index.html

l https://docs.oracle.com/en/middleware/goldengate/core/19.1/index.html

posted @ 2020-04-15 15:22  margiex  阅读(754)  评论(0编辑  收藏  举报