Apache Kafka是分布式发布-订阅消息系统,是一个消息中间件框架,
是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。
基本框架:
它的架构包括以下组件:
1、话题(Topic):是特定类型的消息流。消息是字节的有效负载(Payload),话题是消息的分类名或种子(Feed)名;
2、生产者(Producer):是能够发布消息到话题的任何对象;
3、服务代理(Broker):已发布的消息保存在一组服务器中,它们被称为代理(Broker)或Kafka集群;
4、消费者(Consumer):可以订阅一个或多个话题,并从Broker拉数据,从而消费这些已发布的消息;
5、 Zookeeper : Kafka使用zookeeper作为其分布式协调框架,很好的将消息生产、消息存储、消息消费的过程结合在一起
介绍一下这四者的关系:
1. Producer 如果生产了数据,会先通过 zookeeper 找到 broker,然后将数据存放到 broker
2. Consumer 如果要消费数据,会先通过 zookeeper 找对应的 broker,然后消费。
首先生产者向zookeeper注册一个话题(topic),zookeeper检查无误的话会发布这个话题(topic)给broker,然后生产者将数据推送到broker上的这个话题,消费者想要获取这个话题的数据的话需要先找到zookeeper 获取授权得到这个话题,然后向broker拉取数据,这样就完成了一个简单的推送与订阅过程.zookeeper类似于hdfs里面的namenode负责管理元数据不负责存储,broker负责存储数据
其中producer 到 broker 的过程是 : producer将数据主动推送到 broker
而consumer 到 broker 的过程是 :是通过 consumer 主动向broker拉取数据的,而不是 broker 把数据主动发送到 consumer 端的
kafka的特性:
(1)高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作;
(2)可扩展性:kafka集群支持热扩展;
(3)持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;
(4)容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败);
(5)高并发:支持数千个客户端同时读写;
(6)支持实时在线处理和离线处理:可以使用Storm这种实时流处理系统对消息进行实时进行处理,同时还可以使用Hadoop这种批处理系统进行离线处理;
关于Partition:
分区,或者说分组。分组是Kafka提升吞吐量的一个关键设计。这样可以让消费者多线程并行接收消息。创建Topic时可指定Parition数量。一个Topic可以分为多个Partition,也可以只有一个Partition。每一个Partition是一个有序的,不可变的消息序列。每一个消息在各自的Partition中有唯一的ID。这些ID是有序的。称之为offset,offset在不同的Partition中是可以重复的,但是在一个Partition中是不可能重复的。越大的offset的消息是最新的。Kafka只保证在每个Partition中的消息是有序的,就会带来一个问题,即如果一个Consumer在不同的Partition中获取消息,那么消息的顺序也许是和Producer发送到Kafka中的消息的顺序是不一致的。这个在后续会讨论。
安装配置:
下载: https://kafka.apache.org/downloads
解压:
tar -zxvf kafka_2.11-1.1.0.tgz
进入kafka的config文件夹
1. 配置Zookeeper :
在这里我们找到zookeeper.properties文件并将它拷贝一份:
下面俩种方法都可以,当然你也可以直接使用zookeeper.properties文件,但是我们为了保留默认文件所以就拷贝了一份
cat zookeeper.properties | grep -v [#*] >> zk.properties
cp zookeeper.properties zk.properties
接下来我们修改文件里面的dataDir,这个是将来zookeeper的信息的存储位置,你自己指定位置
例如:
dataDir=/home/hadoop/opt/kafka_2.11-1.1.0/zk_tmp
2. 配置broker
找到server.properties文件,同样的方法拷贝一份
cat server.properties | grep -v [#*] >> bk.properties
向里面加入一行:
# listeners=PLAINTEXT://:9092
这个指的是端口号为9092 ,这也是默认的端口,当然你也可以修改
注:这里配置broker的时候,每台机器上的broker保证唯一,从0开始。如:在另外2台机器上分别配置broker.id=1,broker.id=2,此时我配置的为单机模式
启动zookeeper
在kafka的目录下面输入下面命令
./bin/zookeeper-server-start.sh config/zk.properties
启动成功后复制一个渠道jps会发现QuorumPeerMain,它就是zookeeper的进程
启动kafka server
./bin/kafka-server-start.sh config/bk.properties
启动成功后复制一个渠道jps会发现Kafka,它就是broker的进程
create a topic
./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
--topic test 值的是创建了一个名为test的话题
查看topic
./bin/kafka-topics.sh --list --zookeeper localhost:2181
可以查看所有的话题topic
启动生产者
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
生产数据.比如 : hello word
启动消费者
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
此时你就会看到之前产生的数据hello word ,当然现在生产者可以继续产生数据,消费者可以继续拉取数据
如果你不想看之前的数据,你可以输入
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
--from-beginning 表示从开头开始看,其实它可以从任意一个偏移量开始看
flume连接kafka
监控文件夹
1. 首先修改flume的配置文件sink的参数
c1.sinks.log1.type = org.apache.flume.sink.kafka.KafkaSink # 类型为kafka
c1.sinks.log1.kafka.topic = test # 话题为 test
c1.sinks.log1.kafka.bootstrap.servers = localhost:9092 # 地址,端口
2. 保存启动flume
在flume目录下,输入下面代码
./bin/flume-ng agent -c ./conf -f ./conf/c1.conf -n c1 -Dflume.root.logger=INFO,console
3. 启动消费者
在kafka目录下,输入下面代码
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
4. 测试:
因为上面的flume为一个监控文件夹,所以我创建一个文件student.csv:
然后将这个文件移动到我监控的文件夹里面,在消费者窗口就看到了下图,所以我们的flume和kafka连接成功