kafka特点:
高吞吐量、低延迟:
针对生产者发布及消费者订阅消息
kafka每秒可以处理几十万条数据
读写的延迟最低几毫秒
高并发:
一个kafka的broker节点可以并发处理几千个客户端的百兆数据的读写请求
一个kakfa集群是由多个broker节点服务器组成的
broker节点负责持久化和备份具体的kafka消息
可扩展性:
集群支持热扩展
易扩展
持久化、可靠性:
消息会被持久化到broker本地磁盘,并且支持备份防止数据丢失
消息的默认保留时间是7天
容错性:
允许集群中broker节点宕机
运行宕机的最多broker节点数量为 副本数量的 n-1
kafka和hdfs底层数据存储没有任何关系
kafka是一个独立的物理集群
----------------------------------------------
kafka的集群架构
broker
消息中间存储及处理节点,一个kafka集群由多个broker节点组成
topic
生产在将消费推送给kafka集群时都有对应的主题
消费者到对应的主题去订阅消费消息
同一个主题就是同一类消息的存储
在一个kafka集群上可以维护n多个topic主题
zookeeper
kafka强依赖zookeeper
kafka所有broker节点的状态资源信息及所有的topic主题元数据信息都保存在zookeeper上
元数据:
kafka集群上有哪些topic主题
每个topic有几个partition分区 -- 类似hbase的region
每个partition的分布位置信息
每个partition的副本数量及副本的分布位置
在partition的副本中有一个是leader partition
zookeeper负责leader partition的选举工作
zookeeper同时也负责leader partition的 fail over
leader partition 的作用?
负责作为多个副本的代表响应生产者和消费者的读写请求
负责多个副本之间的数据的同步工作
zookeeper监控broker节点的状态故障后迅速做出容灾处理
通过zookeeper管理broker及consumer的动态加入及离开
-------------------------------------------------------
topic 物理存储模型及重要概念讲解:
partition(分区) :
是topic在物理上的分区,一个topic可以分为多个partition(对比hbase的region)
一个topic在本地磁盘目录下是一个单独的目录
分区的个数可以在创建topic时进行指定(对比hbase的预分区)
partition分区是一个有序的队列,生产者的消息都是有序的追加到对应的partition上
每个partition都自己的多个replica 副本
在partition的副本中有一个是leader partition
zookeeper负责leader partition的选举工作
zookeeper同时也负责leader partition的 fail over
leader partition 的作用?
负责作为多个副本的代表响应生产者和消费者的读写请求
负责多个副本之间的数据的同步工作
replica(副本) :
每个topic/partition都是有副本的
副本的数量在topic创建时指定
副本被分散在不同的broker节点上 ,保证数据的安全性
副本一般是 3个 ,最小2个
允许丢失的副本数是n-1
offset(偏移量):
partition分区是一个有序的队列,生产者的消息都是有序的追加到对应的partition上
如何保证有序???
partition中追加的每条消息都一个连续的序列号标识,称为offset
offset唯一标识一条消息,相当于消息的索引
offset也可以认为是partition中message的id
segment(段) :
partition是分段的,每个段称为segment
将partition数据文件进行分段是kafka解决查询效率的手段之一 (使用二分查找法)
每个段的组成:
存储了n多条消息数据的一个独立的文件
命名规则: 该段中最小的offset值.log
存储了该段消息数据索引的一个索引文件
命名规则: 该段中最小的offset值.index
----------------------------------------------------------
kafka的安装部署
版本:
kafka_2.10-0.8.2.1
2.10-》指的是scala版本
0.8.2.1-》kafka版本号
官方文档:
http://kafka.apache.org/082/documentation.html#quickstart
2、安装并配置scala
scala-2.10.4.tgz 上传至linux并解压
# vi /etc/profile
export JAVA_HOME=/opt/modules/jdk1.7.0_67
export SCALA_HOME=/opt/modules/scala-2.10.4
export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin
# source /etc/profile
# scala -version
Scala code runner version 2.10.4 -- Copyright 2002-2013, LAMP/EPFL
3、安装kafka
上传并解压
4、修改配置文件
1)server.properties (kakfa集群broker节点相关配置文件)
broker.id=0 //如果是kafka集群,则每台broker节点的broker.id的值需要是不同的int值
port=9092 broker节点服务的监听端口
host.name=192.168.134.101 //当前broker节点所在服务器的主机名或ip
log.dirs=/opt/modules/kafka_2.10-0.8.2.1/data //kafka消息的本地存储路径
zookeeper.connect=192.168.134.101:2181 //声明外部独立的zookeeper集群的地址信息
2)producer.properties (生产者相关配置文件)
metadata.broker.list=192.168.134.101:9092 //声明broker集群的地址,如果有多个broker节点 format: host1:port1,host2:port2 ...
3)consumer.properties (消费者相关配置文件)
zookeeper.connect=192.168.134.101:2181 //声明zookeeper集群地址
5、启动kafka服务进程
$ bin/kafka-server-start.sh config/server.properties //默认是一个前端命令
--------------------------------------------
kafka的使用
案例一:
1、创建一个topic主题
bin/kafka-topics.sh \
--create \
--zookeeper 192.168.134.101:2181 \
--replication-factor 1 \ -- 指定副本数
--partitions 1 \ ---partition分区的个数一般不大于broker节点数
--topic test
list当前kafka集群的topic列表
bin/kafka-topics.sh \
--list \
--zookeeper 192.168.134.101:2181
2、启动一个前端命令行生产者
通过该生产者在命令行发送消息到对应的topic中
该服务也是一个前端命令
bin/kafka-console-producer.sh \
--broker-list 192.168.134.101:9092 \
--topic test
3、启动一个前端命令行消费者
bin/kafka-console-consumer.sh \
--zookeeper 192.168.134.101:2181 \
--topic test \
--from-beginning
4、在前端命令行生产者发送消息
到前端命令行消费者观察获取的消息
----------------------------------------------
案例二:
生产者flume和kafka整合使用
基于离线项目平台
flume-agent的定义:
flume-agent01类型: 启动在各个客户机(nginx)上
source-exec :
tail -f /usr/local/nginx/datalog/access.log
channel - mem :
sink - avro :
hostname
port
flume-agent02类型:
source-avro :
hostname/bind
port
selector.type = replicating(将数据复制后分发给各个channel )
channel_01 -> sink -hdfs 离线的存储 hdfs
channel_02 -> sink -kafka 实时消费分析
--------------------------
1、修改
nginx_2_avro.properties (不用修改)
avro_2_hdfs.properties (需要修改)
--------------------
# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per agent,
# in this case called 'agent'
## define agent source、 channel、 sinks、name
a2.sources = s2
a2.channels = c2 c3
a2.sinks = k2 k3
## define sources -avro
a2.sources.s2.type = avro
a2.sources.s2.bind = 192.168.134.101
a2.sources.s2.port = 9999
a2.sources.s2.selector.type = replicating
## define channels -- c2
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100
## define channels -- c3
a2.channels.c3.type = memory
a2.channels.c3.capacity = 1000
a2.channels.c3.transactionCapacity = 100
## define sinks - hdfs -k2
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://192.168.134.101:8020/flume_kafka/%Y%m%d
a2.sinks.k2.hdfs.filePrefix = access_log
## 设置目录按照年/月/日进行回滚
a2.sinks.k2.hdfs.round = true
a2.sinks.k2.hdfs.roundValue = 1
a2.sinks.k2.hdfs.roundUnit = day
## 解决生产很多小文件,设置文件回滚的条件
a2.sinks.k2.hdfs.rollInterval = 0
a2.sinks.k2.hdfs.rollSize = 134217728
a2.sinks.k2.hdfs.rollCount = 0
## 这个参数必须设置,不然上面的回滚设置不生效
a2.sinks.k2.hdfs.minBlockReplicas = 1
a2.sinks.k2.hdfs.batchSize = 1000
a2.sinks.k2.hdfs.fileType = DataStream
a2.sinks.k2.hdfs.writeFormat = Text
a2.sinks.k2.hdfs.useLocalTimeStamp = true
## define sinks - kafka -k3
a2.sinks.k3.type = org.apache.flume.sink.kafka.KafkaSink
a2.sinks.k3.brokerList = 192.168.134.101:9092
a2.sinks.k3.topic = test
## 关联 sources和 sinks
a2.sources.s2.channels = c2 c3
a2.sinks.k2.channel = c2
a2.sinks.k3.channel = c3
-------------------
2、启动两个flume-agent进程
41762 Kafka
7873 QuorumPeerMain
6692 NameNode
6789 DataNode
$ bin/flume-ng agent --name a1 --conf conf/ --conf-file conf/nginx_2_avro.properties &
$ bin/flume-ng agent --name a2 --conf conf/ --conf-file conf/avro_2_hdfs.properties &
3、查看hdfs上的数据
/flume_kafka/20170801
4、启动一个前端命令行消费者监控test主题中的message
$ bin/kafka-console-consumer.sh --zookeeper 192.168.134.101:2181 --topic test
高吞吐量、低延迟:
针对生产者发布及消费者订阅消息
kafka每秒可以处理几十万条数据
读写的延迟最低几毫秒
高并发:
一个kafka的broker节点可以并发处理几千个客户端的百兆数据的读写请求
一个kakfa集群是由多个broker节点服务器组成的
broker节点负责持久化和备份具体的kafka消息
可扩展性:
集群支持热扩展
易扩展
持久化、可靠性:
消息会被持久化到broker本地磁盘,并且支持备份防止数据丢失
消息的默认保留时间是7天
容错性:
允许集群中broker节点宕机
运行宕机的最多broker节点数量为 副本数量的 n-1
kafka和hdfs底层数据存储没有任何关系
kafka是一个独立的物理集群
----------------------------------------------
kafka的集群架构
broker
消息中间存储及处理节点,一个kafka集群由多个broker节点组成
topic
生产在将消费推送给kafka集群时都有对应的主题
消费者到对应的主题去订阅消费消息
同一个主题就是同一类消息的存储
在一个kafka集群上可以维护n多个topic主题
zookeeper
kafka强依赖zookeeper
kafka所有broker节点的状态资源信息及所有的topic主题元数据信息都保存在zookeeper上
元数据:
kafka集群上有哪些topic主题
每个topic有几个partition分区 -- 类似hbase的region
每个partition的分布位置信息
每个partition的副本数量及副本的分布位置
在partition的副本中有一个是leader partition
zookeeper负责leader partition的选举工作
zookeeper同时也负责leader partition的 fail over
leader partition 的作用?
负责作为多个副本的代表响应生产者和消费者的读写请求
负责多个副本之间的数据的同步工作
zookeeper监控broker节点的状态故障后迅速做出容灾处理
通过zookeeper管理broker及consumer的动态加入及离开
-------------------------------------------------------
topic 物理存储模型及重要概念讲解:
partition(分区) :
是topic在物理上的分区,一个topic可以分为多个partition(对比hbase的region)
一个topic在本地磁盘目录下是一个单独的目录
分区的个数可以在创建topic时进行指定(对比hbase的预分区)
partition分区是一个有序的队列,生产者的消息都是有序的追加到对应的partition上
每个partition都自己的多个replica 副本
在partition的副本中有一个是leader partition
zookeeper负责leader partition的选举工作
zookeeper同时也负责leader partition的 fail over
leader partition 的作用?
负责作为多个副本的代表响应生产者和消费者的读写请求
负责多个副本之间的数据的同步工作
replica(副本) :
每个topic/partition都是有副本的
副本的数量在topic创建时指定
副本被分散在不同的broker节点上 ,保证数据的安全性
副本一般是 3个 ,最小2个
允许丢失的副本数是n-1
offset(偏移量):
partition分区是一个有序的队列,生产者的消息都是有序的追加到对应的partition上
如何保证有序???
partition中追加的每条消息都一个连续的序列号标识,称为offset
offset唯一标识一条消息,相当于消息的索引
offset也可以认为是partition中message的id
segment(段) :
partition是分段的,每个段称为segment
将partition数据文件进行分段是kafka解决查询效率的手段之一 (使用二分查找法)
每个段的组成:
存储了n多条消息数据的一个独立的文件
命名规则: 该段中最小的offset值.log
存储了该段消息数据索引的一个索引文件
命名规则: 该段中最小的offset值.index
----------------------------------------------------------
kafka的安装部署
版本:
kafka_2.10-0.8.2.1
2.10-》指的是scala版本
0.8.2.1-》kafka版本号
官方文档:
http://kafka.apache.org/082/documentation.html#quickstart
1、安装jdk1.7 和 zookeeper并启动zookeeper服务进程
scala语言是建立在jvm之上的的,所以需要jdk的支持
scala强依赖zookeeper
2、安装并配置scala
scala-2.10.4.tgz 上传至linux并解压
# vi /etc/profile
export JAVA_HOME=/opt/modules/jdk1.7.0_67
export SCALA_HOME=/opt/modules/scala-2.10.4
export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin
# source /etc/profile
# scala -version
Scala code runner version 2.10.4 -- Copyright 2002-2013, LAMP/EPFL
3、安装kafka
上传并解压
4、修改配置文件
1)server.properties (kakfa集群broker节点相关配置文件)
broker.id=0 //如果是kafka集群,则每台broker节点的broker.id的值需要是不同的int值
port=9092 broker节点服务的监听端口
host.name=192.168.134.101 //当前broker节点所在服务器的主机名或ip
log.dirs=/opt/modules/kafka_2.10-0.8.2.1/data //kafka消息的本地存储路径
zookeeper.connect=192.168.134.101:2181 //声明外部独立的zookeeper集群的地址信息
2)producer.properties (生产者相关配置文件)
metadata.broker.list=192.168.134.101:9092 //声明broker集群的地址,如果有多个broker节点 format: host1:port1,host2:port2 ...
3)consumer.properties (消费者相关配置文件)
zookeeper.connect=192.168.134.101:2181 //声明zookeeper集群地址
5、启动kafka服务进程
$ bin/kafka-server-start.sh config/server.properties //默认是一个前端命令
--------------------------------------------
kafka的使用
案例一:
1、创建一个topic主题
bin/kafka-topics.sh \
--create \
--zookeeper 192.168.134.101:2181 \
--replication-factor 1 \ -- 指定副本数
--partitions 1 \ ---partition分区的个数一般不大于broker节点数
--topic test
list当前kafka集群的topic列表
bin/kafka-topics.sh \
--list \
--zookeeper 192.168.134.101:2181
2、启动一个前端命令行生产者
通过该生产者在命令行发送消息到对应的topic中
该服务也是一个前端命令
bin/kafka-console-producer.sh \
--broker-list 192.168.134.101:9092 \
--topic test
3、启动一个前端命令行消费者
bin/kafka-console-consumer.sh \
--zookeeper 192.168.134.101:2181 \
--topic test \
--from-beginning
4、在前端命令行生产者发送消息
到前端命令行消费者观察获取的消息
----------------------------------------------
案例二:
生产者flume和kafka整合使用
基于离线项目平台
flume-agent的定义:
flume-agent01类型: 启动在各个客户机(nginx)上
source-exec :
tail -f /usr/local/nginx/datalog/access.log
channel - mem :
sink - avro :
hostname
port
flume-agent02类型:
source-avro :
hostname/bind
port
selector.type = replicating(将数据复制后分发给各个channel )
channel_01 -> sink -hdfs 离线的存储 hdfs
channel_02 -> sink -kafka 实时消费分析
--------------------------
1、修改
nginx_2_avro.properties (不用修改)
avro_2_hdfs.properties (需要修改)
--------------------
# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per agent,
# in this case called 'agent'
## define agent source、 channel、 sinks、name
a2.sources = s2
a2.channels = c2 c3
a2.sinks = k2 k3
## define sources -avro
a2.sources.s2.type = avro
a2.sources.s2.bind = 192.168.134.101
a2.sources.s2.port = 9999
a2.sources.s2.selector.type = replicating
## define channels -- c2
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100
## define channels -- c3
a2.channels.c3.type = memory
a2.channels.c3.capacity = 1000
a2.channels.c3.transactionCapacity = 100
## define sinks - hdfs -k2
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://192.168.134.101:8020/flume_kafka/%Y%m%d
a2.sinks.k2.hdfs.filePrefix = access_log
## 设置目录按照年/月/日进行回滚
a2.sinks.k2.hdfs.round = true
a2.sinks.k2.hdfs.roundValue = 1
a2.sinks.k2.hdfs.roundUnit = day
## 解决生产很多小文件,设置文件回滚的条件
a2.sinks.k2.hdfs.rollInterval = 0
a2.sinks.k2.hdfs.rollSize = 134217728
a2.sinks.k2.hdfs.rollCount = 0
## 这个参数必须设置,不然上面的回滚设置不生效
a2.sinks.k2.hdfs.minBlockReplicas = 1
a2.sinks.k2.hdfs.batchSize = 1000
a2.sinks.k2.hdfs.fileType = DataStream
a2.sinks.k2.hdfs.writeFormat = Text
a2.sinks.k2.hdfs.useLocalTimeStamp = true
## define sinks - kafka -k3
a2.sinks.k3.type = org.apache.flume.sink.kafka.KafkaSink
a2.sinks.k3.brokerList = 192.168.134.101:9092
a2.sinks.k3.topic = test
## 关联 sources和 sinks
a2.sources.s2.channels = c2 c3
a2.sinks.k2.channel = c2
a2.sinks.k3.channel = c3
-------------------
2、启动两个flume-agent进程
41762 Kafka
7873 QuorumPeerMain
6692 NameNode
6789 DataNode
$ bin/flume-ng agent --name a1 --conf conf/ --conf-file conf/nginx_2_avro.properties &
$ bin/flume-ng agent --name a2 --conf conf/ --conf-file conf/avro_2_hdfs.properties &
3、查看hdfs上的数据
/flume_kafka/20170801
4、启动一个前端命令行消费者监控test主题中的message
$ bin/kafka-console-consumer.sh --zookeeper 192.168.134.101:2181 --topic test