欢迎投稿

今日深度:

HBase实操 | 使用Phoenix在CDH的HBase创建二级索引,

HBase实操 | 使用Phoenix在CDH的HBase创建二级索引,hbasecdh


1.文档编写目的

对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询。如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄。对于较大的表,全表扫描的代价是不可接受的。


但是,很多情况下,需要从多个角度查询数据。例如,在定位某个人的时候,可以通过姓名、身份证号、学籍号等不同的角度来查询,要想把这么多角度的数据都放到rowkey中几乎不可能(业务的灵活性不允许,对rowkey长度的要求也不允许)。


所以,需要secondary index来完成这件事。secondary index的原理很简单,即通过索引表来实现,但是如果自己维护的话则会麻烦一些。在很早的版本中,Phoenix就已经提供了对HBase secondary index的支持。


Fayson在前面的文章《Cloudera Labs中的Phoenix》和《如何在CDH中使用Phoenix》中介绍了Cloudera Labs中的Phoenix,以及如何在CDH5.11.2中安装和使用Phoenix4.7。本文Fayson主要介绍如何在CDH中使用Phoenix在HBase上建立二级索引。


内容概述:
1.建表与数据准备
2.启用Kafka的Sentry赋权
3.Kafka的赋权测试
4.总结


测试环境:
1.CM5.14.3/CDH5.14.2
2.Phoenix4.7.0
3.操作系统版本为Redhat7.4
4.采用root用户进行操作
5.集群未启用Kerberos


2.建表与数据准备


1.首先确保你的CDH集群已经安装Phoenix的Parcel,安装过程省略,具体可以参考《如何在CDH中使用Phoenix》。
a19f3481303652ce7216242d0a20cb6d4c86fdea

2.准备一个测试csv文件用来导入Phoenix的表中,Fayson这里准备一个1.2GB,995W行,11个字段的数据文件。
1d3d0ee2bebaf32934cc30811dfdcf761f05d1e2
3.连接到Phoenix的终端,在Phoenix中建表hbase_test
288efbae5cdad9e2606757d8fffa463b958f0292
f0d837b5230bffe6f005d7207dd742e9a33b6923
4.将准备好的csv文件put到HDFS,然后通过Phoenix自带的bulkload工具将准备好的csv文件批量导入到Phoenix的表中。
f93a9ed7d722c2ba2dc1ebda59e1821e1333aad7
c65928e79b41f7741fa591c719e8fc41606afa69
5.在Phoenix和hbase shell中分别查询确认数据入库成功。
f8ef769c771b29fbd5edd37d068e412580695816

3.Covered Indexes(覆盖索引)



1.使用覆盖索引获取数据的过程中,内部不需要再去HBase的原表获取数据,查询需要返回的列都会被存储在索引中。要想达到这种效果,你的select的列,where的列都需要在索引中出现。举个例子,如果你的SQL语句是select s2 from hbase_test where s6='13505503576',要最大化查询效率和速度最快,可以建立覆盖索引。

d7d9625045140ed710065a6095e2e34b82dd2990

提示要对HBase进行一些配置才能执行该语句。


2.将以下配置增加到hbase-site.xml,通过Cloudera Manager搜索HBase服务的“hbase-site.xml 的 HBase 服务高级配置代码段(安全阀)”。

de99a5916f462466fb646422b12aa938a5e51c8e

保存更改,然后重启HBase。


3.在执行建立覆盖索引之前,我们先执行2个查询语句方便后面跟建立索引后的查询时间进行对比。

d6a208e41d9710c8660456ef198f195949c467dc

4.再次执行建立覆盖索引的语句

585a68dc0034000c460157b013f50c00dab5f777

5.再次执行上面2个查询语句。


35c1f776afbb7951f03c7f9ad856d5145b181a07

发现都是毫秒级返回,而之前2个查询都是需要30几秒。


6.我们再来具体看看建立覆盖索引的语句。

36e2c9b7835c71f30152890ca2c7b636df19b6d6

4.Functional Indexes(函数索引)



函数索引从从Phoenix4.3版本就有,这种索引的内容不局限于列,还能在表达式上建立索引。如果你使用的表达式正好就是索引的话,数据也可以直接从这个索引获取,而不需要从数据库获取。


1.在建立函数索引时,我们先执行两个查询语句好方便与建立索引以后的性能进行对比。

2b3b7f98e437d875690d0df54d78fd480e06d6b8

2.建立函数索引

a7586c2bbbe910d95f4066dad23780343fe1d643

3.再次执行前面的查询语句进行比较

03c72976e30bb4fa2313870cd24cec3fd1b17196

如果查询项包含substr(s7,1,10),则查询时间在毫秒级,而之前需要30多秒。如果查询项不包含substr(s7,1,10),则跟不建索引时是一样的。如果想让第一个查询语句走索引,我们可以在建立索引时采用INCLUDE(S7)来实现。


5.Global Indexes(全局索引)



全局索引适合那些读多写少的场景。如果使用全局索引,读数据基本不损耗性能,所有的性能损耗都来源于写数据。数据表的添加、删除和修改都会更新相关的索引表(数据删除了,索引表中的数据也会删除;数据增加了,索引表的数据也会增加)。而查询数据的时候,Phoenix会通过索引表来快速低损耗的获取数据。默认情况下,如果你的查询语句中没有索引相关的列的时候,Phoenix不会使用索引。


6.Local Indexes(本地索引)



本地索引适合那些写多读少,或者存储空间有限的场景。和全局索引一样,Phoenix也会在查询的时候自动选择是否使用本地索引。本地索引之所以是本地,只要是因为索引数据和真实数据存储在同一台机器上,这样做主要是为了避免网络数据传输的开销。如果你的查询条件没有完全覆盖索引列,本地索引还是可以生效。因为无法提前确定数据在哪个Region上,所以在读数据的时候,还需要检查每个Region上的数据而带来一些性能损耗。


1.先删除之前建立的函数索引INDEX2_HBASE_TEST。

6327046d67bd26928a0cbbeb5e5c3c30504df1cd

可以发现这2个查询语句返回时间都在毫秒级,而如果不建立索引,查询时间为35S以上。


7.总结



Phoenix的二级索引主要有两种,即全局索引和本地索引。全局索引适合那些读多写少的场景。如果使用全局索引,读数据基本不损耗性能,所有的性能损耗都来源于写数据。本地索引适合那些写多读少,或者存储空间有限的场景。


索引定义完之后,一般来说,Phoenix会判定使用哪个索引更加有效。但是,全局索引必须是查询语句中所有列都包含在全局索引中,它才会生效。举个例子,下面是创建索引的语句:

ad347fe78a5be2fd4d278bfc7e5868dbdca7e631

上例就不会用到索引my_index。因为s2并没有包含在索引中。所以使用全局索引,必须要所有的列都包含在索引中。那么怎样才能使用索引呢?有三种方法。


1.创建索引时使用覆盖索引

99822297986fcc663cd9c83632fa3d4d22e29b77

这种索引会把s2加到索引表里面,同时s2也会随着原数据表中的变化而变化。这种方式很明显的缺点是索引表的大小较大,然后就是全局索引不适合写特别多的情况。

这个查询效果具体可以参考第三章


2.使用类似于Oracle的Hint,强制索引。

0fecf643de86947d3faaf5b4d944a84e8c0ae09e

如果不带hint,查询时间为35s,带了hint强制使用索引后查询时间为0.099秒。

查询引擎会使用index1_hbase_test这个索引,由于它会发现索引表中没有s5数据,所以每一行它都会去原数据表中获取s5的值。这个强制索引只有在你认为索引有比较好的选择性的时候才是好的选择,也就是说s6等于13505503576的行数不多。不然的话,使用Phoenix默认的全表扫描的性能也许会更好。


3.创建本地索引

dfcfdd7903e8b2e0b90b933284afc76e87025b60

本地索引和全局索引不同的是,查询语句中,即使所有的列都不在索引定义中,它也会使用索引,这是本地索引的默认行为。Phoenix知道原数据和索引数据在同一个RegionServer上,能保证索引查找是本地的。本地索引查询效果具体可参见第6章。

注:使用函数索引,查询语句中带上hint也没有作用。


号外:【贡献社区】如何向 Apache Kylin 做贡献,并成为一名 Committer?

Apache Kylin 是第一个由国人主导的 Apache 项目,自2015年从 Apache 孵化器毕业至今已经三年,三年的时间,Kylin社区发展迅速,用户从早期的 eBay、京东、美团等互联网企业逐渐发展到现在国内外各行业上千家企业。

Apache 强调 “Community over code”,只要你长期在社区树立影响力,获得其他人的认可和信任,都可以成为Committer。

众所周知,顶级开源项目历来受到技术业界的普遍认可,成为 Apache Kylin Committer 不仅能提升在技术圈的影响力,也将成为开源软件的“代言人”参与到项目管理中。当然,成为 Committer 是一个荣誉与责任共存的事情,它不是终点,而是一个更高的起点。

目前,Apache Kylin 未来还有大量的创造性工作需要完成,目前在 roadmap上的功能就有:

  • 完全使用 spark 的构建和查询引擎

  • 支持更多数据源(关系型,非关系型等)

  • 支持灵活(Ad-hoc)查询

  • 列式存储引擎

  • 实时分析引擎及 Lambda 架构

  • 容器化(Docker & Kubernetes)

 

为此我们非常诚挚地欢迎

社区开发者参与到 Kylin 的开发中来

共同打造这一大数据分析领域的神兽!

aa0e23342c78cec3a6554662095ebb474c1883d2

aed9d46f77dd20d0826e7c279e2218dee3b73275

f7dd8ca04a9cb9d49db2df3fbb9da4fdb1429af5

1f10029bdf22074fb4d1d19f20f1edec4e6104ed

2d8049c6ee69cd4e6ceed18db8d011ce3ca917c7

不想只是Contributor,还想打怪升级成为Committer?

aa0e23342c78cec3a6554662095ebb474c1883d2

b26a36d5de576c3989e5ba812aba046cc4b11138




还有点不明白?来 Kylin 社区找我们吧:

http://kylin.apache.org/community/


d3f2f0da5b6761a64c7049db7719525a2c492a0c


大家工作学习遇到HBase技术问题,把问题发布到HBase技术社区论坛http://hbase.group,欢迎大家论坛上面提问留言讨论。想了解更多HBase技术关注HBase技术社区

www.htsjk.Com true http://www.htsjk.com/hbase/11190.html NewsArticle HBase实操 | 使用Phoenix在CDH的HBase创建二级索引,hbasecdh 1.文档编写目的 对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询。如果不通过rowkey来查找数据,就必须...
评论暂时关闭