大数据专题--HBase

一、简介

1.1组成:

Rowkey、列簇、列和列的value(单元格)

1、Rowkey

每一行的唯一标识。
不能直接用业务主键,会导致数据不平衡。
一般通用设计模式是加盐键,给键加上二进制字节作为前缀。

2、列簇

1)一张表通常有一个单独的列簇,1张表中的列簇不会超过5个(HBase作为Janusgraph的后端存储,有9个列簇)。
2)列簇必须在创建表时候定义,列只有在插入后才会存在,空值并不保存。
3)每一个列簇都会保存在自己的文件集合中,所有存储设置都需要在列簇级别指定。
HBase默认的块大小是64KB,版本数默认为3个版本,TTL可设置,一旦到底过期时间可自动删除旧行。
4)多重列簇类似于以Rowkey为连接条件的连接查询。

3、单元格:

列和行的交集,单元格是版本化的,最新版本号排咋最前面,所有单元格都会根据版本号降序排列。

1.2压缩

压缩是分区中HFile文件合并的过程,压缩过程分为2种,小量和全量。
XH 小量压缩阈值=3,如果分区HFile文件超过了预设值,就会启动小量压缩,压缩期间,不会发生持久化,如果Memsore写满,与该分区服务器交互的客户端就会被堵塞,直至压缩过程执行完毕。(BS连接HBase超时原因)
XH 全量压缩设置为7天一次。

二、相关操作

2.1hbase shell

进入HBase命令行页面
list:列出所有表

2.2namespace

HBase中没有database的概念,这里的namespace命名空间指对一组表的逻辑分组,类似RDBMS中的database;
HBase系统默认定义了两个缺省的namespace
hbase:系统内建表,包括namespace和meta表
default:用户建表时未指定namespace的表都创建在此

1)创建namespace
hbase>create_namespace 'test_ns'
2)列出所有namespace
hbase>list_namespace
3)查看namespace
hbase>describe_namespace 'test_ns'
4)在namespace下创建表
hbase>create 'test_ns:testtable', 'fm1'
5)查看namespace下的表
hbase>list_namespace_tables 'test_ns'
6)删除namespace ----必须空的namespace才能删除 要删除掉里面的表
hbase>disable 'test_ns:testtable'
hbase>drop 'test_ns:testtable'
hbase>drop_namespace 'test_ns'

2.3table DML

1、创建表
hbase>create 't_demo_tbl','f1','f2','f3' #-------t_demo_tbl是表名,f1,f2,f3是列簇名
2、查看表的结构:
hbase>describe 't_demo_tbl'
3、禁用,启用表
hbase>disable 't_demo_tbl'
hbase>enable 't_demo_tbl'
4、查看表结构是否启用【允许修改】 因为启用的表不允许修改:
hbase>is_enabled 't_demo_tbl'
5、增加一个列族:
hbase>disable 't_demo_tbl'
hbase>alter 't_demo_tbl', NAME=>'f1', VERSIONS=>3
hbase>enable 't_demo_tbl'
6、删除某个列族:
hbase>disable 't_demo_tbl'
hbase>alter 't_demo_tbl', NAME=>'f1', METHOD=>'delete' #--------注意大小写(简写:alter 't_demo_tbl', 'delete'=>'f1')
hbase>enable 't_demo_tbl'

7、查看所有的表
hbase>list
8、查看某一表是否存在:
hbase>exists 't_demo_tbl'

9、清空表:
hbase>truncate 't_demo_tbl'
10、删除某张表:
hbase>disable 't_demo_tbl'
hbase>drop 't_demo_tbl'

2.4table DDL

1、向表中插入数据:
hbase>put 't_demo_tbl', 'r1', 'f1:c1', 'value' #--------列族的列可以不存在,修改数据也是put,只需行健[rowkey]和列相同即可
2、删除某行数据的列[值]:
hbase>delete 't_demo_tbl', 'r1', 'c1', 'ts1' #--------删除t_demo_tbl表,行健为r1的c1列中,时间戳为ts1的值,如果不指定ts1就删除所有列值[默认保持三个版本]
3、删除某行数据:
hbase>deleteall 't_demo_tbl', 'r1'
注:删除并不会物理删除HBase中的记录,它会被标记被删除的记录。真正的物理删除在压缩过程中执行。

4、获取某个行健的所有列族的列值:
hbase>get 't_demo_tbl', 'r1'
5、获取某个行健的所有某个列族的列值:
hbase>get 't_demo_tbl', 'r1','f1'
6、获取某个行健的某两个列族的列值:
hbase>get 't_demo_tbl', 'r1','f1','f2'
7、获取某个行健的某个列族的某个列值:
hbase>get 't_demo_tbl', 'r1', 'f1:c1'
8、获取某个表的所有行健值:
hbase>scan 't_demo_tbl'
9、获取某个表的前3行:
hbase>scan 't_demo_tbl', {LIMIT=>3}
10、获取某个表的从指定位置开始的行:
hbase>scan 't_demo_tbl', {STARTROW=>'rowKey', LIMIT=>3}
11、获取某个表的指定列的所有行数据:
hbase>scan 'heroes', {COLUMNS =>'f1:c1'}
12、统计表的行数:
hbase>count 't_demo_tbl'
INTERVAL=>100000000 统计间隔

或者hbase org.apache.hadoop.hbase.mapreduce.RowCounter 't_demo_tbl'
比hbase shell 统计快一些

13、清空表:truncate ‘tablename’
14、移除整张表:drop ‘tablename’
以上两步骤,必须先禁用表(disable)。

2.5HBase API

Get类
Put类
Delete类
Scan类
过滤器

三、hbase 2.0及以上版本的优化:

1.flush和compaction支持到列簇级别

四、HBase 不同namespace下表的转移

1、disable 'TableName'

2、snapshot 'TableName', TableNameSnapshot1'

3、clone_snapshot 'TableNameSnapshot1', 'NewNameSpace:TableName'

4、delete_snapshot 'TableNameSnapshot1'

-------------------------------------分割线----------------------
一:hbase的存储形式
hbase的内部使用KeyValue的形式存在,其key是有rowkey:family:column:logTime,value是其存储的内容。


image.png

其在region的是大多以升序的形式排列,唯一的是logtime是以降序的形式进行排列。

所以,按照越靠近左边的信息越容易被检索到。其设计时,要考虑把重要的信息放左边,不重要的信息放到右边。这样可以提高查询数据的速度。这样,最重要的提高索引速度的就是设计合适的rowkey。

二:rowkey的设计原则
1:长度原则,最短越好,最大不能超过64K。太长的影响有两点,一是极大影响了HFile的存储效率。二是缓存memstore不能得到有效利用,缓存不能存放太多的信息,造成检索效率的降低。

2:唯一原则

保证rowkey的唯一性,这条没有什么要讲的。

3:自己一条原则

尽量保证经常一起用的rowkey存储在同一个region上,有助于提升检索效率。但要避免热点问题。

4:对于常用的检索的rowkey,尽量使用高表(行多列少),二部选择宽表(列多行少)。

三:rowkey引起热点问题的集中解决方法
1-加盐:在rowkey前面加一个冗余信息,这样可以把数据分散到不同的region中。

优点:可以有效的防止rowkey集中分配到一个或多个region中。有效避免了热点问题;

缺点:无形中增加了rowkey的长度;范围检索得不到有效使用。

2-字段交换,提升权重:如果rowkey中含有几个信息字段,可以调整信息字段的顺序。

缺点:对于单个信息字段,或者无论怎么调整都会遇到region热点的rowkey是解决不了的。

3-随机键:把rowkey进行hash化,在分配到不同的服务器上。和加盐的方式相似;

以下是顺序读的性能排行(由高到低,写性能与读性能相反):顺序键 -> 使用加盐键 -> 提升字段键 -> 随机键

强加几个知识点:

1-尽量使用范围查询代替前缀查询;

2-数据多时,用分页查询;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352