文章采集平台(农行大数据、数据库和云计算等领域的应用实践与技术创新)
优采云 发布时间: 2022-03-05 04:13文章采集平台(农行大数据、数据库和云计算等领域的应用实践与技术创新)
关于作者
农行研发中心“数风云”团队,一支朝气蓬勃、快速成长的技术团队,始终致力于农行大数据、数据库、云计算等领域的应用实践和技术创新,探索数据赋能,勇攀高峰数据云顶,持续为企业数字化转型和金融科技发展贡献力量。
导读
随着科技的发展,我行零售业务系统正在经历分布式、微服务化改造,数据库也从单一部署的DB2数据库拆分为基于Oracle数据库的多套分布式系统。主备库数据实时同步,业务数据分库分表存储。同时基于Hadoop集群的Sqoop组件用于data采集,从Oracle获取全量和增量业务数据,形成完整的data采集流程,实现data采集@ > 与数据预处理无缝连接。
一、施工背景
随着我行零售业务的转型升级,各个业务系统逐渐拆分成独立的模块,各个应用系统独立部署,拥有独立的数据库。为了保证高可用性,每个业务系统都使用数据库集群来存储业务数据。逻辑表以分库分表的方式进行拆分。
如下图1所示,是从原单系统获取增量业务数据的流程图。数据库采用主备模式,主库的数据镜像每天通过日切的方式同步到备库。因此,备库是一个稳定的数据环境,可以保证数据的一致性。通过对数据交换中心的每张表设置增量抽取规则(通常是SQL语句的Where子句后的条件),然后通过专门的数据抽取模块,可以得到单库中每张表的增量数据落地是压缩数据文件,然后提供给下游需要消费数据的应用系统。
图1 单数据源架构增量数据获取流程
如下图2所示,当前单系统逐渐拆分后,各个独立系统使用Oracle数据库,并利用ADG技术实时同步主备数据库的数据。与原来的单一数据源架构相比,这种架构有以下几个方面: 难点:
图2 分布式数据源架构增量数据获取流程
二、工具选择
在我行结构调整之前,单库使用JDBC连接SQL语句采集数据,但由于部分数据库表数据量巨大,性能成为数据采集的瓶颈,所以针对以上需求场景,选择了以下5款常用的导出工具进行性能测试。性能对比如下表所示:
通过对比测试发现,通过Hadoop生态系统的Sqoop组件效率最高,并且该组件针对Oracle和Mysql数据库进行了优化,支持快速模式(详见第4节)。同时,Sqoop 导出的数据直接存储在 HDFS 上,省去了从本地磁盘上传到 HDFS 的环节,方便后期处理数据加载。
对于 Sqoop 的快速模式,我们也对比了是否使用数据压缩和不同的并发数。可以看出,压缩方式可以减少网络开销,大大提高采集的效率。具体条件如下表所示:
三、技术架构
Sqoop数据采集模块,部署在Hadoop分布式计算环境中,负责拆分后各子系统Oracle备库的数据采集,对采集的数据文件进行压缩上传@> to HDFS 为下游数据应用系统提供源系统数据。
四、关键技术说明
1、Sqoop 直接模式
SqoopV1.4.6 提供了导入Hadoop for Oracle 数据库的快捷方式,参考以下:
快速模式可以利用Oracle数据库的特性来满足高效的数据导出性能。底层调用Oracle数据库的系统函数计算一张表在底层数据块中的位置,并以并发直接顺序读取该表对应的数据块。它依赖于表的索引,因此不支持提取条件和字段过滤。具体执行代码如下:
2、数据一致性保证
因为Sqoop采集的数据库可能不是静态环境,所以在data采集执行的过程中还是有表数据更新的。在某些场景下,需要在数据抽取过程中保证数据的一致性,Sqoop可以提供。本方案底层使用Oracle数据库的闪回查询技术,需要结合表的大小和Oracle数据库的参数调优(undo_retention等),否则会导致ORA-01555快照太旧错误。具体如下图所示:
3、Sqoop 权限设置
Sqoop 直接模式需要在数据库中设置相关权限。以Oracle数据库为例:
(1)Oracle ADG库新Sqoop专用用户(假设为B),要求密码不能收录@、$和单双引号;
(2)Oracle 为用户提取额外的权限:
(3) 将表执行权限授予专用用户,因为数据库表是由产品用户(假设为A)创建的,DBA需要授予用户B查询A所属表的权限,即:
将 A.Tab_A 上的选择授予 B 或将任何表上的选择授予 B。
另外,如果有数据一致性要求,需要授予用户B对A所属表的闪回查询权限,即:
将 A.Tab_A 上的闪回授予 B 或将任何表上的闪回授予 B。
4、自定义字符串分隔符方案
Sqoop默认只能设置单个字符作为列分隔符,行分隔符默认为换行符,所以当数据内容中收录分隔符时,很容易导致下游获取的数据不可用。它可以通过以下方式增强:
(1)修改表格自动生成的代码,重新编译打包
Sqoop的导入命令在执行时,会根据每张表A的情况自动生成A.java文件,然后编译打包到Hadoop的数据节点执行提取任务。这个过程也可以分步进行,即先通过codegen命令生成A.java文件,然后修改部分代码片段,加强行列分隔符功能,再编译打包java文件成.jar文件,然后通过指定jar包执行导入命令,如下:
修改行和列分隔符。自定义列分隔符,需要修改toString()函数中的第二行(下图中第851行,修改fieldDelim为执行的String),自定义行分隔符可以在该函数中修改。1220行,添加指定的行分隔符。
(2)通过指定jar和class类来执行import命令
5、增量数据采集
由于 Sqoop 直接模式的全量数据获取效率高(具体原理见前面的描述),为获取表的精确增量数据提供了另一种方案,即每天获取表的全量数据,然后与主键关联。,进行全场比对,获取表的技术增量数据。这种方法可以达到100%的准确率。尤其是当数据源的数据表没有更新日期字段、存在物理删除、需要多表关联、数据治理频繁等情况时,可以使用该方案获取原系统无需任何修改。100% 准确的增量数据。
下图是从原来的单一DB2数据源切换到Oracle数据源,前后选取几张大表对比,平均抽取性能提升50%以上的情况。
6、其他预处理能力
由于 Sqoop 的功能比较简单,并且数据在 采集 之后存储在 HDFS 中,因此可以方便地扩展基于 Hadoop 技术栈的数据预处理能力。我行具体场景包括:分库分表数据合并、敏感字段内容过滤、编码字段解码、数据切分等。
五、总结
实践证明,基于 Hadoop 的生态系统中关系型数据库 Oracle采集 的 Sqoop 直接模式的效率值得肯定。通过JDBC连接SQL语句的方式解决了采集数据的性能瓶颈,实现了采集数据与预处理功能的流畅连接,提高了下游消费数据的时效性,为行业数据平台建设。