设为首页 收藏本站
查看: 779|回复: 0

[经验分享] Hadoop学习四十:Phoenix二级索引浅谈

[复制链接]
发表于 2016-12-12 07:39:04 | 显示全部楼层 |阅读模式
一.概述

  • Hadoop2.2.0   Hbase0.96.1.1  Phoenix-2.2.0-SNAPSHOT
  • Phoenix官网上提供了三个与Hbase兼容的版本,分别为Phoenix2.X-Hbase0.94.X ,Phoenix3.X-Hbase0.94.X,Phoenix4.X-Hbase0.98.1+,没有与Hbase0.96兼容的版本。幸运的是git上有Phoenix Hbase0.96的分支,参考https://github.com/forcedotcom/phoenix/tree/port-0.96。于是我自己编译成了Phoenix-2.2.0-SNAPSHOT 。
二.Phoenix二级索引介绍

  •  在Hbase中,按字典顺序排序的rowkey是一级索引。不通过rowkey来查询数据时需要过滤器来扫描整张表。通过二级索引,这样的场景也可以轻松定位到数据。
  • Example:

    • DDL: create table user (id varchar primary key, firstname varchar, lastname varchar); create index user_idx on user (firstname);
    • Query: DDL select id, firstname, lastname from user where firstname = 'foo';

  • Phoenix支持两种形式的索引,可变索引和不可变索引。没有一个地方显示的  指定索引是否可变,它们是通过对应的主表是否可变IMMUTABLE_ROWS来默认设定的。
三.不可变索引

  •  不可变索引的存储方式是write once, append only。不可变索引使用场景十分有限,仅仅适合于按时间先后顺序的数据(time-series data),此时主表只有新数据进来,不会更新数据。
  • 初始化数据

    • DDL: create table user (id varchar primary key, firstname varchar, lastname varchar) IMMUTABLE_ROWS=true; create index user_idx on user (firstname)
    • DML:upsert into user values(‘ 1’, ‘lh5’, ‘x0b’)
    • 此时通过phoenix客户端看到Hbase的数据如下 DSC0000.jpg

  • 修改数据

    • DML:upsert into user values(‘1’, ‘ghz, ‘wmn)
    • 此时通过phoenix客户端看到Hbase的数据如下
    • 可以看到,主表user的数据已经update,但索引表user_idx的索引并不是修改,而是追加,即write once, append only。 DSC0001.jpg

  • 新增数据

    • DML:upsert into user values(‘2’, ‘ghz, ‘wmn)
    • 此时通过phoenix客户端看到Hbase的数据如下
    • 可以看到,主表user数据新增了,索引表同时新增了这条记录 DSC0002.jpg

四.可变索引

  •  通常情况下,主表里的数据并不是time-series data,主表里的数它们随时可能被修改。这个时候,必须使用可变索引来保证索引表伴随着主表的变化一起变化。
  • 初始化数据

    • DDL: create table user (id varchar primary key, firstname varchar, lastname varchar) ; create index user_idx on user (firstname)
    • DML:upsert into user values(‘ 1’, ‘6ws’, ‘ecu’)
    • 此时通过phoenix客户端看到Hbase的数据如下 DSC0003.jpg

  • 修改数据
  • 新增数据,对于这两种情况,没有测试成功。在将数据写或更新到主表前,会先将数据写或更新到索引表,就是这里出问题了。目前尚不清楚是我集群环境的问题还是Phoenix本身的问题。先把问题提到了jira https://issues.apache.org/jira/browse/PHOENIX-1051。 DSC0004.jpg
五.容错性

  •  在upsert操作被成功返回给客户端之前,phoenix保证所有这些数据被写入索引表和主表。对于upsert的每一行数据,phoenix保证要么同时写入到索引表和主表,要么都不更新(all-or-nothing)。
  • 有几点需要注意的是

    • Phoenix不保证完整的事务,所以你可能看到索引表与主表不一致的情况。如果你想自己同步,可以使用命令alter index user_idx on user rebuild。同时也要注意,建立索引的过程有可能bring down整个hbase集群。
    • 对于一行数据来说,写入总是all-or-nothing, written or lost,不会部分写入。
    • 更新先写入索引表,再写入主表。

六.优化
  你可以在hbase-site.xml里配置以下参数
1. index.builder.threads.max
o 为主表更新操作建立索引的最大线程数
o Default: 10
2. index.builder.threads.keepalivetime
o 上面线程的超时时间
o Default: 60
3. index.writer.threads.max
o 将索引写到索引表的最大线程数
o Default: 10
4. index.writer.threads.keepalivetime
o 上面线程的超时时间
o Default: 60
5. hbase.htable.threads.max
o 同时最多有这么多线程往索引表写入数据
o Default: 2,147,483,647
6. hbase.htable.threads.keepalivetime
o 上面线程的超时时间
o Default: 60
7. index.tablefactory.cache.size
o 缓存10个往索引表写数据的线程
o Default: 10

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312878-1-1.html 上篇帖子: Mahout for hadoop 2 下篇帖子: Hadoop学习四十一:HBase基础
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表