Oracle数据迁移至HBase操作记录
Oracle数据迁移至HBase操作记录
@(HBase)
近期需要把Oracle数据库中的十几张表T级别的数据迁移至HBase中,过程中遇到了许多苦难和疑惑,在此记录一下希望能帮到一些有同样需求的兄弟。
HBase表设计
首先,是根据Oracle的数据规划HBase的表和表结构。 
从业务上看,十几张表大概可以分为两大部分:
- 交易信息
 - 客户操作
 
刚开始的计划是将所有表都导入HBase中的一张大表,但是思索讨论之后发现是行不通的:
1、由于各个表之间的业务关系复杂,无法设定一个理想的Rowkey。
2、各个表的数据量也是相差万别的,都放入一张大表中会造成列簇的数据倾斜问题。
3、建立HBase表的目的理论上和建立关系型数据库的目的是一致的,想想为什么Oracle中为什么要分为十几张表而不是一张就明白了,方便业务逻辑。
接下来的思路就是根据业务逻辑划分出来的两大部分,建立两张HBase表。
由于系统业务和建表逻辑是另外一组的人负责的,交给我们的文档就是一堆sql文件,隔壁的大神根据这堆sql文件整理除了表的关联关系,为建HBase表提供了基础依据,功不可没:-)
那么接下来的事情就是为两张表设计Rowkey和列簇了。 
关于Rowkey和列簇的设计原则可以参考: 
http://blog.csdn.net/qq1010885678/article/details/50504941
根据业务逻辑和表字段信息,发现交易和客户信息都是以手机号码为中心的,Rowkey可以使用手机号码来实现,为了避免数据热点的问题,决定将手机号码反转之后的值作为Rowkey。
关于列簇的敲定,由于HBase列簇最好是控制在1-2个,超过3个可能会有性能问题,所以我们根据业务逻辑,分别对属于交易和客户信息两大类下的各个表再次进行划分。
第一次划分出两大类是为了建HBase表,这次的划分是为了建立表中的列簇。
例如:交易这一大部分的6个表中,有4个是经常一起做连接查询的,而另外2个表则是另一组业务逻辑经常使用的 ,那么就HBase中的交易表就可以分为两个列簇:交易业务,个人操作,分别存储着原本Oracle中4个表和2个表的数据。
客户信息表中列簇的设计同理,根据表之间的关联程度划分出三个列簇,大致可以称为:基本属性,行为属性,签署协议。
敲定了HBase的表结构之后,建表就是分分钟的事情了。
数据迁移部分
现在我们在HBase中有两张表,结构如下。
交易表:
| Rowkey | 交易业务列簇 | 个人操作列簇 | 
|---|---|---|
| 手机号码反转 | 4张Oracle表数据 | 2张Oracle表数据 | 
客户表:
| Rowkey | 基本属性 | 行为属性 | 签署协议 | 
|---|---|---|---|
| 手机号码反转 | 4张Oracle表数据 | 2张Oracle表数据 | 3张Orale表数据 | 
使用Sqoop进行数据迁移工作,详细操作说明见:Sqoop操作实践
但是开始迁移操作的时候发现两个问题:
- 1、个人操作列簇中有张表的数据量是20亿,而交易业务列簇中最大的数据量才5千万,差了40倍。
 - 2、交易表的交易业务列簇中,4张表在导入HBase的时候时间戳是入库时间,但是在业务上需要使用一个该数据的生产时间。
 
对于第一个问题,我们采取的解决方案是:直接将20亿的个人操作列簇单独拆分为一张HBase表。 
理由:避免HBase表中数据稀疏、倾斜造成性能问题,而个人操作列簇从业务和数据量上看完成可以单独作为一张表使用。
对于第二个问题,采取的方案是:先将这四张表分别导入为四张HBase临时表,之后使用mr程序修改时间戳统一导入最终的交易表。 
理由:使用临时表第一是为了避免数据损坏,第二是方便mr程序修改时间戳属性。
而对于客户表,业务逻辑比较简单,可以直接使用Sqoop进行导入。
建立HBase始终是要在业务逻辑之上的,没有分析业务根本没办法知道HBase该分为几个表,每个表有几个列簇,每个列簇分别存储哪些数据,以及Rowkey的定义。
1.13更新
关于交易表的的数据版本问题,因为业务是根据手机号码和某个月份来查询的,平均每个月每个用户会查5次,那么之前的rowkey设计就是不合理的:
之前的rowkey是手机号码反转,其中一列为时间戳字段,那么每次有新的交易数据进来就会发生覆盖,之前我们一直在想设定值的版本为多少个比较好,12*5=60,也就是说每个列的值要设置为60个版本,这是极其不合理的。
现在,解决的思路是,既然是根据时间戳和手机号码来取数据的,因为每次数据入库的时候相同用户的交易数据会被新数据覆盖,那么把时间戳和手机号的组合设置为rowkey就完全可以解决这个问题。
那么这个rowkey的格式就是手机号码反转+时间戳,理由如下:
- 手机号码提供业务查询
 - 反转避免数据热点
 - 时间戳避免每月数据被覆盖(其实最后还是只用手机号码的话rowkey会重复的问题,也就是确保rowkey的唯一性)
 
另注:hbase统计数据量大的表可以使用其自带的一个mr程序:$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter tableName
1.21更新
从传统数据库到HBase,表设计的思路与步骤大概如下:
- 根据业务划分hbase表
 - 根据业务划分各个表的列族
 - 判断各个列族所对应的表是否有关联关系
 - 根据关联关系和查询的业务逻辑来确定rowkey的设计
 - 如果一个列族中的表关键字或者字段有冲突,可以在rowkey后面添加后缀。
 - 如果有关联关系,导入数据时需要注意对应问题
 
1.25更新
oracle表中如果没有合适的字段来给–split-by参数的话,可以用rownum这个默认的字段。
--split-by rownum
其余遇到的困惑会再进行后续更新。
作者:@小黑
Oracle数据迁移至HBase操作记录的更多相关文章
- mongodb数据迁移到hbase
		
mongodb数据迁移到hbase 导入包 # encoding: utf-8 ''' @author: zcc @license: (C) Copyright 2013-2017, Node Sup ...
 - Oracle数据迁移expdp/impdp
		
Oracle数据迁移expdp/impdp目的:指导项目侧自行进行简单的数据泵迁移工作. 本文实验环境:Oracle 11.2.0.4,利用数据库自带的scott示例用户进行试验测试. 1.首先需要创 ...
 - oracle数据迁移之Exp和Expdp导出数据的性能对比与优化
		
https://wangbinbin0326.github.io/2017/03/31/oracle%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB%E4%B9%8BExp%E ...
 - Oracle数据迁移笔记-Rownum与序列的自增长的组合用法技巧
		
Rownum与序列的自增长的组合用法技巧 根据序列自增长的步长规律,结合表行记录Rownum值的规则批量生成表的行记录主键的用法技巧 案例如下: CREATE OR REPLACE PROCEDURE ...
 - Oracle数据迁移后由列的直方图统计信息引起的执行计划异常
		
(一)问题背景 在使用impdp进行数据导入的时候,往往在导入表和索引的统计信息的时候,速度非常慢,因此我在使用impdp进行导入时,会使用exclude=table_statistics排除表的统计 ...
 - Oracle数据迁移至MySQL
		
ORACLE DB: 11.2.0.3.0 MYSQL DB: 5.5.14 因项目需求,需要将ORACLE生产中数据迁移至MYSQL数据库中作为初始数据,方法有如下几种: 1.ORACLE OGG ...
 - Oracle数据迁移-系统数据合并笔记
		
创建临时表:execute immediate 'sql'; 通过临时表和关联查询解决循环处理效率低下,大数据操作移植时时间太长的问题. 结构相同的系统数据库表移植,案例如下: create or r ...
 - Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查
		
一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...
 - 【Oracle 数据迁移】环境oracle 11gR2,exp无法导出空表的表结构【转载】
		
今天做数据迁移,但是发现有些空表无法exp,后来找到问题所在. [原文]:http://www.cnblogs.com/wenlong/p/3684230.html 11GR2中有个新特性,当表无数据 ...
 
随机推荐
- 常用python shell
			
路径及文件操作 创建目录 os.mkdir(path_str) 列出当前文件夹中文件,存入string list中 os.listdir(path_str) 判断路径是否存在 os.path.exis ...
 - C#读取RSS源,并利用Solr索引
			
折磨我几天的问题今天终于解决了,分享一下近期solr使用的一些经验. 本来是用nutch在爬取页面,可是客户需要爬取RSS,而且可以识别那些页面是通过RSS源抓取出来的.nutch虽然自带解析RSS的 ...
 - hdu 5576 dp
			
题目大意:给你一个长度为 n 的 字符串表示一个乘法,一次操作随机选两个字符进行交换,进行m次操作,让你求出所有可能操作 的答案和. (1 <= n, m <= 50) 思路:巨难.. ...
 - java网络通信:HTTP协议
			
熟悉java的同学,都知道javaEE当中很大一部分的内容,是WEB开发,那么在进行WEB开发的学习过程当中,除了需要学习SpringMVC/STRUTS2等框架以外,我们还需要对在WEB开发当中常用 ...
 - 洛谷——P2784 化学1(chem1)- 化学合成
			
P2784 化学1(chem1)- 化学合成 题目背景 蒟蒻HansBug在化学考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 眼下出现在蒟蒻HansBug面前的是一个化学合成题,据他所知, ...
 - 【Jersey】图片上传及显示
			
一.前期准备 图片上传需要用到的一些依赖: <dependency> <groupId>org.jvnet.mimepull</groupId> <artif ...
 - 【UOJ #131】【NOI 2015】品酒大会
			
http://uoj.ac/problem/131 求出后缀数组和height数组后,从大到小扫相似度进行合并,每次相当于合并两个紧挨着的区间. 合并区间可以用并查集来实现,每个区间的信息都记录在这个 ...
 - [BZOJ1975][SDOI2010]魔法猪学院(k短路,A*)
			
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2748 Solved: 883[Submit][Statu ...
 - POJ 1830 开关问题(Gauss 消元)
			
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7726 Accepted: 3032 Description ...
 - 【数论】nefu119 组合素数
			
算组合数中的素因子p的个数,基本同这题 http://www.cnblogs.com/autsky-jadek/p/6592194.html #include<cstdio> using ...