技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统架构 --> 一种oracle2hdfs的数据推送思路

一种oracle2hdfs的数据推送思路

浏览:1195次  出处信息

近期准备迁移一台旧机器上的应用,发现以前搞的一个从oracle数据库推送数据到hadoop hdfs里的程序,share思路给大家。

基本的思路流程如下:

按rowid切分oracle table -> 多线程读取每个rowid区间的数据 -> 管道并put到云梯

有意思的部分主要在切分table这块

1.切分oracle数据

当需要dump某一个table的数据时,获取这个table在oralce的dbf文件中的rowid的范围,再通过”select /*+ ROWID(a)*/ columclause from tablename a where rowid between chartorowid(”minrowid”) and chartorowid(”maxid”)”的办法,获取数据。

切分table以获取这个table在oralce中的min、max rowid的一个办法如下:

select min(chartorowid(min_rowid)) min_rowid,
       max(chartorowid(max_rowid)) max_rowid
  from (select T.min_rowid,
               T.max_rowid,
               T.Relative_Fno,
               NTILE(100) over(order by T.Relative_Fno, chartorowid(T.min_rowid)) group_id
          from (select dbms_rowid.rowid_create(1,
                                               B.data_object_id,
                                               A.relative_fno,
                                               A.block_id,
                                               0) min_rowid,
                       dbms_rowid.rowid_create(1,
                                               B.data_object_id,
                                               A.relative_fno,
                                               A.block_id + A.blocks - 1,
                                               10000) max_rowid,
                       A.Relative_Fno
                  from (select relative_fno, block_id, blocks
                          from sys.dba_extents
                         where segment_name = '***'
                           and owner = '***'
                         order by block_id) A,
                       (select data_object_id
                          from sys.DBA_objects
                         where owner = '***'
                           and object_name = '***') B
                 where B.data_object_id IS NOT NULL) T)
 group by group_id

2.读取oracle数据
现在,我们拿到了一个oracle table的min/max rowid,这里的min/max rowid可能有很多组,我们可以启动多个线程并发的读多组数据,加快从oracle读取数据的速度。这些读线程,可以视为典型的生产者/消费者模型中的生产者。

多线程从oracle拿到的数据,统一往某个数据池里面扔(比如扔到某个Bytesbuffer的arraylist里),有几个thread在工作,arraylist就多大,每次往bytesbuffer里写数据时,都尽可能塞更多的block块进去。arraylist的另一端,由消费者进程轮询arraylist中每个bytesbuffer,当buffer不空时,加锁,读取buffer中的内容并写到某个管道文件,由hadoop dfs -put命令读走,同时,消费者进程清空该buffer,释放锁。

当整个arraylist大小变为0时,即所有生产者进程都结束时,整个table的读取过程结束。

3.测试数据
在8core/12GB的机器上开启dump程序(db在其他机器),30线程并发,oracle2hdfs速度大约25MB/s,dump机器负载大约6,db负载大约在2左右。dump速度和负载均可以接受

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1