hbase学习之积累

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值