一种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
-
[903] WordPress插件开发 -- 在插件使用 -
[135] 解决 nginx 反向代理网页首尾出现神秘字 -
[56] 整理了一份招PHP高级工程师的面试题 -
[54] Innodb分表太多或者表分区太多,会导致内 -
[54] 如何保证一个程序在单台服务器上只有唯一实例( -
[52] 全站换域名时利用nginx和javascri -
[52] 海量小文件存储 -
[52] CloudSMS:免费匿名的云短信 -
[51] 用 Jquery 模拟 select -
[49] ps 命令常见用法