最近新学了些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的各种坑
害,老老实实整本书去-。-
这篇博客会持续更新。。。。碰到的问题一般都会记录下来的,也欢迎大佬给出建议,感谢~