关于 Kafka 主题的常见问题集。
Kafka 是一个流式消息平台。进一步分解一下:
“流媒体”:发布者(“生产者”)经常发送的大量消息(想想数万或数十万)。许多订阅者(“消费者”)经常进行消息轮询。
“消息”:从技术角度来看,键值对。从非技术角度来看,字节数相对较少(想想几百到几千字节)。
如果这不是您计划的用例,Kafka可能不是您正在寻找的解决方案。联系您最喜欢的 Cloudera 代表进行讨论和了解。最好事先了解您可以做什么和不可以做什么,而不是根据一些热情的任意供应商信息继续使用最终无法满足您期望的解决方案。
Kafka 在 LinkedIn 被设计为一个横向扩展的发布订阅系统。它在系统和消息级别提供了大量可配置性来实现这些性能目标。有充分记录的案例展示了当一切都做得正确时 Kafka 的扩展能力。
在不考虑权衡的情况下,很容易陷入 Kafka 可以用来做的所有事情。Kafka 配置也不是自动的。您需要了解每个用例,以确定可以使用哪些配置属性来为每个用例调整(和重新调整!)Kafka。
在配置时需要深入了解和小心的一些更具体的示例是:
Kafka 可以替代软件基础设施的消息队列和服务发现部分。然而,这通常以增加一些延迟以及需要监控新的复杂系统(即您的 Kafka 集群)为代价。
虽然 Kafka 确实有一种配置消息保留的方法,但它主要是为低延迟消息传递而设计的。Kafka 不支持通常与文件系统相关的功能(例如元数据或备份)。因此,建议改用某种形式的长期摄取,例如 HDFS。
Kafka 只是解决方案的一部分。在您充分利用它之前,有许多最佳实践需要遵循和支持工具来构建(请参阅这篇明智的LinkedIn 帖子)。
优步为他们的工程组织提供了一些数字。这些数字可以帮助您了解达到这种规模所需的条件:1300 台微服务器、2000 名工程师。
阅读Kafka Introduction和Kafka Architecture,其中涵盖了 Kafka 的基础知识和设计。这应该是一个很好的起点。如果您还有任何问题,请访问此常见问题解答或与您最喜欢的 Cloudera 代表讨论培训或最佳实践深入探讨。
分析数据库部署受益于 Kafka,将其用于数据摄取。然后,数据可以为各种分析工作负载填充表。对于临时 BI,实时方面不太重要,但能够利用实时应用程序、BI 和分析中使用的相同数据的能力是 Cloudera 平台提供的一个好处,因为您将拥有 Kafka 用于这两个目的,已经集成、安全、治理和集中管理。
Kafka 常用于实时的、任务关键型的操作数据库部署领域。它用于摄取数据并允许通过 Kudu 或 HBase 立即为其他应用程序和服务提供服务。在 Cloudera 平台中为操作数据库使用 Kafka 的好处是集成、安全、治理和集中管理。您可以避免孤立架构的风险和成本,并提供“另一种解决方案”来支持。
如果 Kafka 是存储消息的系统,那么消费者就是从 Kafka 读取这些消息的系统的一部分。
虽然 Kafka 确实附带了一个可以充当消费者的命令行工具,但实际上,您很可能会使用 KafkaConsumer API 为您的生产系统编写 Java 代码。
当消费者从 Kafka 集群读取时,生产者写入 Kafka 集群。
与消费者类似(请参阅上一个问题),您的生产者也是针对您的特定用例的自定义 Java 代码。
您的生产者可能需要对写入性能和 SLA 保证进行一些调整,但通常比您的消费者更简单(错误情况更少)。
获取有关可以在 Kafka Java 代码中调用哪些功能的更多信息的最佳方法是查看 Java 文档。并且仔细阅读!
LinkedIn 上有一篇 2014 年的旧博客文章,标题为:基准 Apache Kafka:每秒 200 万次写入(在三台便宜的机器上)。在“消息大小的影响”部分,您可以看到两个图表,它们表明 Kafka 吞吐量从 100 字节到 1000 字节的记录大小开始受到影响,并在 10000 字节左右触底。通常,保持主题特定并故意保持消息大小较小有助于您充分利用 Kafka。
摘自部署 Apache Kafka:实用常见问题解答:
如何通过 Kafka 发送大消息或有效载荷?Cloudera 基准测试表明,Kafka 达到了最大吞吐量,消息大小约为 10 KB。较大的消息显示吞吐量降低。但是,在某些情况下,用户需要发送远大于 10 KB 的消息。如果消息有效负载大小约为 100 MB,请考虑探索以下替代方案:如果共享存储可用(HDFS、S3、NAS),将大负载放在共享存储上,并使用 Kafka 发送带有负载位置的消息。通过在写入 Kafka 之前将大消息切分成更小的部分来处理大消息,使用消息密钥确保所有部分都写入同一分区,以便它们被同一个消费者使用,并从其部分重新组装大消息消费时。 |
---|
你有很多选择。Cloudera 提供以下两个问题中列出的培训。您还可以请您的常驻解决方案架构师深入了解 Kafka 架构和最佳实践。此外,您可以随时参与社区活动以获取有关特定主题的见解和专业知识。
Cloudera 培训为 Kafka 提供基本的按需培训,其中涵盖了 Kafka 架构、消息、排序的基础知识,以及旧版 Java API 的一些幻灯片(代码示例)。它还涵盖了使用 Flume + Kafka。有关更多信息,请参阅 Apache Kafka 简介
Kafka 开发人员培训包含在 Cloudera 的Apache Spark 和 Hadoop 开发人员培训中。
针对高级用户的有关 Kafka 主题的常见问题集。
和大多数开源项目一样,Kafka 提供了很多配置选项来最大化性能。在某些情况下,如何最好地将您的特定用例映射到这些配置选项并不明显。我们试图解决其中一些情况。
这是一个简单的问题,对您的整个 Kafka 设置有很多深远的影响。完整的答案包括接下来的几个相关常见问题解答及其答案。
在操作上,您需要确保您的 Kafka 集群满足以下硬件设置:
Kafka 希望在代理和 Zookeeper 节点之间建立可靠、低延迟的连接:
假设您遵循前两个问题的建议,则必须正确配置 Kafka 之外的实际系统。
以下对 Kafka 配置设置的建议使得数据丢失的发生极为困难。
如果您有 3 个以上的主机,您可以在需要更多数据丢失保护的主题上适当增加代理设置。
Kafka不保证永远不会发生数据丢失。有以下权衡:
除了上述设计权衡之外,还存在以下问题:
在您的主题配置了分区后,Kafka 将每条记录(基于键/值对)发送到基于键的特定分区。因此,对于任何给定的键,相应的记录在分区内都是“有序的”。
对于全局排序,您有两个选择:
相反,最好在设计 Kafka 设置时考虑 Kafka 的分区设计,而不是依赖于事件的全局排序。
为主题选择合适的分区数量是实现读写高度并行和分配负载的关键。在分区上均匀分布负载是获得良好吞吐量(避免热点)的关键因素。做出一个好的决定需要根据每个分区的生产者和消费者的预期吞吐量进行估计。
例如,如果您希望能够读取 1 GB/秒,但您的消费者只能处理 50 MB/秒,那么您至少需要 20 个分区和消费者组中的 20 个消费者。同理,如果要为生产者实现同样的效果,而1个生产者只能以100 MB/秒的速度写入,则需要10个分区。在这种情况下,如果您有 20 个分区,则可以保持 1 GB/秒的速度来生成和使用消息。您应该将分区的确切数量调整为消费者或生产者的数量,以便每个消费者和生产者实现其目标吞吐量。
所以一个简单的公式可以是:
#Partitions = max(NP, NC)
在哪里:
此计算为您提供了分区数的粗略指示。这是一个很好的起点。在系统就位后,请记住以下有关增加分区数量的注意事项:
通过监控消费者滞后,确保消费者不会落后于生产者。要检查消费者在消费者组中的位置(即他们落后于日志末尾多远),请使用以下命令:
$ kafka-consumer-groups --bootstrap-server BROKER_ADDRESS --describe --group CONSUMER_GROUP --new-consumer
回想一下关于Kafka的以下事实:
现在,您可能认为扩展意味着增加主题中的分区数量。但是,由于散列的工作方式,简单地增加分区数量意味着您将丢失“具有相同键的事件进入相同分区”这一事实。
鉴于此,有两种选择:
当新节点或磁盘添加到现有节点时,就会出现这种情况。分区不会自动平衡。如果一个主题已经有许多节点等于复制因子(通常为 3),那么添加磁盘无助于重新平衡。
kafka-reassign-partitions添加新主机后使用该命令是推荐的方法。
注意事项
使用此命令有几个注意事项:
Cloudera Manager 监控 Kafka 集群。
目前,还有三个 GitHub 项目提供额外的监控功能:
这些项目是 Apache 兼容的许可,但不是开源的(没有社区、错误归档或透明度)。
这group.id只是一个字符串,可以帮助 Kafka 跟踪哪些消费者是相关的(通过具有相同的组 ID)。
这通常是使用kafka-consumer-groups命令行工具完成的。直接从上游文档复制,我们有这个示例输出(重新格式化以提高可读性):
$ bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-group
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
my-topic 0 2 4 2 consumer-1-69d6 /127.0.0.1 consumer-1
my-topic 1 2 3 1 consumer-1-69d6 /127.0.0.1 consumer-1
my-topic 2 2 3 1 consumer-2-9bb2 /127.0.0.1 consumer-2
在一般情况下,如果一切都与一个特定的话题很顺利,每个消费者的 CURRENT-OFFSET应达最新或即将更新到最新与 LOG-END-OFFSET。通过此命令,您可以确定特定主机或特定分区是否在跟上数据速率方面存在问题。
这也是使用kafka-consumer-groups命令行工具完成的。这通常是一种管理功能,用于绕过损坏的记录、数据丢失或从代理或主机的故障中恢复。除了这些特殊情况外,不建议为此目的使用命令行工具。
通过使用--execute --reset-offsets标志,您可以根据每个分区日志的开始/结束或固定时间戳将消费者组(甚至所有组)的消费者偏移更改为特定设置。键入kafka-consumer-groups不带参数的 命令将为您提供完整的帮助输出。
Mirror Maker 是从源 Kafka 集群到目标 Kafka 集群的一个或多个主题的单向复制。鉴于 Mirror Maker 的这种限制,您需要运行两个实例,一个从 A 复制到 B,另一个从 B 复制到 A。
此外,请考虑以下事项:
使用较新版本的 Kafka,消费者可以通过两种方式与代理进行通信。
调整 Kafka 集群的大小有几个注意事项。
磁盘空间将主要由您的 Kafka 数据和代理日志组成。在调试模式下,代理日志会变得非常大(10 到 100 GB),因此保留大量空间可以为您节省一些未来的麻烦。
对于 Kafka 数据,您需要对消息大小、主题数和冗余进行估计。还请记住,您将对 Kafka 的数据使用 RAID10,因此您的一半硬盘将用于冗余。从那里,您可以计算需要多少驱动器。
通常,您希望拥有比驱动器数量建议的最少数量更多的主机。这为增长和一些可扩展性留下了空间。
一个节点适用于测试集群。三是大多数 Kafka 集群的标准。在大规模上,五个节点对于可靠性来说是相当普遍的。
这可能是具有最高可变性的指标。如果任何 Kafka 代理有太多的领导分区,它都会过载。在最坏的情况下,每个领导分区都需要高带宽、高消息速率,或两者兼而有之。对于其他主题,领导者分区将是经纪人可以处理的一小部分(受软件和硬件的限制)。要估计每个主机的平均值,请尝试按分区数据吞吐量要求对主题进行分组,例如 2 个高带宽数据分区、4 个中带宽数据分区、20 个小带宽数据分区。从那里,您可以确定需要多少主机。
我们有两篇关于在 Flume 中使用 Kafka 的博文:
您需要设置开发环境以使用 Spark 库和 Kafka 库:
从那里,您应该能够使用 KafkaConsumer 类读取数据并使用 Spark 库进行实时数据处理。博客文章从 Apache Kafka 安全地读取数据到 Apache Spark有一个指向包含字数示例的 GitHub 存储库的指针。
有关更多背景信息,请阅读博客文章使用 Apache Hadoop 进行近实时数据处理的架构模式。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/7.1.6/kafka-overview/topics/kafka-overview-faq.html