快速了解Kafka

2019-03-04 07:45|来源: 网路

什么是kafka

kafkaLinkedIn开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目。在它的主页描述kafka为一个高吞吐量的分布式(能将消息分散到不同的节点上)MQKafka仅仅由7000Scala编写,据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。

kafka目前支持多种客户端语言:javapythonc++php等等。

kafka集群的简要图解如下,producer生产消息,consumer消费消息:




kafka设计目标

高吞吐量是其核心设计之一。

数据磁盘持久化:消息不在内存中cache,直接写入到磁盘,充分利用磁盘的顺序读写性能。

zero-copy:减少IO操作步骤。

支持数据批量发送和拉取。

支持数据压缩。

Topic划分为多个partition,提高并行处理能力。



kafka名词解释和工作方式

Producer:消息生产者,就是向kafka broker发消息的客户端

Consumer:消息消费者,向kafka broker取消息的客户端

Topic:可以理解为一个队列。

Consumer GroupCG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CGtopic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个CG只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic

Broker:一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic

Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的idoffset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。

Offsetkafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka



kafka和zookeeper的关系

Producer端使用zookeeper用来"发现"broker列表,以及和Topic下每个partition leader建立socket连接并发送消息.

Broker端使用zookeeper用来注册broker信息,已经监测partition leader存活性.

Consumer端使用zookeeper用来注册consumer信息,其中包括consumer消费的partition列表等,同时也用来发现broker列表,并和partition leader建立socket连接,并获取消息.



kafka系统扩展性

kafka使用zookeeper来实现动态的集群扩展,不需要更改客户端(producerconsumer)的配置。broker会在zookeeper注册并保持相关的元数据(topicpartition信息等)更新。

而客户端会在zookeeper上注册相关的watcher。一旦zookeeper发生变化,客户端能及时感知并作出相应调整。这样就保证了添加或去除broker时,各broker间仍能自动实现负载均衡。



相关问答

更多
  • 你的问题在于如何让一个程序一直在后台运行,还是只是窗口运行, (1)如果要kafka进程一直常驻并且在后台不关闭,启动如下: cd /home/kafka/kafka_2.10-0.9.0.0/ nohup bin/kafka-server-start.sh config/server.properties & (2)如果只是想窗口运行,启动如下: cd /home/kafka/kafka_2.10-0.9.0.0/ bin/kafka-server-start.sh config/server.prope ...
  • 不可以,kafka必须要依赖一个zookeeper集群才能运行。kafka系群里面各个broker都是通过zookeeper来同步topic列表以及其它broker列表的,一旦连不上zookeeper,kafka也就无法工作。
  • kafka 停止[2022-07-06]

    脚本应该是放在 /etc/init.d/ 目录下吧 例如 /etc/init.d/kafka-server stop 或是你把 kafka-server-stop.sh 内容贴上来看看
  • 为什么是kafka[2022-10-06]

    主要是为了数据的安全。因为分布式数据库相当于单独存在的个体,一旦发生意外也只影响到局部数据库。另外,当数据传送时,可以减轻中心服务器的压力。具体的看下面: 分布式数据库系统通常使用较小的计算机系统,每台计算机可单独放在一个地方
  • 当您运行> bin/kafka-console-consumer.sh命令时,kafka加载一个ConsoleConsumer ,它将尝试使用自动生成的消费者标识创建消费者。 Kafka生成消费者ID的方式是将本地主机的名称连接到它。 所以,在这个问题上,事实上,Java无法解决我正在使用的Open Stack VM上本地主机的IP地址。 所以答案是Open Stack VM将本地主机名解析为kafka ,这是VM的名称。 我把卡夫卡和Zookeeper实例中的所有设置都设置为kafka1 。 所以,当ja ...
  • Spring集成Kafka 2.0构建于Spring Kafka之上(Spring Integration Kafka 1.x直接使用0.8.xx scala客户端)。 Spring Integration Kafka的文档在Spring Kafka参考手册的第5章中 。 在某些时候,spring-integration-kafka可能会被纳入主要的Spring集成项目/文档中。 Spring Integration Kafka 2.0 is built on top of Spring Kafka (Sp ...
  • 问题是bin / kafka-server-start.sh脚本使用bin / kafka-run-class.sh来执行生成的jar文件。 该脚本具有硬编码版本,因此您需要像这样定制它: ... library=$(echo "$ivyPath/org.scala-lang/scala-library/jars/scala-library-2.9.2.jar") CLASSPATH=$CLASSPATH:$library compiler=~$(echo "$ivyPath/org.scala-lang ...
  • 您了解微批处理与流处理是正确的。 你也是对的,所有这三个系统都使用由Kafka提供的标准Java消费者以无限循环的方式提取数据进行处理。 主要区别在于,Spark需要为其处理的每个微批处理安排一项新工作。 而且这种调度开销相当高,因此Spark无法处理非常低的批处理间隔,例如100ms或50ms,因此吞吐量对于这些小批量来说会降低。 Flink和Storm都是真正的流媒体系统,因此在启动时只部署一次作业(并且作业持续运行,直到用户明确关闭),因此他们可以处理每个单独的输入记录,而无需开销和非常低的延迟。 此 ...
  • 请参阅dstream.foreachRDD ,它是一个功能强大的原语,允许将数据发送到外部系统。 使用foreachRDD的设计模式 下面是我的kafka集成代码供您参考( 未优化,仅针对POC,KafkaProducer对象可以在foreachRDD中重用 ): DStream.foreachRDD(rdd => { rdd.foreachPartition { partitionOfRecords => val kafkaProps = new Properties() ...
  • 您从下载页面下载了kafka-0.8.1-src.tgz。 快速入门链接上的说明适用于二进制下载。 从http://kafka.apache.org/downloads.html页面的二进制下载部分下载一个。 现在试试。它应该工作。 或者,如果您想从您下载的src.tgz包构建,请运行./gradlew jar 。 它将下载所有必需的依赖项。 You downloaded kafka-0.8.1-src.tgz from download page. The instructions on quicksta ...