分析用例几乎只使用查询表中列的子集,并且通常在广泛的行上聚合值。面向列的数据极大地加速了这种访问模式。操作用例更有可能访问一行中的大部分或所有列,并且可能更适合由面向行的存储提供服务。Kudu 选择了面向列的存储格式,因为它主要针对分析用例。
没有什么可以阻止 Kudu 提供面向行的选项,它可以包含在潜在的版本中。
Kudu 与 HBase 有一些共同点。与 HBase 一样,它是一个实时存储,支持键索引记录查找和变异。
但是,Kudu 的设计在一些基本方面与 HBase 不同:
在 HBase 中进行这些根本性的更改需要进行大规模的重新设计,而不是一系列简单的更改。HBase 是适用于多种应用程序和用例的正确设计,并将继续成为这些工作负载的最佳存储引擎。
是的!Kudu 已经在许多大公司的生产中进行了实战测试。
是的,Kudu 是开源的,并根据 Apache 软件许可证 2.0 版获得许可。Apache Kudu 是 Apache 软件基金会旗下的一个顶级项目 (TLP)。
我们坚信开源对于项目长期可持续发展的价值。我们还认为,当项目还很年轻时,与一小群共同定位的开发人员一起工作会更容易。在同一个组织中,我们可以在系统的初始设计和开发过程中快速行动。
现在 Kudu 是公开的并且是 Apache 软件基金会的一部分,我们期待在下一阶段的开发中与更大的社区合作。
培训不是由 Apache 软件基金会提供,但可能由第三方供应商提供。
截至 2016 年 1 月,Cloudera 提供了一个 名为“Apache Kudu 简介”的按需培训课程。本培训涵盖 Kudu 是什么、它与其他 Hadoop 相关存储系统的比较、可从使用 Kudu 中受益的用例以及如何使用 Apache Impala 创建、存储和访问 Kudu 表中的数据。
除了培训之外,您还可以通过文档、邮件列表和Kudu 聊天室获得有关使用 Kudu 的帮助 。
是的。Kudu 的快速入门指南中提供了有关通过基于 Docker 的快速入门在 Kudu 上启动和运行的 说明。
Kudu 通过本地文件系统访问存储设备,最适合使用 Ext4 或 XFS。Kudu 处理跨JBOD挂载点的条带化,并且不需要RAID。Kudu 的预写日志 (WAL) 可以存储在与数据文件不同的位置,这意味着 WAL 可以存储在SSD 上,从而在具有 SSD 和磁盘的系统上实现低延迟写入。
Kudu 的磁盘数据格式与 Parquet 非常相似,但在支持高效随机访问和更新方面存在一些差异。如果不使用 Kudu 客户端 API,则无法直接查询底层数据。Kudu 开发人员努力确保 Kudu 的扫描性能是高性能的,并且专注于有效地存储数据,而无需进行允许直接访问数据文件所需的权衡。
Kudu 不是 内存数据库, 因为它主要依赖于磁盘存储。这不应与 Kudu 对 集成在块缓存中的持久内存的实验性使用相混淆 。将来,这种集成将允许缓存在TableT服务器重启后继续存在,因此它永远不会“冷”启动。
此外,Kudu 的 C++ 实现可以扩展到非常大的堆。再加上其 CPU 高效设计,Kudu 的堆可扩展性为适合内存的数据集提供了出色的性能。
Kudu 的磁盘数据格式与 Parquet 非常相似,但在支持高效随机访问和更新方面存在一些差异。如果不使用 Kudu 客户端 API,则无法直接查询底层数据。Kudu 开发人员努力确保 Kudu 的扫描性能是高性能的,并且专注于有效地存储数据,而无需进行允许直接访问数据文件所需的权衡。
推荐的压缩编解码器取决于 CPU 利用率和存储效率之间的适当权衡,因此取决于用例。
Kudu 中的 Compactions 被设计得很小并且总是在后台运行。它们在(可配置的)预算下运行,以防止TableT服务器意外尝试一次重写数十 GB 的数据。由于压缩是如此可预测,唯一可用的调整旋钮是维护管理器中专用于刷新和压缩的线程数。
Kudu 运行后台压缩过程,该过程以增量方式不断压缩数据。恒定的小型压缩通过避免可能垄断 CPU 和 IO 资源的主要压缩操作来提供可预测的延迟。
不,Kudu 目前不支持这样的功能。
Kudu Tablet服务器将数据存储在 Linux 文件系统上。我们建议为存储目录使用 ext4 或 xfs 挂载点。通常,Kudu 平板服务器将与现有 HDFS 数据节点共享相同的分区。
HBase 中的热点是从所使用的分发策略继承的属性。
默认情况下,HBase 使用基于范围的分布。基于范围的分区将有序值存储在磁盘上连续提供的键的指定范围内。当存在大量并发小查询时,基于范围的分区是有效的,因为只有集群中具有查询指定范围内的值的服务器才会被招募来处理该查询。范围分区容易出现热点,要么是因为用于指定范围的键表现出“数据倾斜”(每个范围内的行数不统一),要么是因为某些数据被更频繁地查询而造成“工作负载倾斜”。
相比之下,基于散列的分布指定了一定数量的“桶”,分布键被传递给一个散列函数,该函数产生该行分配给的桶的值。如果仔细选择分布键(没有商业意义的唯一键是理想的)散列分布将导致集群中的每个服务器具有统一的行数。基于散列的分布可防止数据倾斜和工作负载倾斜。此外,它为任何单个查询提供最高可能的吞吐量,因为所有服务器都是并行招募的,因为数据将均匀分布在集群中的每个服务器上。然而,通过为每个查询招募集群中的每个服务器来优化吞吐量会损害集群可以实现的最大并发性。
Kudu 支持这两种方法,使您能够选择以牺牲潜在数据和工作负载倾斜为代价的范围分区来强调并发,或者通过散列分区以牺牲并发为代价查询吞吐量。
Kudu 是一个存储引擎,而不是 SQL 引擎。动态分区是在执行时创建的,而不是在查询时创建的,但无论哪种情况,从 Kudu 的角度来看,该过程看起来都是一样的:查询引擎会将分区键传递给 Kudu。
用 CAP 定理的说法,Kudu 是一种 CP 类型的存储引擎。如果托管该TableT的领导副本的服务器出现故障,则写入TableT将被延迟,直到法定人数的服务器能够选举新领导并确认给定的写入请求。
Kudu 通过使用 Raft 共识获得以下属性:
在当前版本中,其中一些属性尚未完全实现,并且可能存在一些缺陷。请参阅“ Kudu 的一致性级别是否可调?“ 想要查询更多的信息。
是的,Kudu 的一致性级别是部分可调的,无论是写入还是读取(扫描):
Kudu 的事务语义是一项正在进行中的工作,有关更多信息和警告,请参阅 Kudu 事务语义。
“已提交读”和“READ_AT_SNAPSHOT”一致性模式都不允许脏读。
Kudu 尚未使用 Jepsen 进行公开测试,但可以按照这些说明运行一组测试 。
Kudu 通过 Java 和 C++ API 提供直接访问。还提供了一个实验性的 Python API,预计将来会得到全面支持。将数据加载到 Kudu 的最简单方法是CREATE TABLE ... AS SELECT * FROM ... ,在 Impala 中使用语句。此外,通常使用 Spark、Nifi 和 Flume 将数据摄取到 Kudu 中。
将数据加载到 Kudu 的最简单方法是数据是否已经由 Impala 管理。在这种情况下,一个简单的INSERT INTO TABLE some_kudu_table SELECT * FROM some_csv_table 就行了。
您还可以使用 Kudu 的 Spark 集成从或任何其他 Spark 兼容数据存储加载数据。
没有提供将数据直接加载到 Kudu 的磁盘数据格式的工具。我们发现,对于许多工作负载,Kudu 的插入性能可以与其他系统的批量加载性能相媲美。
Kudu 使用类型化存储,目前没有针对 JSON 等半结构化数据的特定类型。半结构化数据可以存储在 STRING 或 BINARY 列中,但大值(10 KB 或更多)可能会导致当前版本的性能或稳定性问题。
未来将根据需求添加对 JSON 和 protobuf 等半结构化类型的更全面支持。
Kudu 不是 SQL 引擎。JDBC 和 ODBC 驱动程序的可用性将由与 Kudu 结合使用的 SQL 引擎决定。
如果使用其编程 API 访问 Kudu,则它不依赖于任何 Hadoop 组件。但是,Kudu 的大多数用法将包括至少一个 Hadoop 组件,例如 MapReduce、Spark 或 Impala。已修改以利用 Kudu 存储的组件(例如 Impala)可能具有 Hadoop 依赖项。
Kudu 是一个独立的存储系统。它不依赖或运行在 HDFS 之上。Kudu 可以与 HDFS 共存于同一个集群上。
我们考虑过将数据存储在 HDFS 上的设计,但出于以下原因决定朝不同的方向发展:
Kudu 与 Impala、Spark、Nifi、MapReduce 等集成。预计会有其他框架,其中 Hive 是当前最高优先级的补充。
Kudu 可以与 HDFS 共置在相同的数据磁盘挂载点上。这类似于托管 Hadoop 和 HBase 工作负载。Kudu 已经在这种类型的配置中进行了广泛的测试,没有稳定性问题。对于延迟敏感的工作负载,请考虑将 SSD 专用于 Kudu 的 WAL 文件。
Kudu 本身没有任何服务依赖,可以在没有 Hadoop、Impala、Spark 或任何其他项目的集群上运行。
如果要使用Impala,请注意Impala 依赖于Hive 的元数据服务器,它对Hadoop 有自己的依赖。目前不可能有纯 Kudu+Impala 部署。
对于少于 100 个节点的小型集群,具有合理数量的表和Tablet,主节点需要很少的 RAM,通常为 1 GB 或更少。对于具有大量表或TableT的工作负载,将需要更多 RAM,但不会比典型的 Hadoop 工作节点多。
不可以。Kudu 支持运行多个 Master 节点,使用相同的 Raft 共识算法来实现数据的持久性。
不,SSD 不是 Kudu 的要求。Kudu 旨在充分利用快速存储和大量内存(如果存在),但两者都不是必需的。
我们这次不建议地理分布TableT服务器,因为可能会出现更高的写入延迟。此外,Kudu 目前不知道数据放置。这可能导致 master 可能尝试将所有副本放在同一个数据中心的情况。我们计划在未来的版本中实现地理分布的必要功能。
Kudu 还没有命令行 shell。如果您的集群上安装了 Kudu 兼容版本的 Impala,那么您可以将其用作 shell 的替代品。另请参阅Kudu Impala 集成的文档。
虽然 Master 没有分片,但由于以下原因,预计不会成为瓶颈。
运行 Kudu 需要 Linux。有关详细信息,请参阅安装指南。在 Kudu 0.6.0 和更新版本中支持 OSX 作为开发平台。Java 客户端可以在任何 JVM 7+ 平台上使用。
RHEL 5:内核缺少处理磁盘空间回收(例如打孔)的关键功能,并且无法运行使用 C++11 语言功能的应用程序。
Debian 7:附带 gcc 4.7.2,它会生成损坏的 Kudu 优化代码,并且对使用 C++11 语言功能的应用程序的支持不足。
SLES 11:无法运行使用 C++11 语言功能的应用程序。
从 Kudu 1.10.0 开始,Kudu 通过使用 Apache Spark 实现的作业支持完整和增量表备份。此外,它还支持通过使用 Apache Spark 实现的还原作业从完整备份和增量备份中还原表。有关详细信息,请参阅管理文档。
对于没有内置备份机制的旧版本,如果您有可用的 Impala,它可以提供帮助。您可以使用它使用以下语句将数据复制为 Parquet 格式:
INSERT INTO TABLE some_parquet_table SELECT * FROM kudu_table
然后使用distcp 将 Parquet 数据复制到另一个集群。
目前,Kudu 不支持在站点之间传送或重放 WAL 的任何机制。
每个TableT有一个 WAL。
Kudu 支持强身份验证,旨在通过利用 Kerberos 与其他安全的 Hadoop 组件进行互操作。它还支持客户端请求的粗粒度授权和服务器之间以及客户端与服务器之间通信的 TLS 加密。要了解更多信息,请参阅 安全指南。
是的,Kudu 提供添加、删除和重命名列/表的功能。目前无法就地更改列的类型,尽管这有望添加到后续的 Kudu 版本中。
Kudu 表必须具有唯一的主键。Kudu 尚未使用包含大值(10 KB 或更高)的列进行测试,并且在使用大值时会出现性能问题。请参阅 架构设计。
在许多情况下,Kudu 的实时和分析性能的结合将允许通过使用单个存储引擎来简化 Lambda 架构固有的复杂性。
使用 Kudu API 时,用户可以选择进行同步操作。如果进行一系列同步操作,Kudu 保证按相应顺序分配时间戳。
Kudu 受到 Spanner 的启发,它使用基于共识的复制设计和时间戳来进行一致性控制,但磁盘布局却大不相同。
Kudu 是为 OLAP 工作负载设计和优化的,缺乏支持 OLTP 所需的多行事务和二级索引等功能。
作为真正的列存储,Kudu 对 OLTP 的效率不如行存储。目前还有一些实施问题会影响 Kudu 在 Zipfian 发行版更新上的性能(参见 YCSB 结果在我们草稿论文的性能评估中。
我们预计未来的版本将继续提高这些工作负载的性能,但 Kudu 并非旨在完全替代所有工作负载的 OLTP 存储。请考虑其他存储引擎,例如 Apache HBase 或传统的 RDBMS。
Kudu 支持复合主键。目前不支持二级索引,无论是否复合。
不,Kudu 不支持二级索引。只能通过主键进行随机访问。对于分析钻取查询,Kudu 具有非常快的单列扫描,这使得它在对小集群上的数十亿行进行查询时可以产生亚秒级的结果。
Kudu 的主键是自动维护的。目前不支持手动或自动维护的二级索引。
Kudu 的主键可以是简单的(单列)或复合的(多列)。在任何TableT中,行都按主键的排序顺序写入。在复合键的情况下,排序由键中列的声明顺序决定。对于基于散列的分布,整个键的散列用于确定值将放入的“桶”。
无论使用哪种类型的分区,都可以仅基于主键列的子集进行分区。例如,“(host, timestamp)”的主键可以仅在时间戳列上进行范围分区。
Kudu 表有一个主键,用于唯一性以及提供对单个行的快速访问。当前不支持自动递增列、外键约束和二级索引,但可以在后续 Kudu 版本中添加。
不,Kudu 目前不支持多行事务。但是,单行操作在该行内是原子的。
Kudu 旨在最终完全符合 ACID。但是,尚未实现多行事务。它目前提供的单行事务保证与 HBase 非常相似。
Kudu 目前不支持事务回滚。
原文链接:https://kudu.apache.org/faq.html