HBase 萌新的个人错误整理

647 阅读3分钟

最近新学了些HBase,网上可以搜到的各类博客都比较老了,而我又装的3.0+版本,因此初步接触时错误不少,特此记录以免下次再智障,也顺带对其特性进行深一步的理解。

写得很碎片。。。。问题记录多了再整合吧

和我一样的新手可以把我这个问题合集当作一些的排查的思路参考。

由于hbase3.0版本相关资源实在是少了点。最好还是老老实实整本可靠的书,或者多看官方文档吧!。 - -

1.重中之中,ROWKEY与TIMESTAMP的设计

由于Hbase的ROWKEY与TIMESTAMP(时间戳)都是基于字典序来排序,在scan中也是基于此进行字符匹配。所以ROWKEY和TIMESTAMP的设计可谓是重中之重,ROWKEY设计合理可以大大减少各项操作中表格响应的速度。

对于数据量小的新手来说,如果没有明确的设计思路,ROWKEY可以选择顺序排列,但是要记得补零。

也就是:

顺序排列:

[1 , 2 , 3....n]

要补齐位数为:

['000001','000002','000003'....n]

这样对齐位数的形式,才能让表格顺序排列,否则scan操作中,你的结果就会很不可靠。

例如你没有补齐,你要输出的范围是STARTROW => '1',STOPROW => '100'

那么结果很有可能只有三行:'1' , '10' , '100'

当然,最好的状况还是要好好利用这个特点设计ROWKEY以及TIMESTAMP。

2.VERSIONS特性

一开始创建好表格之后VERSIONS是默认为1的,也就是当你不同时间插入数据时,表格仅保留时间最新的那一条。因此当我们需要记录不同版本时,可以使用:

alter 'tablename', NAME => 'COLUMNFAMILY_name',VERSIONS => MAX_VERSION

这样就可以将对应的列族扩展。 不同版本之间就是靠TIMESTAMP进行排序的,当然啦,同样也是字典序

我们可以通过下列命令来查看

describe 'tablename'

3.Hbase shell 离谱的中文字符支持

当你存入了中文字符串时,Hbase shell 中一般显示其16进制编码。

你可以在命令中添加:

scan 'tablename',FORMATTER => 'toString'

将其输出转化为字符串来显示。这样就可以在SHELL里显示中文啦。

另外,SHELL中输入中文和修改带有中文字符的命令也超级蛋疼,这里推荐先将命令写在任意文本行中,再复制过去,不要问为什么,可以自己试试这个让人脑溢血的SHELL。

关于字符串匹配

因为Hbase中所有的值都是以Byte形式存储进去的,因此在需要匹配字符串进行过滤和筛选的时候,都需要用到比较器和比较运算符。

以二进制比较器 binary 和比较运算符 = 为例。

你在SHELL中要匹配字符串String前面应该这么写

scan 'tablename',{FILTER => "SingleColumnValueFilter('ColFam','ColName',>=,'binary:String')"}

scan 'tablename',{FILTER => "SingleColumnValueFilter('ColFam','ColName', = ,' binary :String')"}

没有添加任何比较器是会报错的-。-

JAVA 中要这么写:

BinaryPrefixComparator comp =new BinaryPrefixComparator(Bytes.toBytes("YourString"));

SingleColumnValueFilter filter = new SingleColumnValueFilter(
					Bytes.toBytes(cf),
					Bytes.toBytes(col),
					CompareOperator.EQUAL,
					comp
					);

值得一提的是:SHELL中的 = 符号即比较运算符,要使用CompareOperator调用。 而3.0之前版本的 ComOp 已不再推荐使用。

4.目前还没搞明白的问题

1.hbase 运行久了之后会占用大量内存,但我每次业务结束都关掉了table之类的,不知道是哪里有问题。

2.scan的各种坑

害,老老实实整本书去-。-

这篇博客会持续更新。。。。碰到的问题一般都会记录下来的,也欢迎大佬给出建议,感谢~