kafka入门

1.基本概念

Kafka™是一个分布式流平台(distributed streaming platform),它可以建立实时流数据管道从而能够可靠地在系统或应用程序之间的共享数据,可以构建实时流应用程序,能够对数据进行相应的处理。

1、集群(Cluster):
Kafka是运行在一个或多个服务器(broker)的集群上的。客户端和服务器之间的通信靠一个简单的,高性能的,与语言无关的TCP协议完成。

2、主题(topic):Topics and Logs

主题是给一类一系列记录的名义上的名字。Kafka的主题始终是支持多用户订阅的;也就是说,一个主题可以有任意多个消费者订阅写入的数据。

对于每一个主题,Kafka集群保持一个分区(partition)日志文件,如图:

 

 

3、分布式文件系统(Distribution):

partition会被分布在各个Server节点上,同时它们中间又有一个leader,它会处理所有的读写请求,其他followers会复制leader上的数据信息,一旦当leader因为某些故障而无法提供服务后,就会有一个follower被推举出来成为新的leader来处理这些请求。

4、异地备份(Geo-Replication):

Kafka利用MirrorMaker来实现异地备份,用于集群中数据的备份和恢复,用户只需简单的进行相应配置备份的副本数(--replication-factor)即可。

5、副本(--replication-factor复制因子):

对于有N个副本的主题,kafka可以承受最多N-1次服务器故障切换而不会损失任何的已经保存的记录。

6、生产者:(Producers):

向broker发布消息的应用程序,允许应用程序发布记录流至一个或多个Kafka的话题(Topics)。

生产者负责选择把记录分配到主题中的哪个分区,通常使用轮询算法来简单分配。

7、消费者:(Consumers):

从消息队列中请求消息的客户端应用程序。

每个消费者会订阅一个主题,每个发布到主题的消息都会发送给订阅了这个主题的消费群(Consumer group)里面的一个消费者的一个实例。

Kafka消费群的实现方式是通过分割日志的分区(partitions),分给每个Consumer实例,使每个实例在任何时间点的都可以“公平分享”独占的分区。维持消费群中的成员关系的这个过程是通过Kafka动态协议处理。如果新的实例加入该组,他将接管该组的其他成员的一些分区; 如果一个实例死亡,其分区将被分配到剩余的实例。若消费者数大于分区数,则将会出现部分消费者得不到消息分区,出现空闲的情况.
8、服务端(broker):

用来接收生产者发送的消息并将这些消息路由给服务器中的队列,便于kafka将生产者发送的消息,动态的添加到磁盘并给每一条消息一个偏移量,所以对于kafka一个broker就是一个应用程序的实例

9、分区(partition):

每个分区是一个有序的,不可变的消息队列,新的消息不断追加到这个有组织的有保证的日志末尾。

不同消费者对同一分区的消息读取互不干扰,消费者可以通过设置消息位移(offset)来控制自己想要获取的数据,比如可以从头读取,最新数据读取,重读读取等功能。

10、偏移量(offset):

该分区中的每个记录的唯一标识,从0递增。

保留在每个消费者元数据中的最基础的数据就是消费者正在处理的当前记录的偏移量(offset)或位置(position)。这种偏移是由消费者控制:通常偏移会随着消费者读取记录线性前进,但事实上,因为其位置是由消费者进行控制,消费者可以在任何它喜欢的位置读取记录。例如,消费者可以恢复到旧的偏移量对过去的数据再加工或者直接跳到最新的记录,并消费从“现在”开始的新的记录。

 

2.基本操作

1、启动kafka

启动kafka之前需要先启动zookeeper。ZooKeeper用于管理、协调Kafka代理。每个Kafka代理都通过ZooKeeper协调其它Kafka代理。当Kafka系统中新增了代理或者某个代理故障失效时,ZooKeeper服务将通知生产者和消费者,生产者和消费者据此开始与其它代理协调工作。新版本kafka内置zookeeper。

bin/zookeeper-server-start.sh config/zookeeper.properties

然后启动进入kafka安装目录启动kafka

bin/kafka-server-start.sh config/server.properties

 

2、创建话题

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

--zookeeper 配置zookeeper服务位置

--replication-factor 配置副本数

--partitions 配置分区数

--topic 配置主题名字

3、启动生产者和消费者

生产者

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
消费者
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

可以启动多个消费者消费同一个topic,也可以多个生产者向同一个topic发送数据。

 

4、设置集群

broker的配置文件为config/server.properties

新建配置文件编辑

config/server-1.properties:
broker.id=1 服务端编号
listeners=PLAINTEXT://:9093 使用的端口号
log.dir=/tmp/kafka-logs-1 日志文件存放位置

分别启动就可以新增节点。

使用bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test 命令查看主题下每个分区的信息。

“Leader”,负责指定分区所有读取和写入的节点。每个节点将是一部分随机选择的分区中的领导者。

“Replicas”是此分区日志的节点列表集合,不管这些节点是否是领导者或者只是还活着(不在in-sync状态)。

“ISR”是一组”in-sync” 节点列表的集合。这个列表包括目前活着并跟leader保持同步的replicas,Isr 是Replicas的子集。

 

5、使用Kafka Connect导数据

Kafka Connect是包括在Kafka中一个工具,用来导入导出数据到Kafka。它是connectors的一个可扩展工具,其执行定制逻辑,用于与外部系统交互。在这个快速入门,我们将看到如何使用Kafka Connect做一些简单的连接器从一个文件导入数据到Kafka的主题,和将主题数据导出到一个文件。

首先,我们需要在安装目录下创建一些原始数据来开始测试:

echo -e "testline1\testline2" >test.txt

然后启动连接器:

bin/connect-standalone.sh config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties
config/connect-standalone.properties 是Kafka连接过程中的公共配置;
config/connect-file-source.properties是源连接器,从输入文件中读取每行的内容,发布到的Kafka主题;
config/connect-file-sink.properties是sink连接器,负责从Kafka主题读取消息,生产出的消息按行输出到文件。

通过echo "testline3" >> test.txt向文件末尾添加信息也将由连接器将数据生产到主题

 

6、使用Kafka Streams处理数据

官方示例代码实现单词计数算法,计算输入文本中一个单词的出现次数。可以跟踪和更新单词的计数。承担潜在的无界输入数据的处理,它会周期性地输出其当前状态和结果,同时继续处理更多的数据

https://github.com/apache/kafka/blob/0.10.2/streams/examples/src/main/java/org/apache/kafka/streams/examples/wordcount/WordCountDemo.java

 

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic streams-file-input

创建file-input.txt文件作为输入

然后创建消费者来消费该文件

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic streams-file-input < file-input.txt

运行示例程序,输出单词统计结果到新主题“streams-wordcount-output”

 

bin/kafka-run-class.sh org.apache.kafka.streams.examples.wordcount.WordCountDemo

查看消费者“streams-wordcount-output”即看到统计结果:

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 \

--topic streams-wordcount-output \

--from-beginning \

--formatter kafka.tools.DefaultMessageFormatter \

--property print.key=true \

--property print.value=true \

--property key.deserializer=org.apache.kafka.common.serialization.StringDeserializer \

--property value.deserializer=org.apache.kafka.common.serialization.LongDeserializer

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值