Schema设计
主键-Primary Key
Kudu表创建了之后,主键就不能再改变了(ALTER)。只能先把表删除、修改建表语句里的主键并重建一个新表。
如果是联合主键,多个主键字段要放在建表语句所有字段的最前面。
主键字段不能使用UPDATE语句进行修改操作。如果想要更新一个已经存在数据的主键,只能把这一行数据先删除再插入新的(两步一起非原子性操作)。
DOUBLE, FLOAT, 或者 BOOL三个数据类型的列不能作为主键字段。另外,主键的列必须是非空的(NOT NULL)。
Kudu不支持Kudu本身自动生成的主键,(插入数据时自动生成)。
在由Kudu完成内部联合主键编码之后,组成联合主键的Cell占用空间不得超过16KB。
Cells
在编码或压缩之前,任何单个Cell都不得超过64KB。
在由Kudu完成内部联合主键编码之后,组成联合主键的Cell总共限制为16KB。
插入不符合这些限制的行将导致错误信息返回给客户端。
列-Columns
Kudu默认最大支持300个列,建议合适的较少的列会获得最佳性能。
Kudu不支持的数据类型:CHAR, VARCHAR, DATE, 复杂类型如 ARRAY, MAP, 和 STRUCT(结构体)。--Hive是支持的
Kudu表一旦创建完成,字段类型和是否为NULL不能再被改变(ALTER)。
删除一个列不会立即释放磁盘空间,必须先进行Compaction操作。
DECIMAL类型的精度和长度不能再被改变(ALTER)。
表-Tables
每一张表都必须有奇数个副本,最大是7个。
创建表的时候设置副本数,默认是3,一经创建不能被修改。
无法手动执行Compaction操作,但是DROP删除一个表会立即释放磁盘空间。
其他使用限制
不支持二级索引
不支持多行事务
不支持关系特性-外键
表名称和列的标识符必须是UTF-8编码格式,此外,最大长度为256个字符。
当然关键字、保留字不能作为标识符。
分区限制
Kudu表必须使用简单主键或联合主键手动预先切分到多个Tablet中。
目前还不支持自动切分。
除了添加或删除范围分区range之外,Kudu不允许更改表在创建之后的分区方式(hash\range\hash+range)。
现有表中的数据目前无法自动重新分区。
作为一种“重新分区”解决方案,可以使用新的分区方式创建一个新表,然后把旧表的数据插入到新表中去。
集群规模建议和限制
Kudu可以在各种环境和任务或作业(工作负载)中无缝运行,只需要很少的专业知识和配置,最基础的集群规模如下:
Master节点建议最多不超过3个(一般为3个)。
Tablet Server节点建议做多不超过100个。
每个Tablet Server节点的最大存储数据量(包括副本、压缩之后)为8TB。
每个Tablet Server节点建议的Tablet数量(包括副本)是1000个,最大允许数量是2000。
在创建表时,每个表、每个Tablet Server的最大Tablet数量为60(不包括副本,算上副本总共是180-默认副本数是3)。
Query: CREATE TABLE kdtest.sys_config (id INT COMMENT '主键',remark STRING COMMENT '备注',PRIMARY KEY (id))PARTITION BY HASH (id) PARTITIONS 70COMMENT '测试'STORED AS KUDUERROR: ImpalaRuntimeException: Error creating Kudu table 'impala::kdtest.sys_config'CAUSED BY: NonRecoverableException: the requested number of tablet replicas is over the maximum permitted at creation time (180), additional tablets may be added by adding range partitions to the table post-creation
建议每个Tablet最大容量不超过50GB,超出50GB可能会导致性能明显下降、可能会出现数据压缩问题、Tablet Server启动时间会变慢等问题。
建议每个Tablet的容量在10GB或以下。
在使用Kudu的过程中遵循以上这些限制,能够获得更好的Kudu性能和体验。
不过,在现代性能强劲的硬件上运行最新版本的Kudu,无论是测试还是调优以及社区使用情况的反馈,均可以轻松很容易实现大规模的Kudu部署。
如生产环境中实际使用情况:
Master节点数量:3个
超过300个Tablet Server
每个Tablet Server存储超过10GB的数据(在副本复制和数据压缩之后)
包括Tablet副本在内,每个Tablet Server有超过4000个Tablet。
每个Tablet存储约有50GB的数据。
Server节点管理方面的限制
生产环境部署应该为Tablet Server配置至少4GB的内存,在接近数据大小和Tablet数量限制时,理想情况下内存应该超过16GB。
写前日志(WALs)只能存储在一个磁盘上。
无法删除数据目录。必须重新格式化数据目录才能删除它们。
Tablet Server不能优雅地下线。
Tablet Server不能变更其IP地址和端口。
Kudu对最新的NTP(时钟同步服务)有严格的要求,Kudu Master节点和Tablet Server之间时间不同步时会崩溃掉。
Kudu版本只在NTP上测试过,其他时间同步提供程序(如Chrony)可能无法工作。
集群管理方面的限制
Kudu集群不支持滚动重新启动。
Kudu集群中推荐的最大点到点延迟为20毫秒。
建议在Kudu集群中最小点对点网络带宽为10 Gbps。
如果打算使用机架节点的位置感知特性将Tablet Server放在不同的位置,建议事先测量服务器节点间的网络带宽和通信延迟,以确保它们符合想要达到的目标。
当集群第一次启动时,所有Master节点必须同时启动,Raft共识算法要求节点间“及时”互相沟通。
复制和备份限制
Kudu目前没有任何内置的数据备份和数据恢复功能。
Kudu鼓励用户根据需要使用Spark或Impala等工具导出或导入表。
Kudu集成Impala的限制
当使用Impala创建一个Kudu表时,CREATE TABLE语句必须在其他列之前按照主键顺序包含主键列(Kudu本身的限制)。
Impala不能更新主键列中的值(Kudu本身的限制)。
Impala不能创建带有VARCHAR或内嵌类型列的Kudu表(Kudu本身的限制)。
当在Impala中作为外部表使用时,带有包含大写或非ascii字符的名称的Kudu表必须分配一个备用名称。
在Impala中,带有包含大写或非ascii字符的列名的Kudu表不能用作外部表,可以在Kudu中重命名列来解决这个问题。
!=和LIKE谓词不会被推送到Kudu,而是由Impala扫描节点计算,相对于其他类型的谓词,这可能会降低性能。
使用Impala的更新、插入和删除都是非事务性的。如果增删改在执行过程中部分失败,失败的部分将不会回滚。
单个查询的最大并行度限制在表中的Tablet数。为了获得良好的分析性能,目标是每个机器使用10个或更多的Tablet,或者使用大的表。
有三个Impala关键字在创建Kudu表时是不支持的
PARTITIONED
LOCATION
ROWFORMAT
Kudu集成Spark的限制
即使Kudu和Spark 2.x集成与Java 7兼容,Spark 2.2(及更高版本)在运行时也需要Java 8。
自Kudu 1.5.0版本起,Spark 2.2是默认的依赖版本。
表名称中包含大写字母或非ASCII字符的Kudu表在注册为临时表时必须分配一个备用名称。
列名称中包含大写字母或非ASCII字符的Kudu表不得与SparkSQL一起使用,可以在Kudu中重命名列以解决此问题。
小于号大于号<>和OR不会推送到Kudu,而是由Spark任务进行评估。
只有带有后缀通配符的LIKE谓词才会被推送到Kudu,这意味着将按LIKE 'FOO%',但不会按LIKE 'FOO%BAR'。
Kudu不支持Spark SQL支持的所有类型,例如,不支持日期和复杂类型。
Kudu表只能在SparkSQL中注册为临时表。
无法使用HiveContext查询Kudu表。
安全限制
静态的数据加密并没有直接内置到Kudu中。
静态的Kudu数据加密可以通过使用dmcrypt等本地块设备加密软件来实现。
行级授权不可用。
Kudu不支持为Kudu进程配置自定义服务,服务必须遵循kudu/<主机>@模式。
由Kudu IPKI生成的服务器证书与bouncycastle 1.52及更早版本不兼容。
TLS协议的最高支持版本是TLSv1.2
其他已知问题
以下是Kudu当前版本中已知的部分错误和问题,它们将在以后的版本中解决,此列表并不详尽,仅是最重要的已知问题:
如果使用-log_force_fsync_all选项配置Kudu Master,则Tablet Server和客户端将会出现频繁超时,并且群集可能变得不可用。
如果Tablet Server上面的Tablet数量很多,则可能需要几分钟才能启动。
建议将每台Tablet Server上的Tablet数量限制为1000个或更少,预切分表时,请考虑此限制。
如果已经注意到启动时间很慢,则可以在Web UI中监控每台服务器的Tablet数量。
【END】





