ApacheKudu使用限制

架构设计限制:

主键

  • 创建表以后无法修改主键。修改主键只能通过删除旧表后创建新表的方式。
  • 主键列必须位于第一列
  • 无法使用 UPDATE 来修改主键,要修改主键必须删除该行再使用新的主键重新插入数据。这种修改是非原子性的。
  • DOUBLE FLOAT BOOL 类型的列不允许作为主键定义的一部分。此外,属于主键定义的列必须 NOT NULL
  • 不支持自动生成主键
  • 在 KUDU 完成内部编码后,构成复合主键限制为 16K

单元(cell)

在编码或压缩之前,单个单元不得大于64KB。在Kudu完成内部复合编码之后,构成复合键的单元限制为总共16KB。插入不符合这些限制的行将导致错误返回给客户端。

列(Columns)

  • 默认情况下,Kudu不允许创建超过300列的表。我们建议使用较少列的架构设计以获得最佳性能。
  • 不支持CHARVARCHARDATEARRAY等复杂类型。
  • 更改表格操作无法更改现有列的类型和可为空性。
  • 无法通过更改表操作来更改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。
Licensed under CC BY-NC-SA 4.0