Kafka ,是一个分布式、支持分区的(partition)、多副本的(replica),高吞吐量的基于zookeeper协调的分布式消息系统
应用场景:
1)构建实时的流数据管道,可靠地获取系统和应用程序之间的数据。
2)构建实时流的应用程序,对数据流进行转换或反应。
kafka四个核心
1)producer:生产者。
2)consumer:消费者。
3)topic: 给消息打一个标签,消息以topic为类别记录,Kafka将消息种子(Feed)分门别类,每一类的消息称之为一个主题(Topic)。
4)broker:以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个broker;消费者可以订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。
每个消息(也叫作record记录,也被称为消息)是由一个key,一个value和时间戳构成。
(一个kafka相当于一个broker,kafka集群即broker集群)
kafka四个核心API介绍
1)使用producer API发布消息到1个或多个topic中
2)使用consumer API来订阅一个或者多个topic,并处理产生在其中的消息
3)使用streams API充当一个流处理器,从1个或多个topic消费输入流,并产生一个输出流到1个或多个topic,有效地将输入流转换到输出流。
4)使用connector API允许构建或运行可重复使用的生产者或消费者,将topic链接到现有的应用程序或数据系统。
由于kafka基于zookeeper协调,所以需先配置zookeeper环境
--kafka 单节点单broker
配置文件 conf/server.properties
需要修改的地方
broker.id=0 唯一INT
liseners 监听的端口 默认9092
host.name 当前机器
log.dirs 日志路径
zookeeper.connect
创建topic和消费消息是跟zookeeper打交道,生成消息是和broker-list打交道
启动kafka
kafka-server-start.sh $KAFKA_HOME/config/server.properties
创建topic
kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic hello_test
查看当前的zookeeper有多少个topic
kafka-topics.sh --list --zookeeper localhost:2181
查看topic的详细信息
kafka-topics.sh --describe --zookeeper localhost:2181
生产者生产broker发送消息到某个topic中,数据发送到kafka监听的端口
kafka-console-producer.sh --broker-list localhost:9092 --topic hello_test
消费者读取消费zookeeper中topic的消息
kafka-console-consumer.sh --zookeeper localhost:2181 --topic hello_test --from-beginning
--kafka 单节点多broker
配置多个配置文件
server-1.properties
server-2.properties
config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://:9093
log.dir=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://:9094
log.dir=/tmp/kafka-logs-2
后台启动(-daemon)kafka
kafka-server-start.sh -daemon $KAFKA_HOME/config/server-1.properties &
kafka-server-start.sh -daemon $KAFKA_HOME/config/server-2.properties
创建topic
kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 2 --partitions 1 --topic more_repl
发送消息
kafka-console-producer.sh --broker-list localhost:9093,localhost:9094 --topic more_repl
消费消息
kafka-console-consumer.sh --zookeeper localhost:2181 --topic more_repl --from-beginning
--kafka 整合 flume
配置flume的agent文件
confA:exec source + memory channel + avro sink
confB:avro source + memory channel + kafka sink
confA:exec-memory-avro.conf
#Name the components on this agent
exec-memory-avro.sources = exec-source
exec-memory-avro.sinks = avro-sink
exec-memory-avro.channels = memory-channel
# Describe/configure the source
exec-memory-avro.sources.exec-source.type = exec
exec-memory-avro.sources.exec-source.command = tail -F /home/hadoop/data/data.log
exec-memory-avro.sources.exec-source.channels = /bin/sh -c
# Describe the sink
exec-memory-avro.sinks.avro-sink.type = avro
exec-memory-avro.sinks.avro-sink.hostname = testhdp01
exec-memory-avro.sinks.avro-sink.type = 44444
# Use a channel which buffers events in memory
exec-memory-avro.channels.memory-channel.type = memory
confB: avro-memory-kafka.conf
#Name the components on this agent
avro-memory-kafka.sources = avro-source
avro-memory-kafka.sinks = kafka-sink
avro-memory-kafka.channels = memory-channel
# Describe/configure the source
avro-memory-kafka.sources.avro-source.type = avro
avro-memory-kafka.sources.avro-source.bind = testhdp01
avro-memory-kafka.sources.avro-source.port = 44444
# Describe the sink
avro-memory-kafka.sinks.kafka-sink.type = org.apache.flume.sink.kafka.KafkaSink
#broker的监听端口
avro-memory-kafka.sinks.kafka-sink.brokerList = testhdp01:9092
avro-memory-kafka.sinks.kafka-sink.topic = hello_test
#缓存多少条数据再输出
avro-memory-kafka.sinks.kafka-sink.batchSize = 3
avro-memory-kafka.sinks.kafka-sink.requiredAcks = 1
# Use a channel which buffers events in memory
avro-memory-kafka.channels.memory-channel.type = memory
# Bind the source and sink to the channel
avro-memory-kafka.sources.avro-source.channels = memory-channel
avro-memory-kafka.sinks.kafka-sink.channel = memory-channel
启动命令 先启动监听的 avro-memory-kafka.conf
flume-ng agent \
--name avro-memory-kafka \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/avro-memory-kafka.conf \
-Dflume.root.logger=INFO,console
再启动 exec-memory-avro.conf
flume-ng agent \
--name exec-memory-avro \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/exec-memory-avro.conf \
-Dflume.root.logger=INFO,console