Flume(三)之Flume与kafka(kafka简介及安装)
1. 前言
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副 本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以 实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟 的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务 等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶 级开源 项目。
2. 介绍
2-1 Kafka的特性:
高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
可扩展性:kafka集群支持热扩展
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
高并发:支持数千个客户端同时读写
2-2 Kafka的使用场景:
**日志收集:**一个公司可以用Kafka可以收集各种服务的log,通过kafka以统 一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
**消息系统:**解耦和生产者和消费者、缓存消息等。
**用户活动跟踪:**Kafka经常被用来记录web用户或者app用户的各种活动, 如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka 的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载 到hadoop、数据仓库中做离线分析和挖掘。
**运营指标:**Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的 数据,生产各种操作的集中反馈,比如报警和报告。
**流式处理:**比如spark streaming和storm
事件源
3. 基本工作原理图
4. 名词解释
Kafka中发布订阅的对象是topic。我们可以为每类数据创建一个topic,把向topic发布消息的客户端称作producer,从topic订阅消息的客户端称作consumer。Producers和consumers可以同时从多个topic读写数据。一个kafka集群由一个或多个broker服务器组成,它负责持久化和备份具体的kafka消息。
Broker:Kafka节点,一个Kafka节点就是一个broker,多个broker 可以组成一个Kafka集群。
Topic:一类消息,消息存放的目录即主题,例如page view日志、click 日志等都可以以topic的形式存在,Kafka集群能够同时负责多 个topic的分发。
Partition:topic物理上的分组,一个topic可以分为多个partition, 每个partition是一个有序的队列
Segment:partition物理上由多个segment组成,每个Segment存 着message信息
Producer : 生产message发送到topic
Consumer : 订阅topic消费message, consumer作为一个线程来消费
Consumer Group:一个Consumer Group包含多个consumer, 这个是预先在配置文件中配置好的。各个consumer(consumer 线程)可以组成一个组(Consumer group ),partition中的每个message只能被组(Consumer group ) 中的一个consumer(consumer 线程 )消费,如果一个message可以被多个consumer(consumer 线程 ) 消费的话,那么这些consumer必须在不同的组。Kafka不支持一个partition中的message由两个或两个以上的consumer thread来处理,即便是来自不同的consumer group的也不行。它不能像AMQ那样可以多个BET作为consumer去处理message,这是因为多个BET去消费一个Queue中的数据的时候,由于要保证不能多个线程拿同一条message,所以就需要行级别悲观所(for update),这就导致了consume的性能下降,吞吐量不够。而kafka为了保证吞吐量,只允许一个consumer线程去访问一个partition。如果觉得效率不高的时候,可以加partition的数量来横向扩展,那么再加新的consumer thread去消费。这样没有锁竞争,充分发挥了横向的扩展性,吞吐量极高。这也就形成了分布式消费的概念。
5. 安装步骤
配置环境变量:
vi /etc/profile
export KAFKA_HOME=/opt/soft/kafka211
export PATH=$PATH:$KAFKA_HOME/bin
-
首先前置安装zookeeper(步骤见zookeeper)
-
解压kafka(这里使用的是kafka2.11_2.0.0.tgz)
-
配置config/server.properties
3.1 如果是分布式环境则需要修改broker.id的编号不能相同
3.2 log.dir是存储数据的位置需要指定(不是日志)
3.3 Zookeeper.connect=你的zookeeper的IP:2182(多个用逗号隔开)
-
启动步骤
首先启动zookeeper(集群,如果有)
其次编写启动kafka的脚本(例如:kafka.sh)让kafka在后台启动
nohup kafka-server-start.sh /opt/kafka211/config/server.properties > kafka.log 2>&1 &
6. 环境测试
- 建立topic(消息队列)
kafka-topics.sh --create \
--zookeeper 你的zookeeper的IP:2181 \
--replication-factor 副本数 \
--partitions 分区数 \
--topic 消息队列名
-
检查队列是否创建成功
kafka-topics.sh --zookeeper 你的zookeeper的IP:2181 --list
-
向你的消息队列中生产消息
kafka-console-producer.sh --topic 队列名 \
–broker-list 你的kafka队列的机器IP:9092 \
-
消费消息
kafka-console-consumer.sh --bootstrap-server 你的kafka的IP:9092 \
–topic 队列名
实例操作
#创建kafka-topic
kafka-topics.sh
--create
--zookeeper 192.168.56.120:2181
--topic demo
--replication-factor 1
--partitions 1
#配置Flume连接kafka配置文件conf_0806_kafka.properties
a5.channels=c5
a5.sources=s5
a5.sinks=k5
a5.sources.s5.type=spooldir
a5.sources.s5.spoolDir=/opt/retail_db-csv
#正则过滤表头
a5.sources.s5.interceptors=head_filter
a5.sources.s5.interceptors.head_filter.type=regex_filter
a5.sources.s5.interceptors.head_filter.regex=^event_id.*
a5.sources.s5.interceptors.head_filter.excludeEvents=true
a5.sinks.k5.type=org.apache.flume.sink.kafka.KafkaSink
a5.sinks.k5.kafka.bootstrap.servers=192.168.56.120:9092
a5.sinks.k5.kafka.topic=demo
a5.channels.c5.type=memory
a5.channels.c5.capacity=10000
a5.channels.c5.transactionCapacity=10000
a5.sinks.k5.channel=c5
a5.sources.s5.channels=c5
#消费数据(窗口1)
kafka-console-consumer.sh --bootstrap-server 192.168.56.101:9092 --from-beginning --topic demo
#执行conf_0806_kafka.properties(窗口2)
flume-ng agent -n a5 -c conf -f /opt/flumeconf/conf_0806_kafka.properties