一种oracle2hdfs的数据推送思路
近期准备迁移一台旧机器上的应用,发现以前搞的一个从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速度和负载均可以接受
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:帝林 来源: 量子数科院
- 标签: oracle2hdfs 数据推送
- 发布时间:2011-05-25 13:33:41
- [70] Twitter/微博客的学习摘要
- [65] find命令的一点注意事项
- [64] 如何拿下简短的域名
- [64] IOS安全–浅谈关于IOS加固的几种方法
- [63] android 开发入门
- [62] 流程管理与用户研究
- [62] Go Reflect 性能
- [60] Oracle MTS模式下 进程地址与会话信
- [59] 图书馆的世界纪录
- [58] 读书笔记-壹百度:百度十年千倍的29条法则