小记---------kafka理论及命令行操作

kafka-0.10.1.X版本之前: auto.offset.reset 的值为smallest,和,largest.(offest保存在zk中)
 
kafka-0.10.1.X版本之后: auto.offset.reset 的值更改为:earliest,latest,和none (offest保存在kafka的一个特殊的topic名为:__consumer_offsets里面)
 
如果存在已经提交的offest时,不管设置为earliest 或者latest 都会从已经提交的offest处开始消费
 
如果不存在已经提交的offest时,earliest 表示从头开始消费,latest 表示从最新的数据消费,也就是新产生的数据.
 
none topic各分区都存在已提交的offset时,从提交的offest处开始消费;只要有一个分区不存在已提交的offset,则抛出异常
 
 
 
简介
kafka对消息保存时根据Topic进行归类,发送消息者成为producer,消息接受者成为consumer,此外kafka集群有多个kafka实例组成,每个实例()成为broker,无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta
 
Topic(主题、专题) & Partition(分区)
    消息发送时都被发送到一个topic,其本质就是一个目录,而topic是由一些partition Logs(分区日志)组成,其组织结构如下图所示
每个partition的消息都是有序,生产的消息被不断追加到Partition log上,其中的每个消息都被赋予了一个唯一的offset值(偏移值;如果设置offset值为9,那么消费者会从offset值是9的位置开始读取数据)
kafka集群会保存所有的消息,不管消费没有消费都会一直存在;除非消息超过了设定的消息过期时间,才会被自动清除以释放磁盘空间。
 
Kafka核心组件 Replications(复制)、Partitions(分区) 和Leaders(领袖)
  • kafka中的数据是持久化并容错的,允许每个topic设置副本数量(Replications)副本数量决定了有几个broker(节点(机器))来存放写入的数据,(如果你的副本数量设置3.那么一份数据就会被存放在3台不同的机器上)一般推荐副本数量至少为2
  • kafka中的topic是以partition形式存放的,每一个topic都可以设置它的partition数量,partition的数量决定了组成topic的log的数量,producer在生产数据时,会按照一定规则(这个规则也可以是自定义的)把消息发布到topic的各个partition中,上面的副本都是以partition为单位,不过只有一个partition的副本会被选举成leader作为读写用(随机选举)
  • 关于如何设置partition值需要考虑的因素,一个partition只能被一个消费者消费(一个消费者可以同时消费多个partition)因此,如果设置的partition的数量小于consumer的数量,就会有消费者消费不到数据,所以推荐partition的数量一定要大于同时运行的consumer数量。建议partition的数量大于集群broker的数量,这样leader partition可均匀分布在各个broker,使负载均衡
 
kafka核心特性
  • 压缩;kafka支持以集合为单位发送消息,在此基础上,kafka还支持对消息集合进行压缩,Producer端可以通过GZIP或Snappy格式对消息集合进行压缩。好处就是减少传输的数据量,减轻对网络传输的压力
  • 消息可靠性;
  • 从Producer端:当发送一个消息后,Producer端会等待broker成功接收到消息的反馈之后,才进行传输下一个消息。如果消息在途中丢失或是其中一个broker挂掉,Producer会重新发送;
  • 从Consumer端:broker端记录了partition中的一个offset值,这个值指向Consumer下一个即将消费message。当Consumer收到了消息,但却在处理过程中挂掉,此时Consumer可以通过这个offset值重新找到上一个消息再进行处理。Consumer还有权限控制这个offset值,对持久化到broker端的消息做任意处理
  • 备份机制:提高了kafka集群的可靠性,稳定性。kafka运行集群中的节点挂掉后而不影响整个集群工作,一个备份数量为n的集群运行n-1个节点失败,在所有节点中,有一个节点作为lead节点,这个节点保存了其他备份节点列表,并维持各个备份间的状态同步
 
消息队列(Message Queue)
 消息:网络中的两台计算机或者两个通讯设备之间传递的数据。例如说:文本、音乐、视频等内容。  
 
队列:一种特殊的线性表(数据元素首尾相接),特殊之处在于只允许在首部删除元素和在尾部追加元素。入队、出队。  
 
消息队列:顾名思义,消息+队列,保存消息的队列。消息的传输过程中的容器;主要提供生产、消费接口供外部调用做数据的存储和获取。
 
MQ分类:点对点(P2P)、发布订阅(Pub/Sub)
共同点: 消息生产者生产消息发送到queue中,然后消息消费者从queue中读取并且消费消息。 
不同点: P2P模型包含:消息队列(Queue)、发送者(Sender)、接收者(Receiver) 一个生产者生产的消息只有一个消费者(Consumer)(即一旦被消费,消息就不在消息队列中)。打电话。 Pub/Sub包含:消息队列(Queue)、主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 每个消息可以有多个消费者,彼此互不影响。比如我发布一个微博:关注我的人都能够看到。
 
kafka优点
高吞吐量:可以满足每秒百万级别消息的生产和消费
持久性:有一套完善的消息存储机制,确保数据的高效安全的持久化
分布式:基于分布式的扩展,和容错机制,kafka的数据都会赋值到几台服务器上,当某一台故障失效时,生产者和消费者转而使用其它的机器
作用:用于处理活跃的数据(登录、浏览、点击、分享、喜欢等用户行为产生的数据)
 
kafka服务:
Topic:主题,kafka处理的消息的不同分类
Broker:消息的代理,Kafka集群中的一个kafka服务节点称为一个broker,主要存储消息数据,存在硬盘中每个topic都是有分区的
Partition:topic物理上的分组(分区)
Message:消息(数据)。通信的基本单位,每个消息都属于一个partition
 
多个Message组合成Partition组合成Topic组合成Broker
 
kafka服务相关:
zookeeper:协调kafka的正常运行(在启动kafka必须先启动zookeeper,并且每台机器都必须启动
zkServer.sh start
zkServer.sh stop                                    
 
Producer:消息和数据的生产者,向kafka的一个topic发布消息
 
Consumer:消息和数据的消费者,订阅topic并处理其发布的消息
 
启动kafka:
kafka-server-start.sh /usr/local/hadoop/kafka_2.11-0.8.2.2/config/server.properties
后台启动kafka:
 kafka-server-start.sh /usr/local/hadoop/kafka_2.11-0.8.2.2/config/server.properties 1>/dev/null 2>&1 & (后台启动) 
守护进程kafka:
kafka-server-start.sh -daemon /usr/local/hadoop/kafka_2.11-0.8.2.2/config/server.properties 
停止: 
kafka-server-stop.sh

 

 
增:
新增一个topic:“hello”,为它分配一个分区(3个区),保存二个副本
kafka-topics.sh --create --zookeeper 192.168.20.10:2181 --replication-factor 2 --partitions 3 --topic topic名字
#######replication-factor不能大于broker数

 

查:
查询hello的信息【不加topic是查询所有的topic的详情】
kafka-topics.sh --describe --zookeeper 192.168.20.10:2181 --topic topic名字
所有可以使用的topic 
kafka-topics.sh --list --zookeeper 192.168.20.10:2181 

 

改:
修改hello为2个分区   alter:修改partition数(只能增加)
 kafka-topics.sh --alter --zookeeper 192.168.20.10:2181 --partitions 4 --topic topic名字

 

删:
删除world的topic kafka-topics.sh --delete --zookeeper 192.168.20.10:2181 --topic topic名字
 #是否开启topic的删除功能:默认为false。 如果要开启删除topic 开关 
在kafka/conf/server.properties 里的最后一行添加: delete.topic.enable=true
创建生产者 producer
必须的参数: 
broker-list:kafka的服务地址[多个用逗号隔开]、
topic:具体的单个topic 
 
kafka-console-producer.sh --broker-list 192.168.20.10:9092 --topic topic名字

创建消费者 consumer 

必须的参数: Zookeeper:
kafka的zk集群地址; Topic\whitelist\blacklist: 
1、具体的单个topic 
2、多个白名单topic字符串[逗号隔开]。 
3、多个黑名单topic字符串[逗号隔开]。 
kafka-console-consumer.sh --zookeeper 192.168.20.11:2181 --topic topic名字 --from-beginning 
 
标记删除的topic也可以使用。
--topic  t1,t2表示只消费t1,t2主题 
kafka-console-consumer.sh --whitelist t1,t2 –zookeeper 192.168.20.10:2181,192.168.20.11:2181 --from-beginning --topic 
 t1,t2表示除过t1,t2主题之外消费所有主题 
kafka-console-consumer.sh --blacklist t1,t2 --zookeepershb01:2181,192.168.79.139:2181 --from-beginning
 
broker:配置文件server.properties
1.为了减少磁盘写入的次数,broker会将消息暂时buffer(加载到缓存)起来,当消息的个数达到一定阀值或者过了一定的时间间隔时,再flush到磁盘,这样减少了磁盘IO调用的次数。
配置:Log Flush Policy
#log.flush.interval.messages=10000 (字节)    一个分区的消息数阀值
 #log.flush.interval.ms=1000  (毫秒)
 
2、kafka的消息保存一定时间(通常为7天)后会被删除。配置:Log Retention Policy 
log.retention.hours=168 (小时)
 #log.retention.bytes=1073741824(字节) log.retention.check.interval.ms=300000(毫秒)
 
Producer:配置文件:producer.properties
1、异步或者同步发送 
配置项:producer.type 
异步或者同步发送 
        同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据的通讯方式。   
        异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据的通讯方式。 
2、批量发送可以很有效的提高发送效率。 Kafka producer的异步发送模式允许进行批量发送,先将消息缓存在内存中,然后一次请求批量发送出去。 
具体配置queue.buffering.max.ms、queue.buffering.max.messages。 
默认值分别为5000和10000
 
 
为什么设置group
同样是逻辑上的概念,是Kafka实现单播和广播两种消息模型的手段。同一个topic的数据,会广播给不同的group;同一个group中的worker,只有一个worker能拿到这个数据。换句话说,对于同一个topic,每个group都可以拿到同样的所有数据,但是数据进入group后只能被其中的一个worker消费。group内的worker可以使用多线程或多进程来实现,也可以将进程分散在多台机器上,worker的数量通常不超过partition的数量,且二者最好保持整数倍关系,因为Kafka在设计时假定了一个partition只能被一个worker消费(同一group内)。
 
 
posted @ 2019-10-08 10:41  二黑诶  阅读(553)  评论(0编辑  收藏  举报