HBase学习11(项目01分析及准备)

发布时间 2023-09-22 13:52:41作者: 201812

海量数据

1.准备

在idea中创建项目,然后创建脚本包hbase_shell。

添加文件说明readme.md,写入相关项目结构说明。

通过复制hbase_shell文件目录,在VSCode中打开进行对脚本文件的编写。

在VSCode中编写方便。

 2.创建名称空间namespace

当表的数量比较多的时候,为了方便管理,不同的业务域以名称空间(namespace)来划分。

启动hbase shell

 命名空间的基本操作:

# 创建命名空间
create_namespace 'MOMO_CHAT'

# 查看命名空间
list_namespace

# 删除命名空间,注意删除前该命名空间必须是空的,无表
drop_namespace 'XX'

# 查看某个具体的命名空间
describe_namespace 'MOMO_CHAT'

在指定命名空间中创建表,不指定命名空间会自动在default命名空间中创建表。

# 在MOMO_CHAT命名空间下创建表MSG
create "MOMO_CHAT:MSG","C1"

 3.注意事项

列簇越少越好,不然对hbase性能有影响。

GZIP的压缩率最高,但是其实CPU密集型的,对CPU的消耗比其他算法要多,压缩和解压速度也慢

LZO的压缩率居中,比GZIP要低一些,但是压缩和解压速度明显要比GZIP快很多,其中解压速度快的更多;

Zippy/Snappy的压缩率最低,而压缩和解压速度要稍微比LZO要快一些

4.设置数据压缩

hbase shell

# 设置数据压缩
# 表创建的时候指定压缩方式
create "MOMO_CHAT:MSG", {NAME => "C1", COMPRESSION => "GZ"}
# 指定修改某个表的列簇的压缩方式
alter "MOMO_CHAT:MSG",{NAME => "C1", COMPRESSION => "GZ"}

 

5.ROWKEY

注意事项:

1.避免使用递增行/时序数据

如果ROWKEY设计的都是按照顺序递增(例如:时间戳),这样会有很多的数据写入时,负载都在一台机器上。我们尽量应当将写入大压力均衡到各个RegionServer。

2. 避免ROWKEY和的长度过大

HBase中,要访问一个Cell(单元格),需要有ROWKEY、列族、列名,如果ROWKEY、列名太大,就会占用较大内存空间。所以ROWKEY和列的长度应该尽量短小。ROWKEY的最大长度是64KB,建议越短越好

3.使用long等类型比String类型更省空间

long类型为8个字节,8个字节可以保存非常大的无符号整数,例如:18446744073709551615。如果是字符串,是按照一个字节一个字符方式保存,需要快3倍的字节数存储。

 

4.ROWKEY唯一

 

由于在HBase中数据存储是Key-Value形式,若向HBase中同一张表插入相同RowKey的数据,则原先存在的数据会被新的数据覆盖。

6.预分区P24

可以避免数据热点

热点是指大量的客户端(client)直接访问集群的一个或者几个节点(可能是读、也可能是写)

大量地访问量可能会使得某个服务器节点超出承受能力,导致整个RegionServer的性能下降,其他的Region也会受影响

hbase设置预分区:

1指定 start key、end key来分区

# 预分区
# 1.指定 start key、end key来分区
hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']

划分出来五个区:

 

2.指定分区数量、分区策略

# 2.指定分区数量、分区策略
hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
# HexStringSplit: ROWKEY是十六进制的字符串作为前缀的
# DecimalStringSplit: ROWKEY是10进制数字字符串作为前缀的
# UniformSplit: ROWKEY前缀完全随机

 

了解上面的知识后,我们要在建表的时候就要指定预分区,所以我们先把表删掉,再重新建立

注意,删除表分两步: 先  disable "MOMO_CHAT:MSG" ,后 drop "MOMO_CHAT:MSG"

然后建表:

create 'MOMO_CHAT:MSG',{NAME => 'C1', COMPRESSION => 'GZ'}, {NUMREGIONS => 6, SPLITALGO => 'HexStringSplit'}