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实现传统数据仓库的文本加载,测试架构如下:
从上面架构可以看到,源端数据抽取的配置与传统的数据库抽取是一致的,不在此赘述。针对目标端平台,我们主要利用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