• 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 rail r000000000

    源表定义

    此队列文件中包含有两张表的变更数据,分别是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:softoracleOGGig-data19.1Winx64_19.1.0.0.1AdapterExamples/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

  • 相关阅读:
    利用朴素贝叶斯算法进行分类-Java代码实现
    机器学习项目中常见的误区
    Chromium项目文化
    又一次定义CDN:为什么是迅雷?
    程序猿的思维修炼
    linux杂谈(十二):CDN加速
    Run-Time Check Failure #2
    打开excel2007"向程序发送命令时出现故障"
    [Unity 3D] Quaternion.LookRotation
    具体解释 IBM Bluemix 端到端开发体验
  • 原文地址:https://www.cnblogs.com/margiex/p/12705570.html
Copyright © 2020-2023  润新知