1)因为所有的数据都往一个region灌入,容易引起单节点负载升高,从而影响入库性能.
2)只有一个region随着数据量到达region的最大值,势必导致region分裂,造成系统负载过高,甚至服务停止。
hbase如何实现二级索引?
使用solr/ES自己开发二级索引,使用Lily Hbase(solr+hbase)实现二级索引。
要点是:
1) 保证主表和索引表在同一个regionserver上(通过自定义的balancer实现)
2) 使用coprocessor实现索引表的创建和插入。
hbase部分参数:
hbase.regionserver.global.memstore.upperLimit/lowerLimit
默认值:0.4/0.35
upperlimit说明:hbase.hregion.memstore.flush.size 这个参数的作用是当单个Region内所有的memstore大小总和超过指定值时,flush该region的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产消费模式来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。
这个参数的作用是防止内存占用过大,当ReigonServer内所有region的memstores所占用内存总和达到heap的40%时,HBase会强制block所有的更新并flush这些region以释放所有memstore占用的内存。
owerLimit说明: 同upperLimit,只不过lowerLimit在所有region的memstores所占用内存达到Heap的35%时,不flush所有的memstore。它会找一个memstore内存占用最大的region,做个别flush,此时写更新还是会被block。lowerLimit算是一个在所有region强制flush导致性能降低前的补救措施。在日志中,表现为 “** Flush thread woke up with memory above low water.”
Base上Regionserver的内存分为两个部分,一部分作为Memstore,主要用来写;另外一部分作为BlockCache,主要用于读。
hbase.hregion.majorcompaction ,这个目前通过定时程序实现
hbase.hregion.majorcompaction表示majorcompaction的周期,默认是1天,majorcompaction与普通的compaction的区别是majorcompaction会清除过期的历史版本数据,同时合并storefile,而普通的compaction只做合并,通常都是majorcompaction,调为0,然后手工定期的去执行一下majorcompaction,适当调小点compacionThreshold。
现有系统设置:
hbase存储信令的主键规则:被叫号码左侧补0至20位再倒置,再加上19位的时间戳(即在Long.MAXVALUE-(new Date()).getTime()的值后补0到19位)+4位随机数
hbase.hregion.max.filesize默认256M,实际设置50G,超过50G做SPLIT,实际上compact和split对应用读写性能冲击很大,compact无法避免,但是对split可以关闭自动,改为手动,在访问量较低的时段手动进行。
不论是hbase-env.sh还是Hadoop-env.sh中的JAVA_HOME变量的设置,都应该是JDK的实际路径,而不是直接赋上${JAVA_HOME}