设为首页 加入收藏

TOP

HBase随笔记录权限控制、命名空间、流量限制和表负载均衡
2018-11-29 02:48:24 】 浏览:17
Tags:HBase 随笔 记录 权限 控制 命名 空间 流量 限制 负载 均衡
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37534613/article/details/78644098

限制输出:

get 'table','rowkey',MAXLENGTH => 60

status:返回状态。可选simple、summary、detailed

version:版本

权限:

grant 'hdfs','RW','test:t1','cf1','col1'

get 'test:t1','row-1','cf1:col1'

revoke 'hdfs','W','@test'

然后通过user_permission来查看权限

user_permission '@test'

user_permission 'test:t1'

创建表

create '表空间:lmj_test',{NAME=> 'adn', BLOOMFILTER => 'ROWCOL', VERSIONS => '1', TTL =>'15768000', MIN_VERSIONS => '0', COMPRESSION => 'SNAPPY', BLOCKCACHE=> 'true'}

hbase> # SPLITALGO("HexStringSplit", "UniformSplit" or classname)

hbase> create 't1', 'f1', {NUMREGIONS=> 15, SPLITALGO => 'HexStringSplit'}

create 'split_table_test',{NAME =>'cf',COMPRESSION => 'SNAPPY'}, {SPLITS_FILE => 'test_split.txt'}

splits_file请放在hdfs中/hbase下

GZIP, LZO, Snappy,作者推荐使用Snappy,因为它有较好的Encoding/Decoding速度和可以接受的压缩率。

清空表:truncate 'test'

删除表:先disable,再drop

修改表结构:

先disable后enable

alter 't1', {NAME => 'f1'}, {NAME =>'f2', METHOD => 'delete'}

例如:修改表test1的cf的TTL为180天

hbase(main)> disable 'test1'

hbase(main)> alter'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta',TTL=>'15552000'}

hbase(main)> enable 'test1'

put'lmj_test','00001','adn:adn_3','aaa',1432483200000

get 'test','rowkey','cf1:col1'

创建namespace

hbase>create_namespace 'ai_ns'

删除namespace

hbase>drop_namespace 'ai_ns'

查看namespace

hbase>describe_namespace 'ai_ns'

列出所有namespace

hbase>list_namespace

在namespace下创建表

hbase>create 'ai_ns:testtable',{NAME=> 'CF1',VERSION => '3',}

查看namespace下的表

hbase>list_namespace_tables 'ai_ns'

compact:

1.概述

  溢写以后生成许多storefile

  minor compaction:最早生成的几个storefile会被合并,这一步不会对标记的删除和过期的数据进行处理,经常发生,数据量较小,占用资源不多

  major compaction:默认值是7天执行一次

  设置  

    <property>

      <name>hbase.hregion.majorcompaction</name>

      <value>604800000</value>

    </property>

2.危害

  -》消耗大量的资源,对hbase的性能产生影响

  -》会导致hbase的应用阻塞

  企业中一般关闭自动触发,使用手动触发 major_compact

3.操作

  在自动触发之前手动触发

major_compact'table-name'

hbase流量限制和表负载均衡

1.概述

  在HBase-1.1.0之前,HBase集群中资源都是全量的。用户、表这些都是没有限制的,看似完美实则隐患较大。今天,笔者就给大家剖析一下HBase的流量限制和表的负载均衡。

2.内容

  也许有同学有疑问,为啥要做流量限制,无限制全量跑不是更好吗?举个例子,比如今天的双十一日,数据流量是非常大的。如果不限制用户和表的流量,某些重要的核心业务,需要在资源有限的情况下优先保证正常运行。如果非核心业务在此期间其QPS一直降不下来,严重消耗系统资源,影响核心业务的正常运作。

  针对上述问题,可以采取以下方案来解决:

·资源限制:针对用户、命名空间及表的请求大小和QPS进行限制。

·资源隔离:将不同表中的数据通过物理隔离,均衡到不同的RegionServer上。

3.资源限制

  开启HBase资源限制是有条件,其中包含以下两个条件:

·版本必须在1.1.0以上,或者在低版本中打上了HBase对应的Patch(HBASE-11598

·HBase的资源限制开关默认是关闭的,需要在HBase的配置文件中进行开启。添加内容如下所示:

# 编辑HBase配置文件

vi $HBASE_HONE/conf/hbase-site.xml

# 添加如下内容

<property>

<name>hbase.quota.enabled</name>

<value>true</value>

</property>

# 退出编辑并保存

  如果不是在首次启动时配置的,需要额外重启HMaster服务进程才能使之生效。

3.1 Quota语句

  HBase中限流是通过Quota语句来操作的,限流的方式有两种,一种是针对用户进行限流;另一种是针对表来进行限流。操作命令如下所示:

# 限制用户u1每秒请求10次

hbase>set_quota TYPE => THROTTLE, USER => 'u1',LIMIT => '10req/sec'

# 限制用户u1每秒的读请求为10次

hbase>set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', LIMIT => '10req/sec'

# 限制用户u1每天的请求量为10M

hbase>set_quota TYPE => THROTTLE, USER => 'u1',LIMIT => '10M/day'

# 限制用户u1的写请求量每秒为10M

hbase>set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, USER => 'u1', LIMIT => '10M/sec'

# 限制用户u1在操作表t2时,每分钟的请求量为5K

hbase>set_quota TYPE => THROTTLE, USER => 'u1',TABLE => 't2', LIMIT => '5K/min'

# 限制用户u1在操作表t2时,每秒的读请求为10次

hbase>set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', TABLE => 't2', LIMIT => '10req/sec'

# 删除用户u1在命令空间ns2的请求限制

hbase>set_quota TYPE => THROTTLE, USER => 'u1',NAMESPACE => 'ns2', LIMIT => NONE

# 限制在命名空间ns1中每小时的请求为10次

hbase>set_quota TYPE => THROTTLE, NAMESPACE => 'ns1',LIMIT => '10req/hour'

# 限制表t1每小时的请求为10T

hbase>set_quota TYPE => THROTTLE, TABLE => 't1',LIMIT => '10T/hour'

# 删除用户u1的所有请求限制

hbase>set_quota TYPE => THROTTLE, USER => 'u1',LIMIT => NONE

# 显示用户u1在命名空间ns2中的所有限制详情

hbase>list_quotas USER => 'u1,NAMESPACE => 'ns2'

# 显示命令空间ns2的所有限制详情

hbase>list_quotas NAMESPACE => 'ns2'

# 显示表t1的所有限制详情

hbase>list_quotas TABLE => 't1'

# 显示所有限制详情

hbase>list_quotas

  从操作的命令中可以看出,HBase限制流量支持表和用户。可以通过THROTTLE_TYPE来控制READ(读)、WRITE(写)操作,这类操作在HBase中是随机进行限制的。而LIMIT关键字,可以从两个维度进行资源限制,分别是req/time和size/time。

·req/time:这种表示限制单位时间内的请求次数,time可以是秒、分、时、天,req表示次数。

·size/time:这种表示单位时间内请求数据的量,time可以是秒、分、时、天,size可以时B (bytes), K (kilobytes), M (megabytes), G(gigabytes), T (terabytes), P (petabytes)。

  LIMIT限制默认大小是:10req/day 或 100P/hour。对于命令set_quota来说,执行这条命令仅仅是限制单个RegionServer上的流量,并不是整个集群的限制总量(集群限制总量=每个RegionServer的限制量*RegionNum)。另外,执行set_quota命令后,默认是需要等待300000秒(5分钟)才会生效。如果觉得时间太长,可以将生效时间缩短,通过hbase-site.xml文件中的参数hbase.quota.refresh.period来设置时间,比如:

# 一分钟后生效

hbase.quota.refresh.period=60000

3.2 限制命名空间中的表个数

  在创建命名空间中的表个数,可以在创建命名空间时指定,也可以在创建之后在此修改表个数,同样也可以删除表限制。通过设置hbase.namespace.quota.maxtables属性值来改变。操作内容如下所示:

# 创建一个命令空间最大包含5个表

hbase>create_namespace 'ns1', {'hbase.namespace.quota.maxtables'=>'5'}

# 修改一个已存在的命令空间所允许的表数量大小为8个

hbase>alter_namespace 'ns2', {METHOD => 'set', 'hbase.namespace.quota.maxtables'=>'8'}

# 显示命令空间下的所有详情

hbase> describe_namespace'ns2'

# 删除命令空间中表个数的限制

hbase>alter_namespace 'ns2', {METHOD => 'unset',NAME=>'hbase.namespace.quota.maxtables'}

3.3 限制命名空间的Region

  在创建命名空间时 ,可以限制Region的个数。在创建之后也可以通过命令来修改个数的上限值。具体操作如下所示:

# 创建一个命名空间最大包含10个Region

hbase>create_namespace 'ns1', {'hbase.namespace.quota.maxregions'=>'10'

# 显示命令空间中详情

hbase>describe_namespace 'ns1'

# 修改命名空间中最大Region个数为20个

hbase>alter_namespace 'ns2', {METHOD => 'set', 'hbase.namespace.quota.maxregions'=>'20'}

# 删除命名空间中Region个数的限制

hbase> alter_namespace'ns2', {METHOD => 'unset', NAME=> 'hbase.namespace.quota.maxregions'}

  这里也许有些同学在操作的过程当中遇到过,在请求操作限制阀值时,日志没有打印出错误信息,这是由于默认日志输出时INFO级别,不会打印这类异常,如果要查看,可以通过修改log4j的日志级别为DEBUG,这样就可以查看到对应的异常信息了。

4.资源隔离

  在HBase中可以通过资源隔离的方式来间接的限流。将请求均衡到多个RegionServer中去。通过balance_switch命令来实现自动均衡操作。命令如下:

# 查看自动均衡状态

balance_switchstatus

# 停止自动均衡

balance_switchstop

# 开启自动均衡

balance_switchstart

  在实际业务中,如果HBase某个表的RegionServer全部集中在一个上,这时候可以考虑使用move命令手动均衡操作,具体操作语法如下:

# move手动操作语法

move [region id] [ServerName]

  如下图所示:

  从图中一个Table Region来说,”t2,,1510401809742.bd015fc10e75b70a52adc0c32a2321c2.“其中region id为”bd015fc10e75b70a52adc0c32a2321c2“。我们可以在HBase集群客户端执行以下命令来手动指定region。命令如下所示:

# 将该Region(dn3)移动到Region(dn1)
echo "move'bd015fc10e75b70a52adc0c32a2321c2','dn1,16020,1510401268652'"|hbase shell

  在往HBase表中写数据的时候,默认是往一个Region中写数据,当数据量很大时,才会自动拆分成多个Region,拆分的规则和RowKey设计有关。为了防止出现这种情况,我们可以在创建表的时候进行预分区操作。命令如下所示:

# 创建表的预分区(6个Region),RegionTotals = SPLITS.length + 1
create 't2', 'cf', SPLITS => ['0001','0002','0003','0004','0005']

  这样我们可以拆分成6个Region,这里也许有同学要问,为什么是6个Region。其实,从上图中就可以看出,表分区中第一个Region是没有StartKey,最后一个Region是没有EndKey的。为什么会出现这种情况,下面就给大家来剖析这个原因。如下图所示:

  从图中可知,在第一个Region中只有EndKey,没有StartKey。第一个Region中的EndKey(0001),就是第二个Region的StartKey,以此类推,到最后一个Region就只有StartKey(0005)了。这就是为什么第一个Region没有StartKey,最后一个Region没有EndKey的原因。

  其实,我们在使用HBase的Java API获取Region的StartKey和EndKey的时候,有时会出现Null,也就是这个原因。

5.总结

  在使用Quota命令进行限流时,需要确保hbase-site.xml文件中的限流属性开启。另外,在对表做手动均衡操作时,使用move命令即可。HBase是有自动均衡的策略的,均衡的Region取决于设计分割的Key,Key的产生又和HBase中中Rowkey的设计息息相关。所以,HBase中表的RowKey设计的是否优秀,决定了Region均衡时,分割Key的选取。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇HBase学习笔记——命名空间(name.. 下一篇spark与hbase进行交互

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目