前言
本文目的在于通过 flume、zookeeper、kafka、docker 搭建基本的日志采集系统,实现日志的采集并将数据发送至 Kafka。
搭建前,需确保已安装以下组件:
- JDK 8
- Flume
- Zookeeper
- Kafka
- Docker
同时需确保已掌握以下技能:
- 能在本地部署并成功启动 Flume,且了解 Flume 的核心概念
source
、channel
、sink
- 能基本使用 Zookeeper,了解节点的创建、更新、查看与删除
- 能基本使用 Kafka,了解 topic 的概念,实现消息的创建与消费
- 了解 Docker,能基于
Dockerfile
创建镜像并启动容器
在本系统中,各组件职责分配如下:
组件名 | 组件职责 |
---|---|
Flume | 负责日志采集 |
Zookeeper | 负责配置管理 |
Kafka | 负责数据接收 |
Flume 配置
日志采集系统搭建的第一步,是完成 Flume 的配置。
在进行 Flume 配置前,我们首先假设面临如下需求:
- 数据来源为 Thrift
- 要求不同的日志源发送往相应的 kafka 队列
在此基础上,我们设计 Flume 配置文件 flume-docker.conf
如下:
# 配置一个 agent,agent 的名称可以自定义(如:docker)
# 指定 agent 的 sources(如:s1)、sinks(如:k1)、channels(如:c1)
docker.sources = s1
docker.sinks = k1 k2
docker.channels = c1 c2
# 配置 source
docker.sources.s1.channels = c1 c2
docker.sources.s1.type = thrift
docker.sources.s1.bind = 0.0.0.0
docker.sources.s1.port = 9999
docker.sources.s1.selector.type = multiplexing
docker.sources.s1.selector.header = type
docker.sources.s1.selector.mapping.panda_1 = c1
docker.sources.s1.selector.mapping.panda_2 = c2
# 配置 channels
docker.channels.c1.type = file
docker.channels.c1.dataDirs = /tmp/data/flume/c1/data
docker.channels.c1.checkpointDir = /tmp/data/flume/c1/checkpoint
docker.channels.c2.type = file
docker.channels.c2.dataDirs = /tmp/data/flume/c2/data
docker.channels.c2.checkpointDir = /tmp/data/flume/c2/checkpoint
# 配置 sinks
docker.sinks.k1.channel = c1
docker.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
docker.sinks.k1.kafka.bootstrap.servers = 192.168.117.128:9092
docker.sinks.k1.kafka.topic = panda_1
docker.sinks.k1.kafka.producer.acks = -1
docker.sinks.k2.channel = c2
docker.sinks.k2.type = org.apache.flume.sink.kafka.KafkaSink
docker.sinks.k2.kafka.bootstrap.servers = 192.168.117.128:9092
docker.sinks.k2.kafka.topic = panda_2
docker.sinks.k2.kafka.producer.acks = -1
该配置文件主要是通过以下 3 点满足上述假设的需求:
- 使用 Flume Selector,通过
multiplexing
实现将多数据源发送至多管道 - 通过 Selector 中的
header
和mapping
决定不同的数据源分别发送至哪个channel
- 配置多个
sink
,分别对应各个channel
,并将其发送至指定的 kafka 队列
关于 multiplexing
的更多内容,可以参考官方文档
Zookeeper 管理
日志采集系统搭建的第二步,是将上述配置文件 flume-docker.conf
交由 Zookeeper 管理。
为此,我们首先要启动 Zookeeper 服务。在本例中,我们使用单节点模式,启动命令如下:
cd ${zk_home}/bin
./zkServer.sh start
然后,我们需要将上述配置文件 flume-docker.conf
的内容添加至 Zookeeper 的节点。
在本例中,此部分通过 Java API 实现,具体步骤如下:
STEP 01:引入 Zookeeper 客户端框架 Curator
<dependency>
<groupId>org.apache.curator</groupId>