架构设计限制:
主键
- 创建表以后无法修改主键。修改主键只能通过删除旧表后创建新表的方式。
- 主键列必须位于第一列
- 无法使用 UPDATE 来修改主键,要修改主键必须删除该行再使用新的主键重新插入数据。这种修改是非原子性的。
DOUBLE
FLOAT
BOOL
类型的列不允许作为主键定义的一部分。此外,属于主键定义的列必须NOT NULL
- 不支持自动生成主键
- 在 KUDU 完成内部编码后,构成复合主键限制为 16K
单元(cell)
在编码或压缩之前,单个单元不得大于64KB。在Kudu完成内部复合编码之后,构成复合键的单元限制为总共16KB。插入不符合这些限制的行将导致错误返回给客户端。
列(Columns)
- 默认情况下,Kudu不允许创建超过300列的表。我们建议使用较少列的架构设计以获得最佳性能。
- 不支持
CHAR
,VARCHAR
,DATE
和ARRAY
等复杂类型。 - 更改表格操作无法更改现有列的类型和可为空性。
- 无法通过更改表操作来更改
DECIMAL
列的精度和比例。 - 删除列不会立即回收空间。必须先运行压缩
行 (Row)
Kudu主要用于分析用例。虽然单个单元可以高达64KB,并且Kudu最多支持300列,但是不建议单行数据超过几百KB,如果单行包含数千字节数据则可能会遇到未知的问题。
表 (Table)
- 表必须具有奇数个副本,最多为7个
- 复制因子(副本数)在建表时设置,且建表后无法更改
- 不支持关联功能,比如外键
- 列和表名等标识符仅限于有效的UTF-8字符串,最大长度为256个字符。
如果您使用Apache Impala查询Kudu表,请参阅Impala集成限制 部分
分区限制
- 必须使用单一主键或复合主键手动将表格分区(一个分区一个副本对应一个 tablet 服务),自动分区尚不支持。除了允许添加和删除范围分区(range partition),kudu 不允许在创建表后更改分区设置。
- 现有表中的数据无法重新调整分区,解决办法是使用新的分区创建一个新表,将旧表数据插入新表
- 丢失大部分复本的 Tablet ,例如三个中剩余一个,需要手动干预才能进行修复
扩展建议和限制
- 建议 Tablet 服务器的数量最大为 100 个
- 建议最大 Master 服务器数量为 3个
- 建议最大存储的数据量:复制和压缩后,每台 Tablet 服务器为 8TB
- 每台 Tablet 服务器建议最大的 tablet 服务数量为 1000 个(复制后的数量),最大为 2000 个
- 在创建表时,每个 Tablet 服务器中,每个表的 tablet 服务数量为 60 个(复制后,且默认复制因子为3)
- 每个 tablet 的数据量不要超过 50G,建议为 10G 以下。否则会导致性能下降,tablet 启动慢等问题
服务器管理限制
- 生产部署应为 Tablet 服务器配置至少4 GiB的内存,在接近数据和 Tablet 规模限制时,理想情况下应超过16 GiB。
- 预写日志(WAL)只能存储在一个磁盘上。
- Tablet 服务无法优雅的退役(无法自动处理 某个tablet 服务器的关闭、宕机等状况)
- Tablet 服务器无法更改地址和端口
- Kudu对于拥有最新的NTP有着严格的要求。 Kudu Master 和 Tablet 服务器在不同步时会崩溃。
- Kudu 版本仅通过NTP测试。其他时间同步提供程序(如Chrony)可能无法正常工作
集群管理限制
- 不支持机架感知
- 不支持多数据中心
- 不支持滚动重启
- 所有 Master 必须在集群第一次启动时同时启动
复制和备份限制
Kudu目前不包含任何用于备份和恢复的内置功能。鼓励用户根据需要使用Spark或Impala等工具导出或导入表。
Impala 集成限制
- 创建 kudu 表时, CREATE TABLE 语句中必须将主键列放在其他列前面
- impala 无法更新主键列的值
- 无法创建 VARCHAR 或 嵌套类型(nested) 列
- 当kudu作为impala 外部表使用时,必须为包含大写字符或非ASCII字符的 KUDU 表名 分配别名
- 包含大写字符或非ASCII字符列名的kudu表无法作为 impala 的外部表使用,可以在kudu中重命名列解决
!=
LIKE
谓词不会被推送到 Kudu 执行,而是由impala节点评估,和其他谓词相比可能会性能比较低- 使用 impala 进行
UPDATE
INSERT
DELETE
时非事务性的,如果失败了一部分时不会回滚的。 - 单个查询最大并行度受限于表的 tablet 数,为了获得更好的性能,针对大型表格每台主机需要分配 10 个或更多的 tablet。
创建 Kudu 表时不支持的 Impala 关键字
- PARTITIONED
- LOCATION
- ROWFORMAT
spark 集成限制
- Spark 2.2(及更高版本)在运行时需要Java 8,即使Kudu - Spark 2.x集成与Java 7兼容。 Spark 2.2是Kudu 1.5.0的默认依赖版本。
- 当注册为临时表时,必须为名称包含大写或非ASCII字符的Kudu表分配备用名称。
- 包含大写或非ASCII字符的列名的Kudu表不能与SparkSQL一起使用。可以在Kudu中重命名列以解决此问题。
<>
和OR
谓词不会被推送到Kudu,而是由Spark任务评估。只有具有通配符后缀的LIKE
谓词才会被推送到Kudu。这意味着LIKE“FOO%”
将被推送到Kudu,但是LIKE “FOO%BAR”
将不会。- Kudu不支持Spark SQL支持的所有类型。例如,不支持日期和复杂类型。
- Kudu表只能在SparkSQL中注册为临时表
- 使用HiveContext无法查询Kudu表
安全限制
- 静态数据加密不直接内置于Kudu中。通过使用本地块设备加密软件(如dmcrypt)可以实现静态加密Kudu数据。
- 授权仅适用于系统范围的粗粒度级别。表级,列级和行级授权功能不可用。
- Kudu不支持为Kudu进程配置自定义服务主体。主体必须遵循
kudu/<HOST>@<DEFAULT.REALM>
。 - Kudu与Apache Flume的集成不支持写入需要身份验证的Kudu集群。
- Kudu IPKI生成的服务器证书与bouncycastle 1.52及更早版本不兼容。有关详细信息,请参阅KUDU-2145。