使用 Amazon Athena 分析本地 Oracle 数据库导出的数据

957b688705bed57609d4ac190e3b730b.png

4304521fa979c1ec4e3899b84d7da08a.gif

点击上方入口立即【自由构建 探索无限】

一起共赴年度科技盛宴!

前言

传统企业客户,无论是前台的交易数据库还是后台的数据仓库,都会选择使用 Oracle,它具备非常广泛的技术资料、社区资源和问题处理案例(各种踩坑的经验);同时它还有广泛的用户基础,很多企业的技术栈都是围绕 Oracle 数据库构建开发和运维工作,保障业务的使用。比如金融行业的 Oracle 数据库主要业务场景会涉及到账务、资金和资产中心。

如果用户希望和业务直接相关的数据可以更持久的存储并且做一些离线的分析,很多企业会构建自己的大数据分析平台,把数据存储到平台进行分析,就好比水从源头流入湖中,各种用户都可以来湖里获取、蒸馏和提纯这些水(数据)。下图是数据湖的一个典型逻辑架构,它是由多个大数据组件、云服务组成的一个解决方案,包括摄取层、处理/蒸馏层、维护层和数据洞察。

189f87728e8bb8fa34ce132515bf1008.png

在水从源头流入湖中的摄取层,常见的场景是通过 Apache Sqoop DMS(亚马逊云科技数据迁移服务)将数据从 RDBMS 导入到数据湖(HDFS/HDFS/Hive/HBase),转换成列式存储格式,适配使用的查询引擎和计算框架,通过上图中的数据洞察来提供业务大盘和各种报表,辅助业务团队做决策。

28ea2d8f45d357573f9dcf8102847d68.png

Amazon DMS(Database Migration Service)是一种 Web 服务,用于将数据从源数据存储迁移到目标数据存储。可以在相同数据库引擎的源和目标节点之间迁移,也可在不同数据库引擎的源和目标点之间迁移。

42a71facb35da53243313f1571505b56.png

Amazon Athena 是一种基于 Presto 的交互式查询服务,使用标准 SQL 直接分析 Amazon S3 中的数据。数据科学家和数据工程师经常会使用 Athena 进行数据分析和交互式查询。Athena 是无服务器服务,可以自动扩展并执行并行查询,没有维护基础设施的工作,用户按照查询的数据量付费。

f7f22d3751bfa02b4ad95e49cc965a6d.png

在企业环境下,混合云架构是一种常见的架构,理想环境下摄取层的传输场景是通过 Apache Sqoop 或 DMS 使用网络专线将本地 Oracle 数据库数据迁移到 s3 存储桶,再进行数据分析。

421c807247c35480be79d5695a48ae08.png

但受本地条件限制,很多用户是用 Oracle Datapump 或者 Exp/Imp 将数据导出后,再将本地数据传输到 s3 存储桶。本文通过阐述使用上述两种不同的工具,介绍如何将数据导入 s3 存储桶,使用 Athena 做数据分析。

Apache Sqoop :

https://sqoop.apache.org/

DMS:

https://www.amazonaws.cn/dms/

Amazon DMS:

https://aws.amazon.com/cn/dms/getting-started/

Amazon Athena:

https://aws.amazon.com/cn/athena/features/

1. 方案概述

方案一

使用 Oracle 数据泵将本地 Oracle 数据库数据导出,上传到 s3 存储桶,再由适用的 Amazon RDS for Oracle 加载数据,利用 DMS 服务将 RDS Oracle 数据库数据迁移到 s3 存储桶,使用云上的大数据组件 Athena 进行分析。

e907053016ff17227c44d7372cd5e8a1.png

方案二

使用 Oracle Exp 将本地 Oracle 数据库数据导出,上传到 s3 存储桶,再在云上 EC2 安装 Oracle 对应版本的数据库,Imp 数据到 EC2 Oracle,使用 DMS 服务将 EC2 Oracle 数据库数据迁移到 s3 存储桶,利用云上的大数据组件 Athena 进行分析。

78cccbcd361b3faa87fdcf5fac9485c0.png

2. 使用的资源

27d809b2483e2976572c54bd466f6fd3.jpeg

3. 方案一 

使用 Oracle Datadump 导出数据

Datapump 是从 Oracle 10g 中引入的功能,无论性能还是压缩比,都比传统的 Exp/Imp 更有优势。相比较 Exp 和 Imp 作为客户端工具程序而言,Expdp 和 Impdp 是服务器端工具程序,只能在 Oracle 服务器端使用,不能在客户端使用。Data Pump 是将大量数据从 Oracle 迁移到 Amazon RDS 数据库实例的首选方法。

3.1 最佳实践

当使用 Oracle 数据转储将数据导入到 Oracle 数据库实例时,建议使用以下最佳实践:

  • 在 schema 或 table 模式中执行导入,以便导入特定架构和对象

  • 请勿在 full 模式中导入

因为 Amazon RDS for Oracle 不允许访问 SYS 或 SYSDBA 管理用户,所以在 full 模式中导入架构可能会损坏 Oracle 数据字典并影响数据库的稳定性。

3.2 预期目标

1. 在本地数据库新建一张表,并通过数据泵将该用户下的所有表导出;

2. 将 dmp 文件上传到 s3 存储桶;

3. 将 dmp 文件加载到 RDS Oracle 并能查询到表;

4. 使用 DMS 将数据导出 Parquet 格式存在 s3,并能查询到表;

5. 在 Athena 中查询表。

d0e99685fd0e920b8876e2503136215f.png

3.3 本地 Oracle 数据库建表和导出

1. 在本地 DPADMIN 用户下新建一个表 dep,插入数据。

dd19ef1ecafeb8ba56116ea91fe0805e.png

2. 创建数据转储文件。

DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null, version=>’12.0.0’);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'dpadmin.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

*左滑查看更多

fcb5312136548d3fb4c584235c21203d.png

3. 上传数据转储文件到 s3 存储桶。

528040f62937d78123d3a663eeb30d61.png

4. 配置 RDS Oracle DB 选项组

和 s3 存储桶的集成

RDS for Oracle 与 Amazon S3 集成,数据库实例必须可以访问 Amazon S3 存储桶。

4.1 RDS 中创建一个选项组

1. 在 RDS 选项组选择创建组。

ab780199b33e2910de79bf2c9c78cc03.png

2. 命名并选择相应的引擎和版本。

06a0a9c4de6dce8b9e0c52c3da783783.png

4.2 在选项组中添加

和 S3 存储桶集成的选项

1. 创建完成后再次打开这个选项组,选择 Add option。

51f01dd1aeed5f5a5ba9a39303260813.png

2. 在 Option name 选择 S3_INTEGRATION,Version 选择1.0,立即应用。

c8ae8e7f5619f765c3705bdc5dfc6f46.png

4.3 将上述选项组应用到 RDS Oracle 中

1. 回到 RDS Oracle,选择 Configuration,可以看到现有的 Option Groups。

aa43a76108f7abb4a5994f026072107f.png

2. 选择 Modify –> Configuration。

44bab621768b936ab42635f628bee731.png

3. 把 Option group 选择为刚才新建的 s3-integration-group。

26ecd18cac06fb4a0e4ecdbb088dd5c0.png

4. 修改 DB 实例,立即应用,该过程不需要重启实例。

e31488191e4eb06b885460de7659213d.png

5. 在 Configuration –> Option groups 下查看当前选项组,变更完成。

5db1679caea0276acfa1b998ead7d6f0.png

4.4 将创建好的访问 s3 存储桶的 

Role 关联到 RDS

1. 在 IAM –> 角色下,创建 RDS Role,附加可以访问对应 s3 存储桶的策略。

44492820d6215cebb80ca174cffe45f1.png

2. 在 RDS –> 数据库 –> Oracle –> Connectivity & security –> Manage IAM roles 下,选择创建的 RDS_access_s3 角色和 S3_INTEGRATION 功能,添加角色。

a99e108519ee929496c15464ec0248df.png

5. 使用 RDS Oracle DB 

从 s3 导入数据

1. 在终端节点上,使用 DBveaver 工具管理 RDS Oracle。配置其连接的 URL、用户名和口令。

016d99d40bcc5872555c27414256dc3f.png

2. 将 ora-datadump 存储桶下 dump 目录中的所有文件下载到 DATA_PUMP_DIR 目录。

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
      p_bucket_name    =>  'ora-datadump', 
      p_s3_prefix      =>  'dump/', 
      p_directory_name =>  'DATA_PUMP_DIR') 
   AS TASK_ID FROM DUAL;

*左滑查看更多

e65024fa16a28a80a8aad9cbf1d67161.png

3. 通过显示任务的输出文件来查看结果。

select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by mtime;

*左滑查看更多

34c43b420fc2fd3bc3dbee8b0441f73a.png

4. 使用 rdsadmin.rds_file_util.read_text_file 存储过程查看 bdump 文件的内容。

SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1656464372310-35.log'));

*左滑查看更多

6490a3b428b99c04072b5e4a2dba5dc0.png

5. 从导入的转储文件中还原架构和数据。

DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => ‘IMPORT’, job_mode => ‘SCHEMA‘, job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => ‘DPADMIN.DMP’, directory => ‘DATA_PUMP_DIR‘, filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

*左滑查看更多

577bda72ca92d16a43a2e6acca54a7c8.png

6. 查询表是否已导入。

8e0a370829d21196af3745be8505fcbf.png

6. 创建 DMS RDS 终端节点和复制实例

6.1 创建终端节点

1. 创建终端节点 RDS Oracle,只需选择已有的实例即可。

6ea0868bf647fc8b947954359c70472b.png

2. 配置终端节点 RDS Oracle 的用户名和口令。

fba63e5b6ab9a2c22b8d812b108ad301.png

3. 创建终端节点为 s3。

788144ef8a520f62eea4343e9e4303b7.png

4. 配置终端节点 s3 的存储桶名和文件夹。

e7a6054004bf9ae08492fdb9ed56629b.png

5. 配置终端节点 s3 参数,使用以下额外连接属性来指定输出文件的 Parquet 版本:

parquetVersion=PARQUET_2_0;

27c8115ae6031499b1a68d38c406b1e9.png

6.2 创建复制实例

1. 创建复制实例,命名并选择实例类型。

eb6ffdeeac3119048dfa58e559b83bed.png

2. 配置复制实例。

2bed8a09aef219ee2efa900c2c152d49.png

6.3 创建并执行迁移任务

1. 创建数据库迁移任务,命名标识符,选择创建的复制实例,选择源和目标终端节点。

8c40be775ee24b275e4323bf6e38fcd1.png

2. 配置数据库迁移任务,选择向导模式。

2b83a59c0abf52bad305e942a60273c5.png

3. 配置数据库迁移任务表映像,架构名称为%,表名称为之前 Oracle 数据库创建的表 DEP;选择“创建任务”。

9959bb7b49b696050fecfa6babc72b30.png

4. 观察数据库迁移任务状态,从“正在运行”到“加载完成”。

255e14c0f088e7e2f7a773a775bcffd1.png

5. 查看 s3 终端节点的目录,可以看到生成 parquet 文件。

c16edc7d8449d9f337792442f15f8f59.png

7. 使用 Athena 分析 Oracle Expdp 

导出数据

7.1 Athena 操作步骤

1. 先设置一下 Athena 查询结果的存放位置,选择 s3 存储桶的路径。

e58248baa47882d0017572f3b750dcd0.png

2. 在 Default 数据库下创建表 dep,CREATE TABLE 语句必须包含分区详细信息,使用 LOCATION 指定分区数据的根位置,运行以下内容进行查询。

CREATE EXTERNAL TABLE IF NOT EXISTS `default`.`dep` (
`dep_id` int,
`dep_name` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) 
LOCATION 's3://ora-datadump/output/expdp/DPADMIN/DEP/'

*左滑查看更多

acf44d296593d115523af263215e381a.png

3.查询 dep 表的结果。

be6d89653f23feee1239805edcc9bc2e.png

8. 方案二 

使用 Oracle Exp 导出数据

受限于 Oracle 版本和使用习惯,很多用户还在使用 Exp/Imp,其更适合用于数据量较小且不需要 BINARY_FLOAT 和BINARY_DOUBLE 等数据类型。导入过程会创建架构对象,非常适合用于包含小型表的数据库。

上述 RDS Oracle DBMS_DATAPUMP 仅适用于 Oracle Datadump 导出的 expdp 文件,而使用 Exp/Imp 工具导出的二进制文件无法直接导入 RDS Oracle。需要新建一台 EC2,安装 Oracle DB,Imp 导入二进制文件。

预期目标:

1. 在本地数据库新建一张表,并通过 Exp 将该用户下的所有表导出;

2. 将 dmp 文件上传到 s3 存储桶;

3. 启动一台 EC2 Windows,并安装 Oracle 19c,安装步骤请参考 Oracle Database Installation

4. 将 dmp 文件导入到 EC2 Oracle,并能查询到表;

5. 使用 DMS 将数据导出 Parquet 格式存在 s3,并能查询到表;

6. 在 Athena 中查询表。

adae6574cffe1ead91810132b8323469.png

Oracle Database Installation 参考文章:

https://docs.oracle.com/en/database/oracle/oracle-database/19/ntdbi/operating-system-checklist-oracle-database-installation-microsoft-windows.html

9. 导出数据并上传到 s3 存储桶

1. EXP 导出数据和日志。

exp dpadmin/oracle@orcl file=C:\app\oracle\oradata\exp\exp0628.dmp log=C:\app\oracle\oradata\exp\exp0628.log owner=(dpadmin)

*左滑查看更多

e5b9fdba63b498fc87b9514dbec15910.png

2. 将日志上传到 s3 存储桶对应的文件夹。

b5104d4621d0d82de1c6f8cc31572bf4.png

3. 在云上 EC2 Windows 上下载 Amazon CLI 客户端。

C:\Users\Administrator>msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi

C:\Users\Administrator>aws --version
aws-cli/2.7.14 Python/3.9.11 Windows/10 exec-env/EC2 exe/AMD64 prompt/off

*左滑查看更多

652983899e3b78f27dee0f63fdec3450.png

4. 选中 EC2 Windows,选择 操作–>实例设置 –> 附加/替换 IAM 角色,选择创建好的 S3_full_access Role(附加可以访问对应 s3 存储桶的策略)。

ddd679ee1ad0dee52a9beb9e0e78aaad.png

5. 使用 Amazon CLI 同步本地和 s3 存储桶的文件,将 Exp 导出的数据上传到 s3。

C:\aws s3 sync s3://ora-datadump/expdump/ C:\app\oracle\admin\orcl\dpdump\exp

*左滑查看更多

51fc6670af6670d82cb7a2e9177a76c3.png

10. 使用 EC2 Oracle Imp 导入数据

1.在测试用的 EC2 Oracle DB,先将 dep 表删除。

5180ef61578ffb6ec1cab8971ceec862.png

2. 再将数据导入 orcl 数据库中,指定用户名和表名。

imp dpadmin/oracle@orcl file=C:\app\oracle\oradata\exp\exp0628.dmp fromuser=dpadmin tables=(dep)

*左滑查看更多

ebf50e2dd05cf59cb4e31d7b03c67b9f.png

3. 验证导入的表。

36dc9b4c14e7d8cefe59d64af866aa53.png

11. 创建 DMS 终端节点

11.1 创建终端节点

1. 创建终端节点 EC2 Oracle。

a2082be9519a0f721ef35e15a678fe4d.png

2. 测试终端节点 EC2 Oracle 连通性。

ae01cfb14e22294047bbbe2009e3e567.png

3. 创建终端节点 s3。

12b2bedc193824b3a03341b8e4014a2f.png

4. 配置终端节点 s3 参数,使用以下额外连接属性来指定输出文件的 Parquet 版本:

parquetVersion=PARQUET_2_0;

ae5ff287875cec083acea3d774cbffef.png

11.2 创建并执行迁移任务

1. 创建数据库迁移任务,命名“任务标识符”,延用之前的复制实例,选择源和目标终端节点。

32fffe559917260047c4f1e40ba64fac.png

2. 配置数据库迁移任务,选择向导模式。

9170964a7c9d9c0741e6f9b37f57c0a2.png

3. 配置数据库迁移任务“表映像”,架构名称为%,表名称为之前创建的 DEP。

08494612c3e1eed02839c200b164983b.png

4. 查看数据库迁移任务状态。

c303fd5abc2b8faf4f0de3ce39a723ba.png

5. 查看 s3 终端节点的目录,可以看到生成 parquet 文件。

ef922225d3279597c7cfbddba36f16d0.png

12. 使用 Athena 分析 

Oracle Exp 导出数据

12.1 Athena 操作步骤

1. 创建库 exp。

CREATE DATABASE exp

18c95c9d6b48af2bdf11a49a23761fa1.png

2. CREATE TABLE 语句必须包含分区详细信息,使用 LOCATION 指定分区数据的根位置,运行以下内容并进行查询。

CREATE EXTERNAL TABLE IF NOT EXISTS `exp`.`dep` (
`dep_id` int,
`dep_name` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) 
LOCATION 's3://ora-datadump/output/exp/DPADMIN/DEP/'

*左滑查看更多

77cc2c084f99109549ae3dc6ac77493b.png

3. 查询 dep 表的结果。

0b3264cb2b73a6112667fc2c87a0a7fb.png

13. 参考资料

使用 Amazon DMS 以 Parquet 格式将数据迁移到 Amazon S3:

https://aws.amazon.com/cn/premiumsupport/knowledge-center/dms-s3-parquet-format/?nc1=h_ls

Amazon RDS for Oracle 与 Amazon S3 集成:

https://aws.amazon.com/cn/premiumsupport/knowledge-center/rds-oracle-s3-integration/

使用 Oracle 数据泵将本地 Oracle 数据库迁移到适用 Amazon RDS for Oracle:

https://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump.html

使用 Oracle Data Pump 导入:

https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Procedural.Importing.DataPump.html

将数据导入 Amazon RDS 数据库实例:

https://aws.amazon.com/cn/premiumsupport/knowledge-center/rds-import-data/

总结

本文讨论的是在混合云架构下将本地 Oracle 数据库数据上传到云上,利用云上的大数据工具进行分析,这只是亚马逊云科技数据湖的一个使用场景。数据湖是由多个大数据组件和云服务组成的一个解决方案,可以存储结构化数据(如关系型数据库中的表),半结构化数据(如 CSV, JSON),非结构化数据(如文档、PDF)和二进制数据(如图片、音视频)。通过数据湖可以快速地存储、处理、分析海量的数据,同时在安全合规的场景下使用多种多样的手段进行分析。

本篇作者

e7178654e98937f4b5aac26192826094.jpeg

缪翰林

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的方案咨询、设计和架构评估。在运维,DevOps 方面有丰富的经验,目前侧重于大数据领域的研究。

a4feb152397011d64e25b1b752205628.jpeg

点击上方【立即报名】

直通大咖云集的亚马逊云科技中国峰会!

52b4f9f2126ca7bb1ba0196dd123689d.gif

7c7c3a4592b9448ffff5a108ef788794.gif

听说,点完下面4个按钮

就不会碰到bug了!

d58574bb1a4a330562e8b8e0e7c2d0bd.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值