一、前言

关于数据落地方面,HBase官网也有相关介绍。本文主要介绍一下实际工作中涉及的数据存储方面的一些经验和技巧,主要涉及表rowkey设计、数据落地方案

二、表设计

相对于MySQL等关系型数据库而言,HBase也有相应的类似库和表的概念,其中MySQL的库对应于HBase的NameSpace (0.95以上版本才支持), 表对应于HBase的表。对于NameSpace来说,HBase默认有两类:default和hbase, default中存放的实际数据的表,hbase中存放的是系统内建表,如meta元数据表。

2.1 ROWKEY设计

HBase表在设计过程中,rowkey设计很关键,如果rowkey设计不好,可能会出现热点、负载不均衡、数据冗余等问题。常见的ROWKEY设计一般需要遵循几个原则:

1) rowkey要惟一: 组成rowkey的字段需要全局惟一,比如像支付订单类的系统,一般存在交易单号,交易时间等,可以把这两个字段组合成rowkey, 这样在scan数据时还可以按单号还时间来批量扫描数据以提高效率

2) 避免热点问题: 在考虑惟一性之后,还需要考虑热点问题,hbase是分布式存储系统,数据存储时按region维度进行管理,region会分配到各regionserver上,如果rowkey设计不好,会存在同一类型的数据会集中在某几个region上,导致数据写入和访问时出现热点现象,像这类问题很容易导致regionserver宕机现象,影响集群稳定性。像我们生产环境的下rowkey设计,还会考虑一个分桶规则,分桶的规则是比如将单号后三位作为分桶号,同时在建表时指定SPLITS参数,预拆分表的region。

a. 建表时怎么指定region数呢,如下建表语句,即指定表预先分配3个分桶,这样以001,002,003结尾单号的数据会存储到001,002,003分桶中,同时这些分桶会被随机分配各到各台regionserver。

create 'test', {SPLITS =>['001', '002', '003']}

  b. rowkey设计形式类似于如下:分桶号#交易时间#交易单号

000#2017-01-27 00:00:00#11111111000

   3)业务需求:一般业务在查询hbase数据时,会要求你的数据必须能实现多维度查询和按时间段,用户ID进行批量提取数据等。对于多维度查询方面,hbase因不支持二级索引,导致实现这类多维度查询有很大难度,在我们集群中,用了一个折中方案,就是将索引字段独立出来建一个单独的索引表,索引表的KEY值 为索引字段加时间组合成rowkey, 索引表的value值为数据表的rowkey值, 这样通过索引字段先扫描索引表,得到数据表的rowkey后,再扫主表,得到具体的交易数据。这样就间接实现类似二级索引功能。具体设计如下:

索引表设计: 索引表的rowkey主要是将单号和交易时间组合,同时为避免单号存在热点问题,将单号反转后处理,如下面rowkey:

#单号:123456,交易时间:2017-01-27 00:00:00
rowkey: 654321#2017-01-27 00:00:00
value: 456#2017-01-27 00:00:00#123456

2.2 表设计

hbase表在设计时,需要评估业务表数据量的大小,像我们的业务数据单表可能日均数据量能达到20亿级别,如果在设计时只设计单表的话,那后续在数据维护、业务使用时将会碰到很大的麻烦,所以我们考虑的是将同一类业务表,设计成按月分表,设计成按月分表的话,对某个月的表的操作可以不影响其它月份的表,尽量减少受影响的数据范围,同时操作月表,数据也易迁移,使集群受影响的程度尽量减少。上面介绍到分桶的概念,对于按月分的表,根据数据量的大小,预先规划region的数量,会使数据尽量分布均衡。

表设计时,还需要考虑列簇数量,列族的话不宜过多,1-3个为好,越多列族相互之间受影响也越大,同时影响集群数据稳定性。考虑到我们生产环境的业务数据是从MySQL表过来的数据,所以只设计了一个列族,方便操作管理。表在创建时,会带一些参数来优化数据存储,如下所示, 会带上hfile文件的最大size, region拆分规则,列族名,BloomFilter模式为ROW模式,压缩算法为snappy, 块大小,blockcache等。

create 'test', {METHOD => 'table_att', MAX_FILESIZE => '549755813888', METADATA => {'SPLIT_POLICY' => 'org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy'}},
{NAME => 'cf', DATA_BLOCK_ENCODING => 'DIFF', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'},
{SPLITS =>['001','002','003']}

 

三、数据落地方案

HBASE数据场景很多,业务产生的数据如何入到Hbase呢,对于实时数据而言,一般会用到一些组件,如kafaka, storm, spark等, 通过采集Agent将业务数据进行清洗,将数据规范成指定格式的消息记录,然后写入到Kafaka, 进行数据分发,再通过storm集群进行数据消费到hbase, 这种模式也是业界很常见的模式。对于我们的集群,由于业务数据过于庞大,业务对数据时效性也很高,所以数据一般先入MySQL, 通过binlog采集解析入到消息队列再经过Storm集群进行消费入hbase。这种架构的话,对于采集要求很高,不能有数据丢失,业界关于binlog实时采集国内比较有名的就是淘宝的canal组件,该组件可以高效稳定采集业务DB的数据,并实时记录binlog采集位置,一旦采集Agent机器故障,支持将任务切换到其它机器继续采集,对于业务DB如果出现故障,可以及时告警发现异常。经过canal清洗的数据进入到kafaka,kafaka的优点我就不介绍了,网上很多资料介绍,Kafaka的数据再经过storm程序批量同步到HBase,实现实时数据入HBase这一方案。

因数据分析,业务查询需要,需将存储在MySQL的历史数据也同步到HBase,但因历史数据已无binlog, 所以需要考虑其它方案将数据同步到HBase, 对于这种场景,一般是用bulkload将数据同步到Hbase,我们也是用bulkload,因为原生的bulkload使用还是用些问题,无法适应业务数据表和索引表的导入,所以自己部门专门定制了bulkload以适应我们的业务场景。

四、总结

本文简单的介绍了一下HBase表设计相关的经验和数据落地方面的经验,很多经验都是在踩过坑之后才有的优化,还是那句话,没有问题就没有进步,希望后面少踩些坑。

  

 

HBase 入门笔记-数据落地篇的更多相关文章

  1. HBase 入门笔记-安装篇

    一.前言 接触HBase已近半年,从一无所知到问题的解决,在数据落地方面也有了一定的了解,在此记录这半年来碰到的一些问题和对一些数据落地方面的见解,本篇主要介绍一下hbase安装方面的信息 二.安装环 ...

  2. HBase入门笔记--读性能优化

    一.前言 在生产环境使用HBase过程中,随着数据量的不断增加,查询HBase数据变得越来越慢,对于业务来说是不可用的,需要对读性能进行优化 二.问题定位 从hbase监控指标来看,发现FullGC次 ...

  3. HBase 入门之数据刷写(Memstore Flush)详细说明

    接触过 HBase 的同学应该对 HBase 写数据的过程比较熟悉(不熟悉也没关系).HBase 写数据(比如 put.delete)的时候,都是写 WAL(假设 WAL 没有被关闭) ,然后将数据写 ...

  4. Redis学习笔记-数据操作篇(Centos7)

    一.基本操作 1.插入数据 127.0.0.1:6379> set name cos1eqlg0 OK 这样就在redis中设置了一个key-value键值对 2.查询数据 127.0.0.1: ...

  5. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  6. 一条数据的HBase之旅,简明HBase入门教程-Write全流程

    如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...

  7. 一条数据的HBase之旅,简明HBase入门教程-开篇

    常见的HBase新手问题: 什么样的数据适合用HBase来存储? 既然HBase也是一个数据库,能否用它将现有系统中昂贵的Oracle替换掉? 存放于HBase中的数据记录,为何不直接存放于HDFS之 ...

  8. 一条数据的HBase之旅,简明HBase入门教程1:开篇

    [摘要] 这是HBase入门系列的第1篇文章,主要介绍HBase当前的项目活跃度以及搜索引擎热度信息,以及一些概况信息,内容基于HBase 2.0 beta2版本.本系列文章既适用于HBase新手,也 ...

  9. 大数据工具篇之Hive与HBase整合完整教程

    大数据工具篇之Hive与HBase整合完整教程 一.引言 最近的一次培训,用户特意提到Hadoop环境下HDFS中存储的文件如何才能导入到HBase,关于这部分基于HBase Java API的写入方 ...

随机推荐

  1. mysql 5.7 json 字段类型查找、修改

    修改 json 里的数组字段 mysql> set @json = '{"test": [{"name": "laravel"}, { ...

  2. 最短路径算法的实现(dijskstra):Python

    dijskstra最短路径算法步骤: 输入:图G=(V(G),E(G))有一个源顶点S和一个汇顶点t,以及对所有的边ij属于E(G)的非负边长出cij. 输出:G从s到t的最短路径的长度. 第0步:从 ...

  3. call 大佬 help7——kmp 补齐 循环节

    http://acm.hdu.edu.cn/showproblem.php?pid=3746 用kmp算法,那么 但是也等于上面的是正确的 也等于下面是错误的 why? #include<cst ...

  4. idea插件安装的通用操作

    序:今天下午看到一个bug,很神奇,粘出来大家看看 看到这个异常栈,有经验的或者查到的答案都是mapper.xml中哪个的方法配置错了,应替换parameterMap为parameterType, 奇 ...

  5. C++模拟OC的多重自动释放池

    使用过OC的都知道,OC的引用计数机制用起来还比较方便.于是就仿照OC的形式搞了个C++引用计数. 支持多重自动释放池,每次autorelease都会放到栈顶的自动释放池中. 自动释放池也可以像变量一 ...

  6. 判别式模型 vs. 生成式模型

    1. 简介 生成式模型(generative model)会对\(x\)和\(y\)的联合分布\(p(x,y)\)进行建模,然后通过贝叶斯公式来求得\(p(y|x)\), 最后选取使得\(p(y|x) ...

  7. 微服务深入浅出(3)-- 服务的注册和发现Eureka

    现来说一些Eureka的概念: 1.服务注册 Register 就是Client向Server注册的时候提供自身元数据,比如IP和Port等信息. 2.服务续约 Renew Client默认每隔30s ...

  8. linux服务-ssh

    任务目标:ssh登录,scp上传.下载,ssh秘钥登录, 修改ssh server端的端口为8888然后进行登录和scp测试 使用ssh登陆host1 使用scp下载文件 scp root@192.1 ...

  9. G - Pandaland HDU - 6005 (找最小环)

    题目链接:https://cn.vjudge.net/contest/275153#problem/G 具体思路: 我们可以按照暴力的方法进行做 , 我们可以枚举每一条边,将这条边的权值设置为inf, ...

  10. Ubuntu自定义终端窗口位置

    方法一: 自定义终端启动快捷键 具体方法是自定义一个快速启动终端的快捷键,附带设置终端启动时的位置参数.首先获得需要放置窗口的目标位置信息,可以通过终端命令“ xwininfo ”来获得.步骤是首先打 ...