1.count的时候很慢?怎么办?
100w数据31s
100w数据4s
hbase> count '<tablename>', CACHE => 1000
The above count fetches 1000 rows at a time. Set CACHE lower if your rows are big. Default is to fetch one row at a time.
2.如何查看cdh种hbase默认的配置呢?
hbase(main):007:0> @shell.hbase.configuration.get("hfile.format.version")
=> "3"
hbase(main):008:0>
3.列族,rowkey,qulifier设计尽量短(这里只讨论这个,rowkey预分区,列族少不讨论。。)
从一方面来说 越短越好,
例如一般设置列族 0 a b 这种
rowkey 越短越好,言简意赅 例如车牌,手机号。
为什么越短越好,因为占用的存储空间少?为什么要从这方面节约空间
http://hbase.apache.org/book.html#keyvalue
因为一个列族多个列,最终存储的多个列的时候都会存储rowkey和cf 所以越短越好
4.列族设计少
官方原话hbase 不能很好的处理 超过2-3个列族
为啥?因为两个列族的话,一个列族a 我写了127M的数据到memstore,
regionserverA上有10个region其中5个属于表a 5个属于表b
写了1M的cf1到表a的region1,同时写了127M的cf2到表a的region1
此时总共的memstore到了128M,超过了默认的阈值,触发溢写,因为cf1会溢写hfile1 cf2会溢写到hfile2,那么cf1会造成很多不必要的io。因为属于不同的文件。(个人理解)
5.列族设计原则:两个差异不要太大
有时候我就想要两个列族 一个是person[ name sex id],house [ 0 1 2]
但是可悲的是 中国有10多亿人,但是有房子的只有100w(举例),
10亿数据会被切分为100个region,随之100w也会被切分为到100个region里,当我只想查house的时候,我需要全表扫描50台机器上100个region,如果没有这10亿条数据,我实际只需要扫描10个region或者一两台机器就好。所以基数相差很大,最后导致少的查询效率低,不会影响数量大的。
6.rowkey设计原则
http://hbase.apache.org/book.html#rowkey.design
避免热点问题
举例。如果插入100w数据,理想状况是随机插入到10个region ≈ 5个regionserver=5台机器,避免集中到一台机器
我存的是时间戳单调递增数据123456789。region自动切分后了,后面我要存的数据只会去到最后一个region里。这个时候会占用这个region所在node的写入性能,万一这个node此时别的表也要写入呢?所以是不可取的。
解决
①生成随机数、hash、散列值
分布更随机,但是读有点不可预测性。 都hash了虽知道是啥呀
②字符串反转 20170524000001 转成 10000042507102
分布随机,但牺牲了行排序属性。
③字符串拼接加盐 20170524000001->a20170524000001 b20170524000002
加写操作的吞吐量,但在读操作期间增加成本
④Long.MAX_VALUE-timestamp
7.schema 设计原则
http://hbase.apache.org/book.html#regionserver_sizing_rules_of_thumb
https://cloud.google.com/bigtable/docs/schema-design#tables
8.存储类型
翻译 一个长整型数字8个字节,最多可以存18,446,744,073,709,551,615 ,这个也是占8字节。
但是如果是"18,446,744,073,709,551,615" 那么一个字符一个字节那就是20个字节,几乎需要3倍的空间了。
但是如果我用数字的md5做加密,同样长度的 可能string占用的空间少。同时md5加密了。不可读。
8.数据会变?
create 'cc:test_hbase','0'
put 'cc:test_hbase','rk001','0:name','cc'
put 'cc:test_hbase','rk001','0:name','cc2'
看到的值第一次是cc2 删除后 再看变成了cc 因为是保留了3个version,按先后顺序排序。
9.预分区。
如果我们想按照"000000"到"ffffff"分区这里是符串。 原本猜想是我提前分好区了。那么就一定会均分对吧。
实际不然,因为"0"的字节是48 9的字节是57 a的字节是87 f的字节是102.
拆分是按照字节大小拆分的。如上图所示。实际只有0-9 a-f的字符。但是分区的时候划分了几个分区给=DKRX等其余字符。 所以这个预分区是有问题。
总结 不要数字+字母联合预分区。是有问题的。
10支持的数据类型。
其他关系性数据库或者非关系性数据都是string int这种。
hbase 只能存byte。但实际上是什么也能存(string int )同时还能存 图片 video doc
因为这些就是文件,也可以被流读成字节数组。但是也不要太大。。。
11 保留被删除的单元格
当我们删除hbase数据的时候,实际上没有真正的删除,只是删除了最新版本的数据。
被删除的数据实际上还是会存在一段时间的,直到major_compact后 hbase会把删除的数据彻底删除掉。
那么我有时候就是不想把以前的数据删除,就是想保留原始数据。这种情况例如 qq号修改密码的时候会要求你和以前的密码不一样,以前的密码就是以前version。
还有一种情况例如我数据库考虑的磁盘空间设置了version=20,结果你一天改个密码,一个月就修改了30次。。。我也要保留的你信息 只是没想到你修改的这么频繁
alter ‘t1′, NAME => ‘f1′, KEEP_DELETED_CELLS => true
12 执行脚本种的hbase 命令 类似hive -f