CC00011.hbase——|Hadoop&HBase.V11|——|HBase.v11|布隆过滤器|二级索引|

一、大纲
### --- [HBase]

~~~     [HBase表热点]
~~~     [HBase二级索引]
~~~     [HBase中布隆过滤器]
二、HBase表的RowKey设计:RowKey的基本介绍:ASCII码字典顺序。
### --- HBase表的RowKey设计:RowKey的基本介绍:ASCII码字典顺序。
~~~     字典序的排序规则。
~~~     先比较第一个字节,如果相同,然后比对第二个字节,以此类推,
~~~     如果到第X个字节,其中一个已经超出了rowkey的长度,短rowkey排在前面。

012,0,123,234,3.
0,3,012,123,234
0,012,123,234,3
### --- RowKey长度原则

~~~     rowkey是一个二进制码流,可以是任意字符串最大长度64kb,
~~~     实际应用中一般为10-100bytes,以byte[]形式保存,一般设计成定长。
~~~     建议越短越好,不要超过16个字节
~~~     设计过长会降低memstore内存的利用率和HFile存储数据的效率。
### --- RowKey散列原则

~~~     建议将rowkey的高位作为散列字段,这样将提高数据均衡分布在每个RegionServer,
~~~     以实现负载均衡的几率。
### --- RowKey唯一原则

~~~     必须在设计上保证其唯一性,
~~~     访问hbase table中的行:有3种方式:
~~~     单个rowkey
~~~     rowkey 的range
~~~     全表扫描(一定要避免全表扫描)
### --- 实现方式:

~~~     org.apache.hadoop.hbase.client.Get
~~~     scan方法: org.apache.hadoop.hbase.client.Scan
~~~     scan使用的时候注意:
~~~     setStartRow,setEndRow 限定范围, 范围越小,性能越高。
### --- RowKey排序原则

~~~     HBase的Rowkey是按照ASCII有序设计的,我们在设计Rowkey时要充分利用这点.
三、HBase表的热点
### --- 什么是热点

~~~     检索habse的记录首先要通过row key来定位数据行。
~~~     当大量的client访问hbase集群的一个或少数几个节点,
~~~     造成少数region server的读/写请求过多、负载过大,
~~~     而其他region server负载却很小,就造成了“热点”现象
### --- 热点的解决方案

~~~     # 预分区
~~~     预分区的目的让表的数据可以均衡的分散在集群中,
~~~     而不是默认只有一个region分布在集群的一个节点上。
~~~     # 加盐    

~~~     这里所说的加盐不是密码学中的加盐,而是在rowkey的前面增加随机数,
~~~     具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。
~~~     4个region,[,a),[a,b),[b,c),[c,]
~~~     原始数据:abc1,abc2,abc3.
~~~     加盐后的rowkey:a-abc1,b-abc2,c-abc3
~~~     abc1,a
~~~     abc2,b
~~~     # 哈希

~~~     哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。
~~~     使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。
~~~     原始数据: abc1,abc2,abc3
~~~     哈希:
md5(abc1)=92231b....., 9223-abc1
md5(abc2) =32a131122...., 32a1-abc2
md5(abc3) = 452b1...., 452b-abc3.
~~~     # 反转

~~~     反转固定长度或者数字格式的rowkey。
~~~     这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。
~~~     这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。
15X,13X,
四、HBase的二级索引
### --- HBase二级索引

~~~     HBase表按照rowkey查询性能是最高的。rowkey就相当于hbase表的一级索引!!
~~~     为了HBase的数据查询更高效、适应更多的场景,诸如使用非rowkey字段检索也能做到秒级响应,
~~~     或者支持各个字段进行模糊查询和多字段组合查询等, 因此需要在HBase上面构建二级索引, 
~~~     以满足现实中更复杂多样的业务需求。
~~~     hbase的二级索引其本质就是建立hbase表中列与行键之间的映射关系。
~~~     常见的二级索引我们一般可以借助各种其他的方式来实现,例如Phoenix或者solr或者ES等
五、布隆过滤器在hbase的应用
### --- 布隆过滤器应用

~~~     之前再讲hbase的数据存储原理的时候,我们知道hbase的读操作需要访问大量的文件,
~~~     大部分的实现通过布隆过滤器来避免大量的读文件操作。
### --- 布隆过滤器的原理

~~~     通常判断某个元素是否存在用的可以选择hashmap。
~~~     但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,
~~~     通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,
~~~     那 HashMap 占据的内存大小就变得很可观了。
~~~     Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,
~~~     并能判断一个元素是否属于这个集合。
~~~     hbase 中布隆过滤器来过滤指定的rowkey是否在目标文件,避免扫描多个文件。
~~~     使用布隆过滤器来判断。
~~~     布隆过滤器返回true,在结果不一定正确,、如果返回false则说明确实不存在。
### --- 原理示意图
### --- Bloom Filter案例
~~~     布隆过滤器,已经不需要自己实现,Google已经提供了非常成熟的实现。
      
<dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>27.0.1-jre</version>
</dependency>
### --- 使用
~~~     guava 的布隆过滤器,封装的非常好,使用起来非常简洁方便。
~~~     例: 预估数据量1w,错误率需要减小到万分之一。使用如下代码进行创建。

package com.yanqi.hbash.bloom;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

import java.nio.charset.Charset;

public class BloomFilterDemo {

    public static void main(String[] args) {
        // 1.创建符合条件的布隆过滤器
        // 预期数据量10000,错误率0.0001
        BloomFilter<CharSequence> bloomFilter =
                BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 10000, 0.0001);
        // 2.将一部分数据添加进去
        for (int i = 0; i < 5000; i++) {
            bloomFilter.put("" + i);
        }
        System.out.println("数据写入完毕");
        // 3.测试结果
        for (int i = 0; i < 10000; i++) {
            if (bloomFilter.mightContain("" + i)) {
                System.out.println(i + "存在");
            } else {
                System.out.println(i + "不存在");
            }
        }
    }
}
### --- 编译打印

D:\JAVA\jdk1.8.0_231\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=64081:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\jdk1.8.0_231\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_231\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_231\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_231\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_231\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_231\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_231\jre\lib\rt.jar;E:\NO.Z.10000——javaproject\NO.Z.00002.Hadoop\hbase_client\target\classes;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-client\1.3.1\hbase-client-1.3.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-annotations\1.3.1\hbase-annotations-1.3.1.jar;C:\Users\Administrator\.m2\repository\com\github\stephenc\findbugs\findbugs-annotations\1.3.9-1\findbugs-annotations-1.3.9-1.jar;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-common\1.3.1\hbase-common-1.3.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-protocol\1.3.1\hbase-protocol-1.3.1.jar;C:\Users\Administrator\.m2\repository\commons-codec\commons-codec\1.9\commons-codec-1.9.jar;C:\Users\Administrator\.m2\repository\commons-io\commons-io\2.4\commons-io-2.4.jar;C:\Users\Administrator\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\Administrator\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\Administrator\.m2\repository\com\google\protobuf\protobuf-java\2.5.0\protobuf-java-2.5.0.jar;C:\Users\Administrator\.m2\repository\io\netty\netty-all\4.0.23.Final\netty-all-4.0.23.Final.jar;C:\Users\Administrator\.m2\repository\org\apache\zookeeper\zookeeper\3.4.6\zookeeper-3.4.6.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.6.1\slf4j-api-1.6.1.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-log4j12\1.6.1\slf4j-log4j12-1.6.1.jar;C:\Users\Administrator\.m2\repository\org\apache\htrace\htrace-core\3.1.0-incubating\htrace-core-3.1.0-incubating.jar;C:\Users\Administrator\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar;C:\Users\Administrator\.m2\repository\org\jruby\jcodings\jcodings\1.0.8\jcodings-1.0.8.jar;C:\Users\Administrator\.m2\repository\org\jruby\joni\joni\2.1.2\joni-2.1.2.jar;C:\Users\Administrator\.m2\repository\com\yammer\metrics\metrics-core\2.2.0\metrics-core-2.2.0.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-auth\2.5.1\hadoop-auth-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\apache\httpcomponents\httpclient\4.2.5\httpclient-4.2.5.jar;C:\Users\Administrator\.m2\repository\org\apache\httpcomponents\httpcore\4.2.4\httpcore-4.2.4.jar;C:\Users\Administrator\.m2\repository\org\apache\directory\server\apacheds-kerberos-codec\2.0.0-M15\apacheds-kerberos-codec-2.0.0-M15.jar;C:\Users\Administrator\.m2\repository\org\apache\directory\server\apacheds-i18n\2.0.0-M15\apacheds-i18n-2.0.0-M15.jar;C:\Users\Administrator\.m2\repository\org\apache\directory\api\api-asn1-api\1.0.0-M20\api-asn1-api-1.0.0-M20.jar;C:\Users\Administrator\.m2\repository\org\apache\directory\api\api-util\1.0.0-M20\api-util-1.0.0-M20.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-common\2.5.1\hadoop-common-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-annotations\2.5.1\hadoop-annotations-2.5.1.jar;D:\JAVA\jdk1.8.0_231\lib\tools.jar;C:\Users\Administrator\.m2\repository\org\apache\commons\commons-math3\3.1.1\commons-math3-3.1.1.jar;C:\Users\Administrator\.m2\repository\xmlenc\xmlenc\0.52\xmlenc-0.52.jar;C:\Users\Administrator\.m2\repository\commons-net\commons-net\3.1\commons-net-3.1.jar;C:\Users\Administrator\.m2\repository\commons-el\commons-el\1.0\commons-el-1.0.jar;C:\Users\Administrator\.m2\repository\commons-configuration\commons-configuration\1.6\commons-configuration-1.6.jar;C:\Users\Administrator\.m2\repository\commons-digester\commons-digester\1.8\commons-digester-1.8.jar;C:\Users\Administrator\.m2\repository\commons-beanutils\commons-beanutils\1.7.0\commons-beanutils-1.7.0.jar;C:\Users\Administrator\.m2\repository\commons-beanutils\commons-beanutils-core\1.8.0\commons-beanutils-core-1.8.0.jar;C:\Users\Administrator\.m2\repository\org\apache\avro\avro\1.7.4\avro-1.7.4.jar;C:\Users\Administrator\.m2\repository\com\thoughtworks\paranamer\paranamer\2.3\paranamer-2.3.jar;C:\Users\Administrator\.m2\repository\org\xerial\snappy\snappy-java\1.0.4.1\snappy-java-1.0.4.1.jar;C:\Users\Administrator\.m2\repository\com\jcraft\jsch\0.1.42\jsch-0.1.42.jar;C:\Users\Administrator\.m2\repository\org\apache\commons\commons-compress\1.4.1\commons-compress-1.4.1.jar;C:\Users\Administrator\.m2\repository\org\tukaani\xz\1.0\xz-1.0.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-core\2.5.1\hadoop-mapreduce-client-core-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-yarn-common\2.5.1\hadoop-yarn-common-2.5.1.jar;C:\Users\Administrator\.m2\repository\javax\xml\bind\jaxb-api\2.2.2\jaxb-api-2.2.2.jar;C:\Users\Administrator\.m2\repository\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar;C:\Users\Administrator\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar;C:\Users\Administrator\.m2\repository\io\netty\netty\3.6.2.Final\netty-3.6.2.Final.jar;C:\Users\Administrator\.m2\repository\junit\junit\4.13.2\junit-4.13.2.jar;C:\Users\Administrator\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-server\1.3.1\hbase-server-1.3.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-procedure\1.3.1\hbase-procedure-1.3.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-common\1.3.1\hbase-common-1.3.1-tests.jar;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-prefix-tree\1.3.1\hbase-prefix-tree-1.3.1.jar;C:\Users\Administrator\.m2\repository\commons-httpclient\commons-httpclient\3.1\commons-httpclient-3.1.jar;C:\Users\Administrator\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-hadoop-compat\1.3.1\hbase-hadoop-compat-1.3.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hbase\hbase-hadoop2-compat\1.3.1\hbase-hadoop2-compat-1.3.1.jar;C:\Users\Administrator\.m2\repository\com\sun\jersey\jersey-core\1.9\jersey-core-1.9.jar;C:\Users\Administrator\.m2\repository\com\sun\jersey\jersey-server\1.9\jersey-server-1.9.jar;C:\Users\Administrator\.m2\repository\asm\asm\3.1\asm-3.1.jar;C:\Users\Administrator\.m2\repository\commons-cli\commons-cli\1.2\commons-cli-1.2.jar;C:\Users\Administrator\.m2\repository\org\apache\commons\commons-math\2.2\commons-math-2.2.jar;C:\Users\Administrator\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Users\Administrator\.m2\repository\org\mortbay\jetty\jetty\6.1.26\jetty-6.1.26.jar;C:\Users\Administrator\.m2\repository\org\mortbay\jetty\jetty-util\6.1.26\jetty-util-6.1.26.jar;C:\Users\Administrator\.m2\repository\org\mortbay\jetty\jetty-sslengine\6.1.26\jetty-sslengine-6.1.26.jar;C:\Users\Administrator\.m2\repository\org\mortbay\jetty\jsp-2.1\6.1.14\jsp-2.1-6.1.14.jar;C:\Users\Administrator\.m2\repository\org\mortbay\jetty\jsp-api-2.1\6.1.14\jsp-api-2.1-6.1.14.jar;C:\Users\Administrator\.m2\repository\org\mortbay\jetty\servlet-api-2.5\6.1.14\servlet-api-2.5-6.1.14.jar;C:\Users\Administrator\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.13\jackson-core-asl-1.9.13.jar;C:\Users\Administrator\.m2\repository\org\codehaus\jackson\jackson-jaxrs\1.9.13\jackson-jaxrs-1.9.13.jar;C:\Users\Administrator\.m2\repository\tomcat\jasper-compiler\5.5.23\jasper-compiler-5.5.23.jar;C:\Users\Administrator\.m2\repository\tomcat\jasper-runtime\5.5.23\jasper-runtime-5.5.23.jar;C:\Users\Administrator\.m2\repository\org\jamon\jamon-runtime\2.4.1\jamon-runtime-2.4.1.jar;C:\Users\Administrator\.m2\repository\com\lmax\disruptor\3.3.0\disruptor-3.3.0.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-client\2.5.1\hadoop-client-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-app\2.5.1\hadoop-mapreduce-client-app-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-common\2.5.1\hadoop-mapreduce-client-common-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-yarn-client\2.5.1\hadoop-yarn-client-2.5.1.jar;C:\Users\Administrator\.m2\repository\com\sun\jersey\jersey-client\1.9\jersey-client-1.9.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-yarn-server-common\2.5.1\hadoop-yarn-server-common-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-shuffle\2.5.1\hadoop-mapreduce-client-shuffle-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\fusesource\leveldbjni\leveldbjni-all\1.8\leveldbjni-all-1.8.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-yarn-api\2.5.1\hadoop-yarn-api-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-mapreduce-client-jobclient\2.5.1\hadoop-mapreduce-client-jobclient-2.5.1.jar;C:\Users\Administrator\.m2\repository\org\apache\hadoop\hadoop-hdfs\2.5.1\hadoop-hdfs-2.5.1.jar;C:\Users\Administrator\.m2\repository\commons-daemon\commons-daemon\1.0.13\commons-daemon-1.0.13.jar;C:\Users\Administrator\.m2\repository\com\google\guava\guava\27.0.1-jre\guava-27.0.1-jre.jar;C:\Users\Administrator\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\Administrator\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\Administrator\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\Administrator\.m2\repository\org\checkerframework\checker-qual\2.5.2\checker-qual-2.5.2.jar;C:\Users\Administrator\.m2\repository\com\google\errorprone\error_prone_annotations\2.2.0\error_prone_annotations-2.2.0.jar;C:\Users\Administrator\.m2\repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;C:\Users\Administrator\.m2\repository\org\codehaus\mojo\animal-sniffer-annotations\1.17\animal-sniffer-annotations-1.17.jar com.yanqi.hbash.bloom.BloomFilterDemo
数据写入完毕
0存在
1存在
2存在
4998存在
4999存在

5000不存在
5001不存在
5002不存在
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值