时间: 2020-09-03 00:08:26 人气: 2271 评论: 0
Oracle 里存储的结构化数据导出到 Hadoop 体系做离线计算是一种常见数据处置手段。近期有场景需要做 Oracle 到 Hadoop 体系的实时导入,这里以此案例做以介绍。
Oracle 作为商业化的数据库解决方案,自发性的获取数据库事务日志等比较困难,故选择官方提供的同步工具 OGG ( Oracle GoldenGate )来解决。
软件配置
角色 | 数据存储服务及版本 | OGG版本 | IP |
|---|---|---|---|
源服务器 | OracleRelease11.2.0.1 | Oracle GoldenGate 11.2.1.0 for Oracle on Linux x86-64 | 10.0.0.25 |
目标服务器 | Hadoop 2.7.2 | Oracle GoldenGate for Big Data 12.2.0.1 on Linux x86-64 | 10.0.0.2 |
以上源服务器上OGG安装在Oracle用户下,目标服务器上OGG安装在root用户下。
Oracle导出到异构的存储系统,如MySQL,DB2,PG等以及对应的不同平台,如AIX,Windows,Linux等官方都有提供对应的Oracle GoldenGate版本,可在这里或者在旧版本查询下载安装。
将下载到的对应OGG版本放在方便的位置并解压,本示例Oracle源端最终的解压目录为/u01/gg。
/home/oracle/.bash_profile文件)
export OGG_HOME=/u01/gg/ export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$OGG_HOME:/lib:/usr/lib export CLASSPATH=$ORACLE_HOME/jdk/jre:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /u01/arch_log Oldest online log sequence 6 Next log sequence to archive 8 Current log sequence 8
如非以上状态,手动调整即可
SQL> conn / as sysdba(以DBA身份连接数据库) SQL> shutdown immediate(立即关闭数据库) SQL> startup mount(启动实例并加载数据库,但不打开) SQL> alter database archivelog(更改数据库为归档模式) SQL> alter database open(打开数据库) SQL> alter system archive log start(启用自动归档) SQL> select force_logging, supplemental_log_data_min from v$database; FOR SUPPLEME--- -------- YES YES
如果以上查询结果非YES,可通过以下命令修改状态:
SQL> alter database force logging; SQL> alter database add supplemental log data; SQL> create tablespaceoggtbsdatafile '/u01/app/oracle/oradata/orcl/oggtbs01.dbf' size 1000M autoextend on; SQL> create user ggs identified by ggs default tablespaceoggtbs; User created. SQL> grant dba to ggs; Grant succeeded.
最终这个ggs帐号的权限如下所示:
SQL> select * from dba_sys_privs where GRANTEE='GGS'; GRANTEE PRIVILEGE ADM GGS DROP ANY DIRECTORY NO GGS ALTER ANY TABLE NO GGS ALTER SESSION NO GGS SELECT ANY DICTIONARY NO GGS CREATE ANY DIRECTORY NO GGS RESTRICTED SESSION NO GGS FLASHBACK ANY TABLE NO GGS UPDATE ANY TABLE NO GGS DELETE ANY TABLE NO GGS CREATE TABLE NO GGS INSERT ANY TABLE NO GRANTEE PRIVILEGE ADM GGS UNLIMITED TABLESPACE NO GGS CREATE SESSION NO GGS SELECT ANY TABLE NO [oracle@VM_0_25_centos gg]$ ./ggsci Oracle GoldenGate Command Interpreter for Oracle Version 11.2.1.0.3 14400833 OGGCORE_11.2.1.0.3_PLATFORMS_120823.1258_FBO Linux, x64, 64bit (optimized), Oracle 11g on Aug 23 2012 20:20:21 Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved. GGSCI (VM_0_25_centos) 1> 执行create subdirs进行目录创建 GGSCI (VM_0_25_centos) 4> create subdirs Creating subdirectories under current directory /u01/gg Parameter files /u01/gg/dirprm: already exists Report files /u01/gg/dirrpt: already exists Checkpoint files /u01/gg/dirchk: already exists Process status files /u01/gg/dirpcs: already exists SQL script files /u01/gg/dirsql: already exists Database definitions files /u01/gg/dirdef: already exists Extract data files /u01/gg/dirdat: already exists Temporary files /u01/gg/dirtmp: already exists Stdout files /u01/gg/dirout: already exists t_ogg。
SQL> create user tcloud identified by tcloud default tablespace users; User created. SQL> grant dba to tcloud; Grant succeeded. SQL> conn tcloud/tcloud; Connected. SQL> create table t_ogg(id int ,text_name varchar(20),primary key(id)); Table created. 将下载到的对应OGG版本放在方便的位置并解压,本示例Oracle目标端最终的解压目录为/data/gg。
export JAVA_HOME=/usr/java/jdk1.7.0_75/ export LD_LIBRARY_PATH=/usr/java/jdk1.7.0_75/jre/lib/amd64:/usr/java/jdk1.7.0_75/jre/lib/amd64/server:/usr/java/jdk1.7.0_75/jre/lib/amd64/libjsig.so:/usr/java/jdk1.7.0_75/jre/lib/amd64/server/libjvm.so:$OGG_HOME:/lib export OGG_HOME=/data/gg ./ggsci,进入OGG命令行
GGSCI (10.0.0.2) 2> create subdirs Creating subdirectories under current directory /data/gg Parameter files /data/gg/dirprm: already exists Report files /data/gg/dirrpt: already exists Checkpoint files /data/gg/dirchk: already exists Process status files /data/gg/dirpcs: already exists SQL script files /data/gg/dirsql: already exists Database definitions files /data/gg/dirdef: already exists Extract data files /data/gg/dirdat: already exists Temporary files /data/gg/dirtmp: already exists Credential store files /data/gg/dircrd: already exists Masterkey wallet files /data/gg/dirwlt: already exists Dump files /data/gg/dirdmp: already exists Oracle实时传输到Hadoop集群(HDFS,Hive,Kafka等)的基本原理如图:
根据如上原理,配置大概分为如下步骤:源端目标端配置ogg管理器(mgr);源端配置extract进程进行Oracle日志抓取;源端配置pump进程传输抓取内容到目标端;目标端配置replicate进程复制日志到Hadoop集群或者复制到用户自定义的解析器将最终结果落入到Hadoop集群。
在源端服务器OGG主目录下,执行./ggsci到OGG命令行下,执行如下命令:
GGSCI (VM_0_25_centos) 1> dblogin userid ggs password ggs Successfully logged into database. GGSCI (VM_0_25_centos) 3> view params ./globals ggschema ggs
其中./globals变量没有的话可以用edit params ./globals来编辑添加即可(编辑器默认使用的vim)
在OGG命令行下执行如下命令:
GGSCI (VM_0_25_centos) 4> edit param mgr PORT 7809 DYNAMICPORTLIST 7810-7909 AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3 PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
说明:PORT即mgr的默认监听端口;DYNAMICPORTLIST动态端口列表,当指定的mgr端口不可用时,会在这个端口列表中选择一个,最大指定范围为256个;AUTORESTART重启参数设置表示重启所有EXTRACT进程,最多5次,每次间隔3分钟;PURGEOLDEXTRACTS即TRAIL文件的定期清理 在命令行下执行start mgr即可启动管理进程,通过info mgr可查看mgr状态
GGSCI (VM_0_25_centos) 5> info mgr Manager is running (IP port VM_0_25_centos.7809).
在OGG命令行下执行添加需要复制的表的操作,如下:
GGSCI (VM_0_25_centos) 7> add trandata tcloud.t_ogg Logging of supplemental redo data enabled for table TCLOUD.T_OGG. GGSCI (VM_0_25_centos) 8> info trandata tcloud.t_ogg Logging of supplemental redo log data is enabled for table TCLOUD.T_OGG. Columns supplementally logged for table TCLOUD.T_OGG: ID.
配置extract进程OGG命令行下执行如下命令:
GGSCI (VM_0_25_centos) 10> edit params ext2hd extract ext2hd dynamicresolution SETENV (ORACLE_SID = "orcl") SETENV (NLS_LANG = "american_america.AL32UTF8") userid ggs,password ggs exttrail /u01/gg/dirdat/tc table tcloud.t_ogg;
说明:第一行指定extract进程名称;dynamicresolution动态解析;SETENV设置环境变量,这里分别设置了Oracle数据库以及字符集;userid ggs,password ggs即OGG连接Oracle数据库的帐号密码,这里使用2.3.4中特意创建的复制帐号;exttrail定义trail文件的保存位置以及文件名,注意这里文件名只能是2个字母,其余部分OGG会补齐;table即复制表的表明,支持*通配,必须以;结尾
接下来在OGG命令行执行如下命令添加extract进程:
GGSCI (VM_0_25_centos) 11> add extract ext2hd,tranlog,begin now EXTRACT added.
最后添加trail文件的定义与extract进程绑定:
GGSCI (VM_0_25_centos) 12> add exttrail /u01/gg/dirdat/tc,extract ext2hd EXTTRAIL added
可在OGG命令行下通过info命令查看状态:
GGSCI (VM_0_25_centos) 14> info ext2hd EXTRACT EXT2HD Initialized 2016-11-09 15:37 Status STOPPED Checkpoint Lag 00:00:00 (updated 00:02:32 ago) Log Read Checkpoint Oracle Redo Logs 2016-11-09 15:37:14 Seqno 0, RBA 0 SCN 0.0 (0)
pump进程本质上来说也是一个extract,只不过他的作用仅仅是把trail文件传递到目标端,配置过程和extract进程类似,只是逻辑上称之为pump进程 在OGG命令行下执行:
GGSCI (VM_0_25_centos) 16> edit params push2hd extract push2hd passthru dynamicresolution userid ggs,password ggs rmthost 10.0.0.2 mgrport 7809 rmttrail /data/gg/dirdat/tc table tcloud.t_ogg;
说明:第一行指定extract进程名称;passthru即禁止OGG与Oracle交互,我们这里使用pump逻辑传输,故禁止即可;dynamicresolution动态解析;userid ggs,password ggs即OGG连接Oracle数据库的帐号密码,这里使用2.3.4中特意创建的复制帐号;rmthost和mgrhost即目标端OGG的mgr服务的地址以及监听端口;rmttrail即目标端trail文件存储位置以及名称 分别将本地trail文件和目标端的trail文件绑定到extract进程:
GGSCI (VM_0_25_centos) 17> add extract push2hd,exttrailsource /u01/gg/dirdat/tc EXTRACT added. GGSCI (VM_0_25_centos) 18> add rmttrail /data/gg/dirdat/tc,extract push2hd RMTTRAIL added.
同样可以在OGG命令行下使用info查看进程状态:
GGSCI (VM_0_25_centos) 19> info push2hd EXTRACT PUSH2HD Initialized 2016-11-09 15:52 Status STOPPED Checkpoint Lag 00:00:00 (updated 00:01:04 ago) Log Read Checkpoint File /u01/gg/dirdat/tc000000 First Record RBA 0
Oracle与MySQL,Hadoop集群(HDFS,Hive,kafka等)等之间数据传输可以定义为异构数据类型的传输,故需要定义表之间的关系映射,在OGG命令行执行:
GGSCI (VM_0_25_centos) 20> edit params tcloud defsfile /u01/gg/dirdef/tcloud.t_ogg userid ggs,password ggs table tcloud.t_ogg;
在OGG主目录下执行:
./defgen paramfile dirprm/tcloud.prm
完成之后会生成这样的文件/u01/gg/dirdef/tcloud.t_ogg,将这个文件拷贝到目标端的OGG主目录下的dirdef目录即可。
这里主要是当目标端为HDFS目录或者Hive表或者MySQL数据库时需要手动先在目标端创建好目录或者表,创建方法都类似,这里我们模拟实时传入到HDFS目录,故手动创建一个接收目录即可
hadoop –fs mkdir /gg/replication/hive/
目标端的OGG管理器(mgr)和源端的配置类似,在OGG命令行下执行:
GGSCI (10.0.0.2) 2> edit params mgr PORT 7809 DYNAMICPORTLIST 7810-7909 AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3 PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
checkpoint即复制可追溯的一个偏移量记录,在全局配置里添加checkpoint表即可
GGSCI (10.0.0.2) 5> edit params ./GLOBALS CHECKPOINTTABLE tcloud.checkpoint
保存即可
在OGG的命令行下执行:
GGSCI (10.0.0.2) 8> edit params r2hdfs REPLICAT r2hdfs sourcedefs /data/gg/dirdef/tcloud.t_ogg TARGETDB LIBFILE libggjava.so SET property=dirprm/hdfs.props REPORTCOUNT EVERY 1 MINUTES, RATE GROUPTRANSOPS 10000 MAP tcloud.t_ogg, TARGET tcloud.t_ogg;
说明:REPLICATE r2hdfs定义rep进程名称;sourcedefs即在3.6中在源服务器上做的表映射文件;TARGETDB LIBFILE即定义HDFS一些适配性的库文件以及配置文件,配置文件位于OGG主目录下的dirprm/hdfs.props;REPORTCOUNT即复制任务的报告生成频率;GROUPTRANSOPS为以事务传输时,事务合并的单位,减少IO操作;MAP即源端与目标端的映射关系
其中property=dirprm/hdfs.props的配置中,最主要的几项配置及注释如下:
gg.handlerlist=hdfs //OGG for Big Data中handle类型 gg.handler.hdfs.type=hdfs //OGG for Big Data中HDFS目标 gg.handler.hdfs.rootFilePath=/gg/replication/hive/ //OGG for Big Data中HDFS存储主目录 gg.handler.hdfs.mode=op //OGG for Big Data中传输模式,即op为一次SQL传输一次,tx为一次事务传输一次 gg.handler.hdfs.format=delimitedtext //OGG for Big Data中文件传输格式 gg.classpath=/usr/hdp/2.2.0.0-2041/hadoop/share/hadoop/common/*:/usr/hdp/2.2.0.0-2041/hadoop/share/hadoop/common/lib/*:/usr/hdp/2.2.0.0-2041/hadoop/share/hadoop/hdfs/*:/usr/hdp/2.2.0.0-2041/hadoop/etc/hadoop/:/data/gg/:/data/gg/lib/*:/usr/hdp/2.2.0.0-2041/hadoop/client/* //OGG for Big Data中使用到的HDFS库的定义
具体的OGG for Big Data支持参数以及定义可参考地址
最后在OGG的命令行下执行:
GGSCI (10.0.0.2) 9> add replicat r2hdfs exttrail /data/gg/dirdat/tc,checkpointtable tcloud.checkpointtab REPLICAT added.
将文件与复制进程绑定即可
在源端和目标端的OGG命令行下使用start [进程名]的形式启动所有进程。
启动顺序按照源mgr——目标mgr——源extract——源pump——目标replicate来完成。
以上启动完成之后,可在源端与目标端的OGG命令行下使用info [进程名]来查看所有进程状态,如下: 源端:
GGSCI (VM_0_25_centos) 7> info mgr Manager is running (IP port VM_0_25_centos.7809). GGSCI (VM_0_25_centos) 9> info ext2hd EXTRACT EXT2HD Last Started 2016-11-09 16:05 Status RUNNING Checkpoint Lag 00:00:00 (updated 00:00:09 ago) Log Read Checkpoint Oracle Redo Logs 2016-11-09 16:45:51 Seqno 8, RBA 132864000 SCN 0.1452333 (1452333) GGSCI (VM_0_25_centos) 10> info push2hd EXTRACT PUSH2HD Last Started 2016-11-09 16:05 Status RUNNING Check