Oracle大批量图片数据抽取方案总结

在ETL工作中,经常需要抽取数据,一般我们都是使用exp/imp、expdp/impdp、sqluldr2/sqlloader、kettle来抽取,但对于图片数据上面的工具都不好用,虽然kettle可以抽图片,但速度太慢,不够灵活,特别在抽取任务中断后重启补抽时就需要把所有的数据加载到它的壶中进行比较,速度慢的令人发指。

目前工作中,我是用Python来实现图片抽取工作,对数据抽取中的一个逻辑处理可以方便快速的定制。

由于Python在使用游标抽取ORACLE图片数据时不可以使用多线程,总是报错。经过思考和尝试,我们采用了通过消息队列或者kafka来实现达到并行的方式。


那么,自然就得把图片抽取拆分为两步:

  1、主进程获取图片ID放入队列或kafka

  2、从进程从队列或kafka中读取图片ID,通过图片ID从数据库获取图片,进而写入目标数据环境(文件系统或目标数据库)


数据抽取任务中断处理:

如果数据抽取过程中断,需要通过在Redis中比对出未抽取过的图片ID继续抽取或者通过DBLINK关联目标表和源表过滤出未抽取的图片


以下是我用Python写的一个界面

1、整个软件是由两个界面组成,一个任务列表界面管理所有任务,一个任务编辑界面对单一任务进行管理;

2、在任务列表管理界面实现添加新任务,及对某个任务进行编辑、删除、停止、启动、同步功能。同步即任务中断后,可以再次启动,从上次中断的地方开始抽取数据;

3、单任务管理界面实现对任务的配置,测试数据库连接,获取源表、目标表的字段,通过用户的勾选,然后自动生成对应的SQL,支持用户对SQL的进一步编辑。还包括数据抽取目标环境选择。

UI.png

细节说明:

1、源端数据:数据抽取要实现在源表是一表张(视图)或两张表(视图)的情况,如何生成关于获取图片ID的SQL以及关于获取图片的SQL

2、抽取任务中断后数据同步的方法:

   1)预加载已抽取的图片的ID到Redis中,获取源表中的图片ID来进行比对,进而是否需要同步

   2)通过DBLINK关联已抽取的表和源端的图片ID的表,进而判断是否需要同步

3、目标数据:数据抽取到文件系统或目标数据库

0

热门评论