总结:没啥用知道有这东西就好了。
作为Phoenix4.10的一部分,我们减少了磁盘存储的大小去改善整体的性能通过以下的增强:
- 在Phoenix的列名和对应的列限定符之间引进一个间接层。
- 支持对不可变表的新编码设计,将所有值进行打包到每个列簇的单个单元中。
需要查看更多关于列映射和不可变数据编码,详见该博客。
- 如何使用列映射?
- 如何使用不可变数据编码?
- 如何关闭列映射?
1. 如何使用列映射?
只能在创建表时进行设置列映射属性。在决定使用列映射,你需要思考多少列你期望在这个表里和它的视图层次结构在整张表的生命周期中。对应各种映射的方案,列数限制如下:
Config/Property Value | Max # of columns |
---|---|
1 | 255 |
2 | 65535 |
3 | 16777215 |
4 | 2147483647 |
无 | 没有限制(理论上) |
对于可变表,这个限制应用于所有列族中的列。对于不可变表,这个限制应用于每一个列簇。默认情况下,任何一个新的phoenix表将会使用列映射特性。可以通过在hbase-site.xml中将下面的配置进行设置为所需的值,去覆盖默认值。
表类型 | 默认列映射 | 配置 |
---|---|---|
可变/不可变 | 2字节限定 | phoenix.default.column.encoded.bytes.attrib |
请记住,此配置控制适用于所有表的全局级默认值。如果您希望使用不同于此全局缺省值的映射方案,则可以使用COLUMN_ENCODED_BYTES表属性。
CREATE TABLE T
(
a_string varchar not null,
col1 integer
CONSTRAINT pk PRIMARY KEY (a_string)
)
COLUMN_ENCODED_BYTES = 1;
2. 如何使用不可变数据编码?
与列映射一样,只能在创建表时设置不可变的数据编码。通过性能测试,我们发现使用SINGLE_CELL_ARRAY_WITH_OFFSETS通常可以提供非常好的性能改进和节省空间。下面是使用ONE_CELL_PER_COLUMN编码更好的一些场景。
- 数据是稀疏的,即少于50%的列有值。
- 列族中的数据变得太大。这里我们的一般指导是,在默认的HBase块大小为64K的情况下,如果一个列族中的数据增长超过50K,那么我们不应该使用SINGLE_CELL_ARRAY_WITH_OFFSETS。
- 对于将拥有视图的不可变表。
默认情况下,不可变的非多租户表是使用双字节列映射和SINGLE_CELL_ARRAY_WITH_OFFSETS数据编码创建的。另一方面,不可变的多租户表是使用双字节列映射模式和ONE_COLUMN_PER_CELL数据编码创建的。这是因为我们通常希望用户在基本的多租户表上创建特定于租户的视图,而上面的标准中提到的视图更适合ONE_CELL_PER_COLUMN编码。与列映射一样,如果希望更改这些全局缺省值,可以通过在hbase-site.xml设置configs下面来实现。
不可变表类型 | 不可变存储设计 | 配置 |
---|---|---|
多租户户 | ONE_CELL_PER_COLUMN | phoenix.default.multitenant.immutable.storage.scheme |
单租户 | SINGLE_CELL_ARRAY_WITH_OFFSETS | phoenix.default.immutable.storage.scheme |
还可以使用表属性IMMUTABLE_STORAGE_SCHEME和COLUMN_ENCODED_BYTES提供特定的不可变存储模式和列映射模式。例如:
CREATE IMMUTABLE TABLE T
(
a_string varchar not null,
col1 integer
CONSTRAINT pk PRIMARY KEY (a_string)
)
IMMUTABLE_STORAGE_SCHEME = SINGLE_CELL_ARRAY_WITH_OFFSETS,
COLUMN_ENCODED_BYTES = 1;
可以选择不使用SINGLE_CELL_ARRAY_WITH_OFFSETS编码,但仍然使用基于数字的列映射之一。例如:
CREATE IMMUTABLE TABLE T
(
a_string varchar not null,
col1 integer
CONSTRAINT pk PRIMARY KEY (a_string)
)
IMMUTABLE_STORAGE_SCHEME = ONE_CELL_PER_COLUMN,
COLUMN_ENCODED_BYTES = 1;
在使用SINGLE_CELL_ARRAY_WITH_OFFSETS编码时,必须使用基于数字的列映射方案。尝试使用COLUMN_ENCODED_BYTES = NONE的SINGLE_CELL_ARRAY_WITH_OFFSETS会抛出错误。
3. 如何关闭列映射?
要禁用跨所有新表的列映射,需要将phoenix.default.column.encode .bytes.attrib设置为0。还可以全局地保留它,并通过在create table语句中设置COLUMN_ENCODED_BYTES = 0属性来选择性地禁用它。
网友评论