FAQ系列之Kudu

2021-07-27 15:30:28 浏览数 (1)

Kudu为什么要使用列存储格式?逐行格式会提高性能吗?

分析用例几乎只使用查询表中列的子集,并且通常在广泛的行上聚合值。面向列的数据极大地加速了这种访问模式。操作用例更有可能访问一行中的大部分或所有列,并且可能更适合由面向行的存储提供服务。Kudu 选择了面向列的存储格式,因为它主要针对分析用例。

没有什么可以阻止 Kudu 提供面向行的选项,它可以包含在潜在的版本中。

为什么要构建新的存储引擎Kudu?为什么不直接改进 Apache HBase 以提高其扫描速度?

Kudu 与 HBase 有一些共同点。与 HBase 一样,它是一个实时存储,支持键索引记录查找和变异。

但是,Kudu 的设计在一些基本方面与 HBase 不同:

  • Kudu 的数据模型更传统地是关系型的,而 HBase 是无模式的。
  • Kudu 的磁盘表示是真正的柱状,并且遵循与 HBase/BigTable 完全不同的存储设计。

在 HBase 中进行这些根本性的更改需要进行大规模的重新设计,而不是一系列简单的更改。HBase 是适用于多种应用程序和用例的正确设计,并将继续成为这些工作负载的最佳存储引擎。

Apache Kudu 准备好部署到生产环境了吗?

是的!Kudu 已经在许多大公司的生产中进行了实战测试。

Kudu 是开源的吗?

是的,Kudu 是开源的,并根据 Apache 软件许可证 2.0 版获得许可。Apache Kudu 是 Apache 软件基金会旗下的一个顶级项目 (TLP)。

为什么 Kudu 在发布之前在 Cloudera 内部开发?

我们坚信开源对于项目长期可持续发展的价值。我们还认为,当项目还很年轻时,与一小群共同定位的开发人员一起工作会更容易。在同一个组织中,我们可以在系统的初始设计和开发过程中快速行动。

现在 Kudu 是公开的并且是 Apache 软件基金会的一部分,我们期待在下一阶段的开发中与更大的社区合作。

可以培训Kudu吗?

培训不是由 Apache 软件基金会提供,但可能由第三方供应商提供。

截至 2016 年 1 月,Cloudera 提供了一个 名为“Apache Kudu 简介”的按需培训课程。本培训涵盖 Kudu 是什么、它与其他 Hadoop 相关存储系统的比较、可从使用 Kudu 中受益的用例以及如何使用 Apache Impala 创建、存储和访问 Kudu 表中的数据。

除了培训之外,您还可以通过文档、邮件列表和Kudu 聊天室获得有关使用 Kudu 的帮助 。

有Kudu的快速入门吗?

是的。Kudu 的快速入门指南中提供了有关通过基于 Docker 的快速入门在 Kudu 上启动和运行的 说明。

Kudu 如何存储其数据?底层数据存储不经过Kudu就可读吗?

Kudu 通过本地文件系统访问存储设备,最适合使用 Ext4 或 XFS。Kudu 处理跨JBOD挂载点的条带化,并且不需要RAID。Kudu 的预写日志 (WAL) 可以存储在与数据文件不同的位置,这意味着 WAL 可以存储在SSD 上,从而在具有 SSD 和磁盘的系统上实现低延迟写入。

Kudu 的磁盘数据格式与 Parquet 非常相似,但在支持高效随机访问和更新方面存在一些差异。如果不使用 Kudu 客户端 API,则无法直接查询底层数据。Kudu 开发人员努力确保 Kudu 的扫描性能是高性能的,并且专注于有效地存储数据,而无需进行允许直接访问数据文件所需的权衡。

Kudu 是内存数据库吗?

Kudu 不是 内存数据库, 因为它主要依赖于磁盘存储。这不应与 Kudu 对 集成在块缓存中的持久内存的实验性使用相混淆 。将来,这种集成将允许缓存在TableT服务器重启后继续存在,因此它永远不会“冷”启动。

此外,Kudu 的 C 实现可以扩展到非常大的堆。再加上其 CPU 高效设计,Kudu 的堆可扩展性为适合内存的数据集提供了出色的性能。

Kudu 运行自己的格式类型还是使用 Parquet?压缩建议是什么?

Kudu 的磁盘数据格式与 Parquet 非常相似,但在支持高效随机访问和更新方面存在一些差异。如果不使用 Kudu 客户端 API,则无法直接查询底层数据。Kudu 开发人员努力确保 Kudu 的扫描性能是高性能的,并且专注于有效地存储数据,而无需进行允许直接访问数据文件所需的权衡。

推荐的压缩编解码器取决于 CPU 利用率和存储效率之间的适当权衡,因此取决于用例。

是否应该管理Kudu的压缩?

Kudu 中的 Compactions 被设计得很小并且总是在后台运行。它们在(可配置的)预算下运行,以防止TableT服务器意外尝试一次重写数十 GB 的数据。由于压缩是如此可预测,唯一可用的调整旋钮是维护管理器中专用于刷新和压缩的线程数。

Kudu的压缩性能如何?

Kudu 运行后台压缩过程,该过程以增量方式不断压缩数据。恒定的小型压缩通过避免可能垄断 CPU 和 IO 资源的主要压缩操作来提供可预测的延迟。

是否有 HBase 中的生存时间属性来自动删除记录?

不,Kudu 目前不支持这样的功能。

Kudu Tablet服务器是否需要 Linux 文件系统或直接控制存储设备?

Kudu Tablet服务器将数据存储在 Linux 文件系统上。我们建议为存储目录使用 ext4 或 xfs 挂载点。通常,Kudu 平板服务器将与现有 HDFS 数据节点共享相同的分区。

是否有可能像 HBase 一样出现区域服务器热点,Kudu 如何缓解这种情况?

HBase 中的热点是从所使用的分发策略继承的属性。

默认情况下,HBase 使用基于范围的分布。基于范围的分区将有序值存储在磁盘上连续提供的键的指定范围内。当存在大量并发小查询时,基于范围的分区是有效的,因为只有集群中具有查询指定范围内的值的服务器才会被招募来处理该查询。范围分区容易出现热点,要么是因为用于指定范围的键表现出“数据倾斜”(每个范围内的行数不统一),要么是因为某些数据被更频繁地查询而造成“工作负载倾斜”。

相比之下,基于散列的分布指定了一定数量的“桶”,分布键被传递给一个散列函数,该函数产生该行分配给的桶的值。如果仔细选择分布键(没有商业意义的唯一键是理想的)散列分布将导致集群中的每个服务器具有统一的行数。基于散列的分布可防止数据倾斜和工作负载倾斜。此外,它为任何单个查询提供最高可能的吞吐量,因为所有服务器都是并行招募的,因为数据将均匀分布在集群中的每个服务器上。然而,通过为每个查询招募集群中的每个服务器来优化吞吐量会损害集群可以实现的最大并发性。

Kudu 支持这两种方法,使您能够选择以牺牲潜在数据和工作负载倾斜为代价的范围分区来强调并发,或者通过散列分区以牺牲并发为代价查询吞吐量。

Kudu 是否支持动态分区?

Kudu 是一个存储引擎,而不是 SQL 引擎。动态分区是在执行时创建的,而不是在查询时创建的,但无论哪种情况,从 Kudu 的角度来看,该过程看起来都是一样的:查询引擎会将分区键传递给 Kudu。

Kudu的一致性模型是什么?Kudu是CP系统还是AP系统?

用 CAP 定理的说法,Kudu 是一种 CP 类型的存储引擎。如果托管该TableT的领导副本的服务器出现故障,则写入TableT将被延迟,直到法定人数的服务器能够选举新领导并确认给定的写入请求。

Kudu 通过使用 Raft 共识获得以下属性:

  • 领导人选举很快。一旦领导者错过了 3 个心跳(每个半秒),剩余的追随者将选举一个新的领导者,该领导者将立即开始接受操作。整个过程通常不到 10 秒。
  • Follower 副本不允许写入,但是当不需要完全最新的数据时,它们允许读取。因此,可以将针对历史数据(即使只有几分钟)的查询发送到任何副本。如果该副本失败,则可以立即将查询发送到另一个副本。

在当前版本中,其中一些属性尚未完全实现,并且可能存在一些缺陷。请参阅“ Kudu 的一致性级别是否可调?“ 想要查询更多的信息。

Kudu 的一致性级别是否可调?

是的,Kudu 的一致性级别是部分可调的,无论是写入还是读取(扫描):

  • 写入单个TableT始终在内部保持一致。在使用多个客户端写入多个TableT时,用户可以在不一致性(默认)和以两种不同方式强制执行“外部一致性”之间进行选择:一种优化延迟需要用户执行额外的工作,另一种不需要额外的工作,但可能会导致一些额外的延迟。
  • 默认情况下,扫描具有“已提交读”一致性。如果用户需要严格可序列化的扫描,它可以选择READ_AT_SNAPSHOT模式,并可选择提供时间戳。默认选项是非阻塞的,但从READ_AT_SNAPSHOT非领导副本读取时该选项可能会阻塞。

Kudu 的事务语义是一项正在进行中的工作,有关更多信息和警告,请参阅 Kudu 事务语义。

Kudu 如何处理脏读?

“已提交读”和“READ_AT_SNAPSHOT”一致性模式都不允许脏读。

Kudu 的 Jepsen 报告在哪里?

Kudu 尚未使用 Jepsen 进行公开测试,但可以按照这些说明运行一组测试 。

数据可以直接加载到Kudu吗?可以使用哪些摄取工具?

Kudu 通过 Java 和 C API 提供直接访问。还提供了一个实验性的 Python API,预计将来会得到全面支持。将数据加载到 Kudu 的最简单方法是CREATE TABLE ... AS SELECT * FROM ... ,在 Impala 中使用语句。此外,通常使用 Spark、Nifi 和 Flume 将数据摄取到 Kudu 中。

将数据批量加载到 Kudu 的最有效方法是什么?

将数据加载到 Kudu 的最简单方法是数据是否已经由 Impala 管理。在这种情况下,一个简单的INSERT INTO TABLE some_kudu_table SELECT * FROM some_csv_table 就行了。

您还可以使用 Kudu 的 Spark 集成从或任何其他 Spark 兼容数据存储加载数据。

没有提供将数据直接加载到 Kudu 的磁盘数据格式的工具。我们发现,对于许多工作负载,Kudu 的插入性能可以与其他系统的批量加载性能相媲美。

Kudu 可以存储哪些类型的数据?它可以接受 JSON 吗?

Kudu 使用类型化存储,目前没有针对 JSON 等半结构化数据的特定类型。半结构化数据可以存储在 STRING 或 BINARY 列中,但大值(10 KB 或更多)可能会导致当前版本的性能或稳定性问题。

未来将根据需求添加对 JSON 和 protobuf 等半结构化类型的更全面支持。

Kudu是否有可用的 JDBC 驱动程序?

Kudu 不是 SQL 引擎。JDBC 和 ODBC 驱动程序的可用性将由与 Kudu 结合使用的 SQL 引擎决定。

你需要 Hadoop 来运行 Kudu 吗?

如果使用其编程 API 访问 Kudu,则它不依赖于任何 Hadoop 组件。但是,Kudu 的大多数用法将包括至少一个 Hadoop 组件,例如 MapReduce、Spark 或 Impala。已修改以利用 Kudu 存储的组件(例如 Impala)可能具有 Hadoop 依赖项。

Kudu和HDFS是什么关系?Kudu 需要 HDFS 吗?

Kudu 是一个独立的存储系统。它不依赖或运行在 HDFS 之上。Kudu 可以与 HDFS 共存于同一个集群上。

为什么 Kudu 不将其数据存储在 HDFS 中?

我们考虑过将数据存储在 HDFS 上的设计,但出于以下原因决定朝不同的方向发展:

  • Kudu 使用 Raft 共识在逻辑级别处理复制,这使得 HDFS 复制变得多余。我们本可以强制复制级别为 1,但这不是 HDFS 的最佳用例。
  • HDFS 提供的文件系统级快照不会直接转换为 Kudu 对快照的支持,因为很难预测给定的数据何时会从内存中刷新。此外,快照只有在每个表级别提供时才有意义,这将很难通过文件系统级别的快照进行编排。
  • HDFS 安全性不会转换为表级或列级 ACL。与 HBase ACL 类似,Kudu 需要实现自己的安全系统,并且不会从 HDFS 安全模型中获得太多好处。
  • Kudu 的扫描性能已经与存储在 HDFS 上的 Parquet 文件处于同一水平,因此无需直接读取 Kudu 的数据文件。

Kudu 集成了哪些框架进行数据访问?

Kudu 与 Impala、Spark、Nifi、MapReduce 等集成。预计会有其他框架,其中 Hive 是当前最高优先级的补充。

我可以将 Kudu 与 HDFS 并置在同一台服务器上吗?

Kudu 可以与 HDFS 共置在相同的数据磁盘挂载点上。这类似于托管 Hadoop 和 HBase 工作负载。Kudu 已经在这种类型的配置中进行了广泛的测试,没有稳定性问题。对于延迟敏感的工作负载,请考虑将 SSD 专用于 Kudu 的 WAL 文件。

Kudu 的运行时依赖是什么?

Kudu 本身没有任何服务依赖,可以在没有 Hadoop、Impala、Spark 或任何其他项目的集群上运行。

如果要使用Impala,请注意Impala 依赖于Hive 的元数据服务器,它对Hadoop 有自己的依赖。目前不可能有纯 Kudu Impala 部署。

Kudu主节点的 RAM 应该比工作节点多吗?

对于少于 100 个节点的小型集群,具有合理数量的表和Tablet,主节点需要很少的 RAM,通常为 1 GB 或更少。对于具有大量表或TableT的工作负载,将需要更多 RAM,但不会比典型的 Hadoop 工作节点多。

主节点是单点故障吗?

不可以。Kudu 支持运行多个 Master 节点,使用相同的 Raft 共识算法来实现数据的持久性。

Kudu 是否需要使用 SSD?

不,SSD 不是 Kudu 的要求。Kudu 旨在充分利用快速存储和大量内存(如果存在),但两者都不是必需的。

Kudu 部署可以地理分布吗?

我们这次不建议地理分布TableT服务器,因为可能会出现更高的写入延迟。此外,Kudu 目前不知道数据放置。这可能导致 master 可能尝试将所有副本放在同一个数据中心的情况。我们计划在未来的版本中实现地理分布的必要功能。

Kudu Shell在哪里?

Kudu 还没有命令行 shell。如果您的集群上安装了 Kudu 兼容版本的 Impala,那么您可以将其用作 shell 的替代品。另请参阅Kudu Impala 集成的文档。

Kudu Master是瓶颈吗?

虽然 Master 没有分片,但由于以下原因,预计不会成为瓶颈。

  • 与许多其他系统一样,一旦 Tablet 位置被缓存,master 就不在热路径上。
  • Kudu 主进程非常有效地将所有内容保存在内存中。在我们对 80 节点集群的测试中,获取TableT位置的第 99.99 个百分位数延迟约为数百微秒(不是错字)。

Kudu 支持哪些操作系统?

运行 Kudu 需要 Linux。有关详细信息,请参阅安装指南。在 Kudu 0.6.0 和更新版本中支持 OSX 作为开发平台。Java 客户端可以在任何 JVM 7 平台上使用。

哪些基于 Linux 的操作系统已知不能与 Kudu 一起使用?

RHEL 5:内核缺少处理磁盘空间回收(例如打孔)的关键功能,并且无法运行使用 C 11 语言功能的应用程序。

Debian 7:附带 gcc 4.7.2,它会生成损坏的 Kudu 优化代码,并且对使用 C 11 语言功能的应用程序的支持不足。

SLES 11:无法运行使用 C 11 语言功能的应用程序。

如何备份我的 Kudu 数据?

从 Kudu 1.10.0 开始,Kudu 通过使用 Apache Spark 实现的作业支持完整和增量表备份。此外,它还支持通过使用 Apache Spark 实现的还原作业从完整备份和增量备份中还原表。有关详细信息,请参阅管理文档。

对于没有内置备份机制的旧版本,如果您有可用的 Impala,它可以提供帮助。您可以使用它使用以下语句将数据复制为 Parquet 格式:

INSERT INTO TABLE some_parquet_table SELECT * FROM kudu_table

然后使用distcp 将 Parquet 数据复制到另一个集群。

WAL事务日志可以用来搭建容灾站点吗?

目前,Kudu 不支持在站点之间传送或重放 WAL 的任何机制。

每个TableT或每张表是否有一个 WAL?

每个TableT有一个 WAL。

Kudu 的安全性如何处理?

Kudu 支持强身份验证,旨在通过利用 Kerberos 与其他安全的 Hadoop 组件进行互操作。它还支持客户端请求的粗粒度授权和服务器之间以及客户端与服务器之间通信的 TLS 加密。要了解更多信息,请参阅 安全指南。

Kudu 能容忍修改Schema吗?

是的,Kudu 提供添加、删除和重命名列/表的功能。目前无法就地更改列的类型,尽管这有望添加到后续的 Kudu 版本中。

是否有数据建模方面的最佳实践?

Kudu 表必须具有唯一的主键。Kudu 尚未使用包含大值(10 KB 或更高)的列进行测试,并且在使用大值时会出现性能问题。请参阅 架构设计。

Kudu 可以用来替代 Lambda 架构吗?

在许多情况下,Kudu 的实时和分析性能的结合将允许通过使用单个存储引擎来简化 Lambda 架构固有的复杂性。

有没有办法强制执行列表语句的顺序?(即在表 B 上一次插入后强制更新表 A)?

使用 Kudu API 时,用户可以选择进行同步操作。如果进行一系列同步操作,Kudu 保证按相应顺序分配时间戳。

我应该将 Kudu 用于 OLTP 类型的工作负载吗?从 OLTP 的角度来看,Kudu 与 Spanner 有何关联?

Kudu 受到 Spanner 的启发,它使用基于共识的复制设计和时间戳来进行一致性控制,但磁盘布局却大不相同。

Kudu 是为 OLAP 工作负载设计和优化的,缺乏支持 OLTP 所需的多行事务和二级索引等功能。

作为真正的列存储,Kudu 对 OLTP 的效率不如行存储。目前还有一些实施问题会影响 Kudu 在 Zipfian 发行版更新上的性能(参见 YCSB 结果在我们草稿论文的性能评估中。

我们预计未来的版本将继续提高这些工作负载的性能,但 Kudu 并非旨在完全替代所有工作负载的 OLTP 存储。请考虑其他存储引擎,例如 Apache HBase 或传统的 RDBMS。

可以创建多列索引吗?

Kudu 支持复合主键。目前不支持二级索引,无论是否复合。

Kudu 是否支持二级索引?

不,Kudu 不支持二级索引。只能通过主键进行随机访问。对于分析钻取查询,Kudu 具有非常快的单列扫描,这使得它在对小集群上的数十亿行进行查询时可以产生亚秒级的结果。

索引更新是否自动维护?

Kudu 的主键是自动维护的。目前不支持手动或自动维护的二级索引。

是否有像 Cassandra 那样分区键的概念(主索引和二级索引概念)?

Kudu 的主键可以是简单的(单列)或复合的(多列)。在任何TableT中,行都按主键的排序顺序写入。在复合键的情况下,排序由键中列的声明顺序决定。对于基于散列的分布,整个键的散列用于确定值将放入的“桶”。

无论使用哪种类型的分区,都可以仅基于主键列的子集进行分区。例如,“(host, timestamp)”的主键可以仅在时间戳列上进行范围分区。

Kudu 是否具有自动增量列、PK/FK 约束或内置索引等关系特性?

Kudu 表有一个主键,用于唯一性以及提供对单个行的快速访问。当前不支持自动递增列、外键约束和二级索引,但可以在后续 Kudu 版本中添加。

Kudu 是否支持多行事务?

不,Kudu 目前不支持多行事务。但是,单行操作在该行内是原子的。

Kudu 是否提供 ACID 合规性?

Kudu 旨在最终完全符合 ACID。但是,尚未实现多行事务。它目前提供的单行事务保证与 HBase 非常相似。

是否支持回滚概念?

Kudu 目前不支持事务回滚。

原文链接:https://kudu.apache.org/faq.html

0 人点赞