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中有个新特性,当表无数据 ...
随机推荐
- GITHUB个人博客搭建-Pelican 在Windows环境下的安装及配置
GITHUB个人博客搭建-Pelican 在Windows环境下的安装及配置 前言 此篇博客主要为Pelican在Windows平台下的配置安装所写,在此过程中主要参考资料烟雨林博客.poem_of_ ...
- Vue 2.0 生命周期-钩子函数理解
Vue 2.0 + 生命周期钩子在项目过程中经常用到,所以闲下来整理了下,直接复制下面的实例运行: <!DOCTYPE html> <html lang="en" ...
- 安卓屏幕旋转时,禁止Activity重新加载
安卓设备旋转屏幕时,Activity默认会重新加载,如果是要读取大量数据的场景,那等待的时间比较长,这一点不可接受,所以要想办法禁止Activity自动重新加载. 方法如下在AndroidManife ...
- Java中面向对象的分拣存储
Student.java package yzhou.map; /** * 学生类 * * * @author 洋 * */ public class Student { private String ...
- NIO使用Reactor模式遇到的问题
关于Reactor模式,不再多做介绍,推荐Doug Lea大神的教程:Java 可扩展的IO 本来在Reactor的构造方法中完成一系列操作是没有问题的: public class Reactor i ...
- Linux命令之unzip
unzip [-Z] [-cflptTuvz[abjnoqsCDKLMUVWX$/:^]] file[.zip] [file(s)…] [-x xfile(s)…] [-d exdir] unzip将 ...
- Flask实战第63天:评论布局和功能实现
评论后端逻辑实现 设计评论模型表, 编辑apps.models.py class CommentModel(db.Model): __tablename__ = 'comment' id = db.C ...
- SSL压力测试工具THC-SSL-DOS
SSL压力测试工具THC-SSL-DOS SSL广泛应用安全加密和认证领域,如HTTPS.POP等服务.使用SSL,会加重服务器的负担.例如,在协商阶段,服务器的CPU开销是客户端的15倍.Kal ...
- 【POJ 2154】Color
http://poj.org/problem?id=2154 还是先套上Burnside引理:\[\begin{aligned} ans & =\sum_{i=1}^n n^{(i,n)-1} ...
- python基础之数据类型之元组和字典
四.元组 1.用途:元组是不可变的列表,能存多个值,但只能取,不能改 2.定义:name = (‘alex’, ’egon’, ‘wxx’) 在()内用,分割开,可存放任意类型的值 强调:x = (‘ ...