IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

一种oracle2hdfs的数据推送思路

量子数科院 2011-05-25 13:33:41 累计浏览 1,909 次
本机暂存

近期准备迁移一台旧机器上的应用,发现以前搞的一个从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速度和负载均可以接受

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. HFile存储格式 (累计阅读 15,977)
  2. Oracle MTS模式下 进程地址与会话信息 (累计阅读 14,409)
  3. Zookeeper工作原理 (累计阅读 12,203)
  4. Facebook的实时Hadoop系统 (累计阅读 11,497)
  5. GFS, HDFS, Blob File System架构对比 (累计阅读 10,508)
  6. HBase技术介绍 (累计阅读 8,077)
  7. 那些在11gR2中可能惹祸的新特性,一张列表帮助你摆脱升级11gR2带来的烦恼 (累计阅读 6,881)
  8. hadoop rpc机制 && 将avro引入hadoop rpc机制初探 (累计阅读 6,219)
  9. 性能测试工具sysbench简介 (累计阅读 6,027)
  10. AWS云平台系列介绍(一):AWS平台与EC2介绍 (累计阅读 6,008)