http://blog.csdn.net/c77_cn/article/details/41750569

Phoenix是什么?看看官网就知道了,我就不细说了。关于它的优点,官网也是列了一大堆,我也不复述了。

下面只谈谈截止Phoenix4.2.1,我认为存在的两大缺点:

1. 完全丧失了HBase的多版本特征

HBases至少也是三维结构(row、cf:cq、timestamp)的数据模型,Phoenix将其映射为二维的关系模型后,便面对着损失信息精度的尴尬场面。这种尴尬具体表现在Phoenix使用的两个方面:

a. 不能为一个cell指定任意的timestamp

作为HBase的第三维特征,timestamp的重要性不言而喻。由于绝大部分数据应用场景都离不开时间维度,所以我们经常会将数据中的某个时间字段映射到timestamp,也就无需在CF中存储该字段了。这样的好处是:既节约了存储空间,也可以使用timestamp相关的API(例如Get#setTimeRange)进行查询。
遗憾的是,Phoenix并不能让我们像HBase一样指定任意的timestamp。虽然Phoenix在 F.A.Q. 中煞有其事的提出了貌似这个问题的解决方案。但是深究之后你会发现这是一个比较坑爹的方案。理由如下:

  • 首先,该方案貌似可以指定任意的timestamp,但是需要在应用程序中频繁的创建和关闭Connection,虽然他们还专门强调这不是一个“昂贵”的操作(is not an expensive operation),但是这样的代码风格估计会让很多人无语。
  • 其次,该方案的任意timestamp其实是有条件的,即必须大于表的创建时间,否则,会出现“Table undefined”的异常。
需要说明的是,Phoenix可以Upsert重复的记录,每条记录的timestamp是不一样的。这样来看,虽然timestamp不是我期待的,但是多版本是不是已经实现了呢?看到下面的一点你应经就明白了。。。。。。
b. 不能获取一个cell的多个版本
Phoenix总是获取cell的最新版本,有没有办法去获取其它版本呢?
我曾经受F.A.Q.中CurrentSCN属性的启发,自以为想到一个方法:不管三七二十一,先去拿一次,拿到的肯定是最新版本了。取其timestamp赋给PhoenixRuntime.CURRENT_SCN_ATTRIB后再去拿,这样就拿到次新版本了。以此类推,每次拿一个版本,直到拿不到而已。虽然这种方法有点笨,但是我想着总是可以解决问题的。但是后来突然发现一个致命的缺陷:如何取结果中的timestamp呢?呵呵,看来这个方法不单单是“有点笨”了......
相信这个问题也困扰了许多人,并引发了许多人的思考。PHOENIX-590便是专门针对这个问题,遗憾的是,虽然提出了一些解决思路,但是至今仍然没有实质性的进展。
变通方案
PHOENIX-590提出了一种解决方案,其实也和我们想的一样。。。。。。就是将timestamp作为Phoenix表的单独一列,并且和其它字段作为组合主键。这样的本质是row和timestamp二维合成一维,反映在HBase里面,其实是将timestamp的值附加在row后面了。这样可以解决使用timestamp查询的问题,缺点是浪费了一些存储空间。
2. 二级索引设计比较粗糙
[sql] view plaincopyprint?
  1. CREATE  INDEX  idx_name  ON  TAB_NAME(IDX_FIELD);
  2. SELECT OtherField FROM TAB_NAME WHERR IDX_FIELD='';

我以为这样就可以利用索引了,但是其实不然,必须要

[sql] view plaincopyprint?
  1. CREATE  INDEX  idx_name  ON  TAB_NAME(IDX_FIELD) INCLUDE(OtherField);

因为二级索引创建了一个新的索引表,没有INICLUDE时,索引表中的value为空,上述查询将不会利用索引表,而是Full Scan主表。INCLUDE时,会将OtherField字段写入索引表的value中,上述查询将会利用索引表进行Range Sacn。
这种做法让人不得不吐糟,虽然说存储不值钱,但是也不能这么浪费吧。
不过细想一下,这也是Phoenix的无奈之举:因为它不能保证主表和索引表对应Region的本地化,所以也就无法根据索引表的结果再去查主表了。


变通方案
a. 客户端自己解决:先查索引表获取Primary Key,然后根据Primary Key二次查询主表;
b. 使用其他索引方案......
针对目前Phoenix的二级索引方案,我个人建议一定要谨慎使用。鉴于其无与伦比的膨胀性,我建议只考虑使用在比较小的表上,并且对该表是写少读多。

Phoenix中不得不说的两大缺点相关推荐

  1. java语音jvm_java环境中基于jvm的两大语言:scala,groovy

    一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...

  2. js中的数据类型分为两大类分别是什么_数据类型有这么重要吗?

    一个没有得到重视的知识点, 数据类型 每种语言都有自己的数据类型,下面以javascript为例 类型的分类 js的数据类型可以分为 两大类: 1,值类型 (String,Number,undefin ...

  3. 如何在PDF中删除页面的两大技巧介绍

    在编辑PDF文档的时候,我们除了添加页面之外,还会在其中删除一些页面.毕竟制作好的PDF文档,可能有一些页面是我们不需要的.那么,我们怎么对PDF文档进行编辑并删除其中的页面呢? 一.借助迅捷PDF编 ...

  4. 外汇天眼:外汇市场上不得不说的两大类庄家!

    前一阵子,天眼君跟好友讨论外汇市场上有没有庄家,今天天眼君就跟大家探讨下这个问题.我们都知道股票交易中是有所谓的庄家的,散户必须要猜测庄家的做法,否则很有可能变成待割的韭菜. 而我们常见的对外宣传中, ...

  5. 数字移动通信系统中广泛使用的两大类调制技术

    1.连续相位调制技术 这种调制技术的射频已调波信号具有确定的相位关系且包络恒定,也称之为恒包络调制技术.它具有频谱旁瓣分量低,误码性能好,可以使用高效率的C类功率放大器等特点.属于这一类的调制技术有平 ...

  6. 两大图灵奖得主力作:计算机架构的新黄金时代

    来源|Communications of ACM 撰文|John L. Hennessy, David A. Patterson 编译|机器之心 原文|https://cacm.acm.org/mag ...

  7. mysql 帐号开启远程_两大步骤教您开启MySQL 数据库远程登陆帐号

    在工作实践和学习中,如何开启 MySQL 数据库的远程登陆帐号算是一个难点的问题,以下内容便是在工作和实践中总结出来的两大步骤,能帮助DBA们顺利的完成开启 MySQL 数据库的远程登陆帐号. 1.确 ...

  8. JavaScript两大支柱-PART1:如何逃脱第七层地狱

    阅读原文 在我们进入这个主题之前,请允许我先介绍一下我自己.我想在这结束之前,你可能会想知道我是谁. 我是Eric Elliott,<Programming JavaScript Applica ...

  9. java数据类型 两大类_Java公开课|将Java数据类型分为这两大类,就能涵盖所有类型...

    [摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...

最新文章

  1. Could not install packages due to an Environment Error: [Errno 13] Permission denied 解决方案
  2. 如何实现微服务架构中的服务发现
  3. hdu 4252(单调栈)
  4. java能够运行的原理_JAVA程序运行原理分析(一)
  5. 正确率 精度 召回率 错误率
  6. 进程间通信 (IPC) 方法总结(三)
  7. php类如何变为静态调用,PHP类中静态方法如何调用非静态方法?_后端开发
  8. ios并发会造成什么问题_痔疮会造成什么伤害?
  9. 使用临时表关联数据时效率低的问题
  10. Layui form 表单验证 基本属性
  11. Atitit.redis操作总结
  12. 产品密钥无法激活成功,最后使用visio2013激活软件激活成功。
  13. 2020广西电子设计竞赛题目
  14. 74xx系列芯片类型及功能概览
  15. Java我的世界forge安装失败,我的世界forge安装失败install怎么办
  16. 关于Hanlp的源码
  17. HUAWEI Mate40Pro解除账号忘记密码ID强制刷机鸿蒙系统激活锁能解开吗
  18. Eclipse 绿豆沙
  19. ios内存管理(整理篇)
  20. 微风:什么是UI设计?

热门文章

  1. 串口控制语音模块XY-V17B
  2. ckeditorsmartupload
  3. 算法之求一个非负整数的平方根
  4. Window.ShowModalDialog使用详解
  5. 运营商大数据 | 打造新型获客模式 破除流量困局
  6. 【Python】文本转语音库pyttsx3
  7. pcap、libnet编译使用、注意事项
  8. QQ群排名优化:“小百度”大蓝海有搞头
  9. 气压计MS5611编程操作流程
  10. 银行的east系统是什么