一 kafka介绍
现在各个电商平台,社交平台等诸多系统可以不断生产出各种细信息,那么我们应该如何收集它,如何分析它,以及输入实时的做到以上需求。Kafka应运而生。
Kafka是一个分布式的的流式系统或者平台,他可以发布和订阅消息,这个和一般的消息中间件类似,他可以让你以容错的方式存储数据或者消息,并且你还可以处理他们,他一般多用于构建实时应用。
首先,这儿有几个概念:
# kafka是以集群的方式运行
# kafka集群按类别存储数据,这个类别就是topics(主题)
# 每一个流式数据都是由(key,value,timestamp)组成的
特点:
快:单个kafka服务每秒可处理数以千计客户端发来的几百MB数据。
可扩展性:一个单一集群可作为一个大数据处理中枢,集中处理各种类型业务
持久化:消息被持久化到磁盘(可处理TB数据级别数据但仍保持极高数据处理效率),并且有备份容错机制
分布式:着眼于大数据领域,支持分布式,集群可处理每秒百万级别消息
实时性:生产出的消息可立即被消费者消费
应用场景:
日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
消息系统:解耦和生产者和消费者、缓存消息等。
用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
流式处理:比如spark streaming和storm
1.1 topics & partition
主题就是你要发布数据或者消息的类别,他可以有0个或者1个或者多个消费者订阅。
Topics又可以从物理上划分为一个或者多个分区,每一个分区对应着一个文件夹,以topicName_partitionIndex方式命名,该文件夹下存储这个分区的所有消息.log和索引文件.index,每一个分区都是一个有序的队列;分区中每一条消息都会被分配一个有序的id(offset)。这使得kafka的吞吐量可以水平扩展
1.2 生产者
生产者负责发布数据到主题,并且为数据分区
1.3 消费者
消费者有一个消费者组的概念,一个主题的数据最后都会被某一个消费者组的所有消费者实例消费
1.4 保证
生产者发送到一个特定主题的分区上的消息将会按照他们的发送顺序依次加入;消费者也是按照顺序消费的
二 kafka集群安装配置
2.1 解压kafka
tar -zxf kafka_2.11-0.10.1.1.tgz -C /opt/app
ln -s /opt/app/kafka_2.11-0.10.1.1 /opt/app/kafka
2.2 创建kafka数据目录
mkdir -p /opt/app/kafka/kafkalogs
2.3 修改配置
注意:这里有zookeeper的配置文件,是可以根据kafka自带的zk集群来启动,但不建议使用,而使用独立的zk集群
cd /opt/app/kafka/config
修改server.properties
# broker的id,每一个broker的这个id必须唯一broker.id=1
# 是否enable可以删除主题,默认是不可以 #delete.topic.enable=true
# 处理网络请求的线程数量,默认是3个
num.network.threads=3
# broker进行I/O处理的线程数
num.io.threads=8
# 发送数据的缓冲区,数据不是产生就发送,而是在缓冲区满的时候
socket.send.buffer.bytes=102400
# 接收数据的缓冲区大小
socket.receive.buffer.bytes=102400
# 向kafka请求数据或者发送数据的请求的最大大小,但是不能超过java的堆栈大小
socket.request.max.bytes=104857600
# A 存储日志文件的目录
log.dirs=/opt/app/kafka/kafka-logs
# 每一个主题topic的分区数目,默认为1
num.partitions=3
# 日志刷新的数据大小 #log.flush.interval.messages=10000
# 日志刷新的时间间隔
#log.flush.interval.ms=1000
# 日志最多可以保存多长时间,默认7天
log.retention.hours=168
# 消息保存的最大值 #log.retention.bytes=1073741824
# 每一个日志文件的最大大小,超过次大小,创建一个新的log
log.segment.bytes=1073741824
# 检查日志文件根据保留政策是否应该删除的间隔时间log.retention.check.interval.ms=300000
# 设置zookeeper的连接端口
zookeeper.connect=hadoop-all-01:2181,hadoop-all-02:2181,hadoop-all-03:2181
# 连接zk的超时时间
zookeeper.connection.timeout.ms=6000
# socket server监听地址
#listeners=PLAINTEXT://hadoop-all-01:9092
# socket server监听地址
#advertised.listeners=PLAINTEXT://hadoop-all-01:9092
2.5改完之后,然后复制其他机器:
scp -r ./kafka/ hadoop@hadoop-all-02:/opt/app/
scp -r ./kafka/ hadoop@hadoop-all-03:/opt/app/
然后在每一台机器修改broker.id = 2 和 3,并且修改listener参数
listeners=PLAINTEXT://hadoop-all-02:19092
advertised.listeners=PLAINTEXT://hadoop-all-01:19092
listeners=PLAINTEXT://hadoop-all-03:19092
advertised.listeners=PLAINTEXT://hadoop-all-03:19092
2.6 启动每一个节点的kafka,以后台模式运行
这里有2种启动方式:
第一种:
kafka-server-start.sh -daemon/opt/app/kafka/config/server.properties
第二种:
nohup bin/kafka-server-start.shconfig/server.properties &
或者:
bin/kafka-server-start.sh config/server.properties> /dev/null 2>&1 &
2.7 测试
第一:创建topic
kafka-topics.sh --zookeeperhadoop-all-01:2181,hadoop-all-02:2181,hadoop-all-03:2181 --topic storm1--replication-factor 2 --partitions 2 –create
第二:查看topic
kafka-topics.sh --list --zookeeperhadoop-all-02:2181
storm1
第三:查看主题详情
kafka-topics.sh --describe --zookeeperhadoop-all-01:2181 --topic storm1
Topic: storm1 PartitionCount:2 ReplicationFactor:2 Configs:
Topic: storm1 Partition:0 Leader: 1 Replicas: 1,3 Isr: 1,3
Topic: storm1 Partition:1 Leader: 2 Replicas: 2,1 Isr: 2,1
第四:删除主题
kafka-topics.sh --delete --topic storm1 --zookeeperhadoop-all-01:2181,hadoop-all-02:2181,hadoop-all-03:2181
Topic storm1 is marked for deletion.
Note: This will have no impact if delete.topic.enableis not set to true.