kafka概述:
官方文档:kafka.apache.org
和消息系统类似
消息中间件: 生产者和消费者
在生产者和消费者之间的一个缓冲区,生产者将产生的消息发送到kafka中,当消费者需要消息的时候,就去kafka中获取消息
解决问题: 1):消费者宕机 2):生产者产生的消息过快,消费者来不及消费 从根本上解决消息丢失问题
kafka架构:
producer: 生产者,产生消息的
comsumer: 消费者,消费消息的
broker: 存储消息的容器
topic: 主题,给消息打一个标签
单节点单broker的部署和使用:
部署kafka:
下载-->解压-->修改配置文件
$KAFKA_HOME/config/server.properties
broker.id
listeners
host.name
log.dirs
zookeeper.connect
首先必须先启动zookeeper:
zkServer.sh start
启动kafka:
kafka-server-start.sh -daemon config/server.properties
-daemon 加了这个参数,说明是在后台启动
创建topic: 要指定zookeeper
注意,创建topic的时候,一定要指定zookeeper的地址,还有分区数量和副本数量,主题的名字
kafka-topics.sh --create --zookeeper hadoop000:2181 --replication-factor 1 --partitions 1 --topic hello_topic
删除topic:
kafka-topics.sh --delete --zookeeper hadoop000:2181 --topic hello_topic2
查看所有的topic:
kafka-topics.sh --list --zookeeper hadoop000:2181
发送消息(生产消息): 要指定broker
kafka-console-producer.sh --broker-list hadoop000:9092 --topic hello_topic2
消费消息: 要指定zookeeper
参数: --from-beginning 可以保存并接收到历史数据
kafka-console-consumer.sh --zookeeper hadoop000:2181 --topic hello_topic2 --from-beginning
查看所有topic的详细信息:
kafka-topics.sh --describe --zookeeper hadoop000:2181
查看指定topic的详细信息:
kafka-topics.sh --describe --zookeeper hadoop000:2181 --topic hello_topic2
单节点多broker的部署及使用:
将server.properties复制多份
server-1.properties broker.id=1 listeners=PLAINTEXT://:9093 log.dir=/tmp/kafka-logs-1
server-2.properties broker.id=2 listeners=PLAINTEXT://:9094 log.dir=/tmp/kafka-logs-2
server-3.properties broker.id=3 listeners=PLAINTEXT://:9095 log.dir=/tmp/kafka-logs-3
依次修改:
broker.id
listeners
log.dir
依次启动,在后台启动:
kafka-server-start.sh -daemo $KAFKA_HOME/config/server-1.properties &
kafka-server-start.sh -daemo $KAFKA_HOME/config/server-2.properties &
kafka-server-start.sh -daemo $KAFKA_HOME/config/server-3.properties &
创建多副本的topic:
kafka-topics.sh --create --zookeeper hadoop000:2181 --replication-factor 3 --partitions 1 --topic my-replication-hello_topic
整合flume和kafka完成实时数据的收集
编辑配置文件: avro-memory-kafka.conf
avro-memory-kafka.sources = avro-source
avro-memory-kafka.sinks = kafka-sink
avro-memory-kafka.channels = memory-channel
avro-memory-kafka.sources.avro-source.type = avro
avro-memory-kafka.sources.avro-source.bind = hadoop000
avro-memory-kafka.sources.avro-source.port = 44444
avro-memory-kafka.sinks.kafka-sink.type = org.apache.flume.sink.kafka.KafkaSink
avro-memory-kafka.sinks.kafka-sink.brokerList = hadoop000:9092
avro-memory-kafka.sinks.kafka-sink.topic = hello_topic
avro-memory-kafka.sinks.kafka-sink.batchSize = 5
avro-memory-kafka.sinks.kafka-sink.requiredAcks =1
avro-memory-kafka.channels.memory-channel.type = memory
avro-memory-kafka.sources.avro-source.channels = memory-channel
avro-memory-kafka.sinks.kafka-sink.channel = memory-channel
1.启动zookeeper: zkServer.sh start
2.启动kafka: kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties
3.依次启动flume:
要先启动avro-memory-kafka.conf,进行监听:
avro-memory-kafka.conf相当于生产者,avro-memory-kafka.conf等待接收exec-memory-avro.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接收更新的日志消息,发给avro-memory-kafka.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
4.启动kafka的消费者:
kafka-console-consumer.sh --zookeeper hadoop000:2181 --topic hello_topic2
5.更新日志:
cd /home/hadoop/data
echo hello >> data.log