date: 2020-09-10 13:50:00

updated: 2020-09-14 16:30:00

1. Phoenix索引

  • 全局索引:适合读多写少的场景。写数据时因为索引表分布在不同数据节点,跨节点数据传输带来巨大的性能消耗。

    • 全局索引必须是查询语句中所有列都包含在全局索引中,它才会生效。
create index my_index on my_table (v3);
select v1 from my_table where v3 = '13406157616';
此时不会走索引,因为检索列不在全局索引中,有以下三种方法使它使用索引:
1. 使用覆盖索引
CREATE INDEX cover_index ON my_table(v3) INCLUDE (v1);
2. 使用 Hint 强制索引
SELECT /*+ INDEX(my_table my_index) */ v1 FROM my_table WHERE v3 = '13406157616';
3. 使用本地索引
CREATE LOCAL INDEX local_index on my_table (v3);
  • 本地索引:适合读少写多的场景。在本地生成一个索引表。
  • 覆盖索引:配合全局索引使用,避免回表查询。
  • 函数索引:适合拼接式字符串查询?。

创建索引的时候有可能因为表的数据量过大,导致索引表的数据量过大,导致发生超时异常,创建出来的索引表不完整,此时可以通过异步索引创建来解决 -- 在创建索引的语句最后添加一个 async,执行语句会直接返回结果,但是索引表状态是处于building。

每一个put/delete操作执行前,会先写入到主表的 Write Ahead Log (WAL) 中,如果出现HBase服务器宕机,则可以从WAL中回放执行之前没有完成的操作,用来保证高并发、持久化的日志保存与回放机制。因为索引表的更新可能会落后于主表一小部分。

HBase WAL架构

WAL日志文件使用的是Hadoop Sequence文件格式,其主要特点:

  1. 二进制格式。row key, family, qualifier, timestamp, value等HBase byte[]数据,都原封不动地顺序写入文件。
  2. Sequence文件中,每隔若干行,会插入一个16字节的魔数作为分隔符。这样如果文件损坏,导致某一行残缺不全,可以通过这个魔数分隔符跳过这一行,继续读取下一个完整的行。
  3. 支持压缩。可以按行压缩。也可以按块压缩(将多行打成一个块)

2. Phoenix加盐

加盐的目的是为了让数据分散到不同机器,缓解查询压力

如果行键即数据,单调增加,那么数据会分布在一个region里,可能会造成热点问题 => 通过添加 SALT_BUCKETS = Num(0 -- 256) 来对行键添加一个字节,使得数据能更均匀分布到各个region中。

其中0是关闭对数据表添加了盐分的索引的盐析的一种特殊方式(因为默认情况下,索引与其数据表具有相同数量的盐桶)

由于加盐表不会顺序存储数据,因此严格的顺序扫描不会以自然排序的方式返回所有数据。强制进行顺序扫描的子句(例如带有LIMIT的子句)可能会返回与普通表不同的数据顺序。

new_row_key = (++index % BUCKETS_NUMBER) + original_key

3. 主键查询

通过关键字 !primarykeys table 或者下面这段查询

select
TENANT_ID TABLE_CAT,TABLE_SCHEM,TABLE_NAME ,COLUMN_NAME,KEY_SEQ,PK_NAME,CASE WHEN SORT_ORDER = 1 THEN 'D' ELSE 'A' END ASC_OR_DESC,ExternalSqlTypeId(DATA_TYPE) AS DATA_TYPE,SqlTypeName(DATA_TYPE) AS TYPE_NAME,COLUMN_SIZE,DATA_TYPE TYPE_ID,VIEW_CONSTANT from SYSTEM."CATALOG" "SYSTEM.TABLE" where
TABLE_SCHEM = 'MODEL_GROUP_RULE_ACCOUNT_TEST'
and TABLE_NAME = 'ECEJ_CALLING_CENTER_H'
and COLUMN_NAME is not null
and COLUMN_FAMILY is null
order by TENANT_ID,TABLE_SCHEM,TABLE_NAME ,COLUMN_NAME

4. 修改字段长度

当创建好phoenix的表后, 默认情况下phoenix不允许修改字段类型和长度。但是可以通过直接修改 SYSTEM.CATALOG 里的数据达到目的

upsert into SYSTEM.CATALOG (TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE,COLUMN_SIZE) values('','库','表','字段','0',12,50);

测试发现,即使上面的上SQL执行成功,重新执行 upsert 往表里插入数据,DEBIT_AMOUNT(初始长度6)超过初始长度的还是不能成功

经过查看源码发现,在 SYSTEM.CATALOG 上有协处理器, 这个里面有表元数据缓存,默认要三个小时过期

org.apache.phoenix.cache.GlobalCache
long maxTTL = this.config.getLong("phoenix.coprocessor.maxMetaDataCacheTimeToLiveMs", 1800000L);
long maxSize = this.config.getLong("phoenix.coprocessor.maxMetaDataCacheSize", 20971520L);

猜想修改长度后三小时能生效

或者在hbase shell 中 先 disable SYSTEM.CATALOG, 然后在 enable SYSTEM.CATALOG

Phoenix的一些问题的更多相关文章

  1. Phoenix综述(史上最全Phoenix中文文档)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles 网上关于P ...

  2. 在DBeaver中phoenix查询报错:org.apache.phoenix.exception.PhoenixIOException: The system cannot find the path specified

    环境:Phoenix:4.4,win7系统 问题:Phoenix在查询hbase时,报"系统找不到指定路径". 解决: 请参见 https://distcp.quora.com/C ...

  3. HBase+Phoenix整合入门--集群搭建

    环境:CentOS 6.6 64位    hbase 1.1.15  phoenix-4.7.0-HBase-1.1 一.前置环境: 已经安装配置好Hadoop 2.6和jdk 1.7 二.安装hba ...

  4. SQL Server恢复软件 Stellar Phoenix sql recovery

    SQL Server恢复软件 Stellar Phoenix sql recovery http://www.stellarinfo.com/ http://www.stellarinfo.com/ ...

  5. Hbase+ Phoenix搭建教程

    Hbase+ Phoenix搭建教程 一.Hbase简介 HBase是基于列存储.构建在HDFS上的分布式存储系统,其主要功能是存储海量结构化数据. HBase构建在HDFS之上,因此HBase也是通 ...

  6. CDH5.4.5运行Phoenix导入CSV文件

    1.安装phoenix 在界面上设置Phoenix的parcel包: http://52.11.56.155:7180/cmf/settings?groupKey=config.scm.parcel. ...

  7. Phoenix -修复表索引

    索引的修复可以通过2种方式,(关于pehoenix的索引的生命周期可以参考  https://community.hortonworks.com/articles/58818/phoenix-inde ...

  8. phoenix将hdfs数据导入hbase

    http://phoenix.apache.org/bulk_dataload.html

  9. phoenix 开发API系列 目录

    phoenix 开发API系列(一)创建简单的http api phoenix 开发API系列(二)phoenix 各类 api 实现方式 phoenix 开发API系列(三)phoenix api ...

  10. phoenix 开发API系列(三)phoenix api 结合数据库

    概述 介绍了 api 的各种写法之后,下面介绍构建 api 时与数据库连接的方式. 注 下面使用的工程的完整代码已经公开在: http://git.oschina.net/wangyubin/phoe ...

随机推荐

  1. 二分类问题 - 【老鱼学tensorflow2】

    什么是二分类问题? 二分类问题就是最终的结果只有好或坏这样的一个输出. 比如,这是好的,那是坏的.这个就是二分类的问题. 我们以一个电影评论作为例子来进行.我们对某部电影评论的文字内容为好评和差评. ...

  2. Spring Boot 知识清单(一)SpringApplication

    爱生活,爱编码,微信搜一搜[架构技术专栏]关注这个喜欢分享的地方.本文 架构技术专栏 已收录,有各种JVM.多线程.源码视频.资料以及技术文章等你来拿. 一.概述 目前Spring Boot已经发展到 ...

  3. Flutter中如何方便的获取音视频的长度

    此次主要是flutter集成im,在发送视频时需要加上时长,但是用视频controller只能在初始化时具备路径才可以可以使用:just_audio插件中的方法进行获取 详情看官方文档:https:/ ...

  4. spring in action-note-2

    1.AOP:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是 ...

  5. Windows下设置Mongodb用户名密码

    MongoDB认证: 在默认的情况下,Mongodb是监听在127.0.0.1 IP上的,端口号默认为27017,任何客户端都可以连接,不需要认证 默认情况下,Mongodb也是没有管理账户的,除非你 ...

  6. Artwork (Gym - 102346A)【DFS、连通块】

    Artwork (Gym - 102346A) 题目链接 算法 DFS,连通块 时间复杂度:O(k*n + k * k) 1.这道题就是让你判断从(0,0)到(m,n),避开中途所有的传感器(传感器的 ...

  7. python数据结构实现(栈和链栈)

    栈 class Stack: def __init__(self, limit: int 10): self.stack = [] self.limit = limit def __bool__(se ...

  8. 万字长文 | 23 个问题 TCP 疑难杂症全解析

    每个时代,都不会亏待会学习的人. 在进入今天主题之前我先抛几个问题,这篇文章一共提出 23 个问题. TCP 握手一定是三次?TCP 挥手一定是四次? 为什么要有快速重传,超时重传不够用?为什么要有 ...

  9. C++ 构造函数 隐式转换 深度探索,由‘类对象的赋值操作是否有可能调用到构造函数’该实验现象引发

    Test1 /** Ques: 类对象的赋值操作是否有可能调用到构造函数 ? **/ class mystring { char str[100]; public: mystring() //myst ...

  10. 【代码审计】JAVA代码审计

    分享一些Java安全相关文章,其中大部分都涉及到代码的分析与审计. 大家总是在找Java的代码审计的文章,但好像很多人选择性失明. 其实Java没有和PHP一样的简单,所以你觉得你看到的文章不是入门级 ...