Fb137fdcde69fcb36928518bc762743c
消息系统--kafka

前言

在大数据机器学习风控项目中我们介绍了整个项目的流程,其中的数据采集流程是这样的,通过logstash监控日志文件目录,当有日志记录增加的时候,会触发事件,把日志记录写入到kafka中。

logstash--->kafka

上篇文章数据采集组件logstash一文中我们已经介绍了这个小流程中的日志搜集处理组件logstash,这篇文章我们就来介绍下这个小流程中涉及到的另外一个组件:消息系统组件kafka。

kafka概述

  • Kafka最初是由Linkedin公司开发的一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统
  • 底层用scala语言编写
  • Linkedin于2010年把此项目贡献给了Apache基金会并成为顶级开源项目 # kafka概览图 # kafka常用专业术语(简易的理解)链接提示
  • Broker:一台kafka服务器就是一个broker,一个kafka集群由多个broker(服务器)组成
  • Topic:每条发布(生产)到Kafka集群的消息(Message)都有一个类别,这个类别被称为Topic
  • Partition:即分区。一个Topic将由多个分区组成,每个分区里面存储有这个Topic的一部分消息(Message)
  • Producer:消息(Message)的生产者,生产消息发布到Kafka Broker
  • Consumer:消息消费者
  • Consumer Group:即消费组。一个消费组是由一个或者多个Consumer组成的 # Kafka的单机安装 step1: 下载地址:https://kafka.apache.org/downloads step2: 解压 tar -xzf kafka_2.12-1.0.0.tgz cd kafka_2.12-1.0.0 step3:启动zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties step4:启动kafka server bin/kafka-server-start.sh config/server.properties< 安装比较简单,这样就结束了 # Kafka的常用命令 1:创建kafka topic(先创建我们项目中的举例的那个topic:testTopic) bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic testTopic --partitions 1 --replication-factor 1 partitions:指定topic的分区数量 replication-factor:指定topic的备份数量 &emsp;--zookeeper:指定Azkaban的ip和端口 2:查看所有topic列表 <pre>bin/kafka-topics.sh --zookeeper localhost:2181 --list</pre> 3:控制台向topic生产数据 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic testTopic --broker-list:指定broker列表机器的ip,端口,多台用逗号分开 4:控制台消费topic的数据 bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic testTopic --from-beginning --from-beginning:指定从topic头开始消费

以上属于简单了解使用,如果只需简单了解和使用,以下部分可以不用看
1. 为什么kafka的性能和数据量无关?

kafka依赖文件系统去存储和缓存消息,数据的持久化是通过将数据追加到文件中实现,读的时候从文件中固定的offset开始读,这样读和写都是O(1),因此性能和数据的大小没有关系了

2. kafka消息传输的事物机制

数据传输的事务定义通常有以下三种级别:

  • 最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输。
  • 最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输.
  • 精确的一次(Exactly once): 不会漏传输,也不会重复传输,每个消息都被传输一次而且仅仅被传输一次>。

大家都知道,kafka的生产者(producer)生产消息,并发布到Broker上,消费者(Consumer)从broker上消费并处理消息,所以我们要分两个方面来看待kafka的消息传输事物机制。
第一部分是producer生产消息发布到broker上:这部分Kafka允许producer灵活的指定级别。比如producer可以指定必须等待消息被提交的通知,或者完全的异步发送消息而不等待任何通知,或者仅仅等待leader声明它拿到了消息(至于followers有没有成功从leader copy成功消息不关注)。
第二部分是consumer消费处理消息:consumer维护自己消费的消息的offset(偏移量),如果consumer不会崩溃当然可以在内存中保存这个值,当然谁也不能保证这点。如果consumer崩溃了,会有另外一个consumer接着消费消息,它需要从一个合适的offset继续处理。这种情况下可以有以下选择:

  • consumer可以先读取消息,然后将offset写入日志文件中,然后再处理消息。这存在一种可能就是在存储offset后还没处理消息就crash了,新的consumer继续从这个offset处理,那么就会有些消息永远不会被处理,这就是上面说的"最多一次"。
  • consumer可以先读取消息,处理消息,最后记录offset,当然如果在记录offset之前就crash了,新的consumer会重复的消费一些消息,这就是上面说的"最少一次"
  • "精确一次"可以通过将提交分为两个阶段来解决:保存了offset后提交一次,消息处理成功之后再提交一次。还有个更简单的做法:将消息的offset和消息被处理后的结果保存在一起 ##### 3. kafka的consumer为什么是从broker拉取消息,而不是broker推送消息到consumer?
  • broker不知道下游consumer的消费能力,如果推送消息的速率大于consumer的消费能力,容易引起consumer崩溃,如果推送速率较低,将会造成性能的不完全利用
  • Pull模式下,consumer就可以根据自己的消费能力去决定拉取的频率和每次拉取的消息量 ### 欢迎指正 邮箱如下: 13685858411@139.com 15988101848@139.com 上一篇:数据采集组件之logstash
© 著作权归作者所有
这个作品真棒,我要支持一下!
机器学习、深度学习、大数据、数据科学爱好者集结地,分享 在各自领域里的工程实践经验和应用 让我们每天进步一点点...
0条评论
top Created with Sketch.