Flume 数据采集工具安装与使用
Flume 的定义
- Flume 由 Cloudera 公司开发,是一个分布式、高可靠、高可用的海量日志采集、聚合、传输的系统。
- Flume 支持在日志系统中定制各类数据发送方,用于采集数据;
- Flume 提供对数据进行简单处理,并写到各种数据接收方的能力。
简单的说,Flume 是实时采集日志的数据库引擎。
Flume 组建
Flume 有三个重要组件:Source、Channel、Sink
- Source:数据接收的组件。处理各种类型、各个格式的日子数据。如:avro、exce、netcat。
- Channel:位与 Source 与 Sink 之间的缓冲区。允许 Source、Sink 运行在不同的速率上。(线程安全,可以同时处理多个 Source、Sink)
- 常见的 Channel:Memory Channel、File Channel
- Memory Channel:内存 速度快、容量有限、容易丢数据
- File Chenmel:文件 速度慢、容量大、不丢数据
- Sink:不断的从 Channel 中取数据,发送到目的地。
Flume 的特点
特点:
- 分布式:flume 分布式集群部署,扩展性好
- 可靠性好:当节点出现故障时,日志能够被传送到其他节点上而不会丢失
- 易用性:flume 配置使用较繁琐,对使用人员专业技术要求高
- 实时采集:flume 采集流模式进行数据实时采集
适用场景 :适用于日志文件实时采集。
Flume 安装
https://flume.apache.org/download.html
本文章使用的是 Flume1.9.0
安装节点是 slave2
- 下载安装
1 | # 下载Flume1.9.0 |
配置环境变量
vim /etc/profile1
2
3# Flume
export FLUME_HOME=/opt/servers/flume-1.9.0
export PATH=$PATH:$FLUME_HOME/bin使其生效
1
source /etc/profile
拷贝配置模版
1
2cd $FLUME_HOME/conf
cp flume-env.sh.template flume-env.sh修改配置
vim flume-env.sh1
export JAVA_HOME=/usr/java/jdk1.8.0_202
简单案例
中文 flume 帮助文档
https://flume.liyifeng.org/
业务需求
监听本机 8888 端口,Flume 将监听的数据实时显示在控制台
需求分析:
使用 telnet 工具可以向 8888 端口发送数据
- 监听端口数据,选择 netcat source
- channel 选择 memory
- 数据实时显示,选择 logger sink
实现步骤
- 安装 telnet 工具
1
yum install telnet
- 检查 8888 端口是否被占用。如果该端口被占用,可以选择使用其他端口完成任务
1
2
3lsof -i:8888
# 如果有进程占用
kill [PID] - 创建 Flume Agent 配置文件。flume-netcat-logger.conf
https://flume.liyifeng.org/#netcat-tcp-source
https://flume.liyifeng.org/#memory-channel
https://flume.liyifeng.org/#logger-sink
1 | mkdir ~/conf |
添加以下内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# Agent a1是Agent的名称,r1、c1、k1分别是source、channels、sink的名称
a1.sources = r1
a1.channels = c1
a1.sinks = k1
# Source
a1.sources.r1.type = netcat
a1.sources.r1.bind = slave2
a1.sources.r1.port = 8888
# Channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
# Sink
a1.sinks.k1.type = logger
# Source、Channel、Sink之间的关系
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
Memory Channel 是使用内存缓冲 Event 的 Channel 实现。速度比较快速,容量会受到 jvm 内存大小的限制,可靠性不够高。适用于允许丢失数据,但对性能要求较高的日志采集业务。
启动 Flume
1
2
3flume-ng agent --name a1 \
--conf-file ~/conf/flume-netcat-logger.conf \
-Dflume.root.logger=INFO,console发送数据
1
telnet slave 8888
收到数据并打印在终端上
监控日志文件信息到 HDFS
业务需求:监控本地日志文件,收集内容实时上传到 HDFS
需求分析:
使用 tail-F 命令即可找到本地日志文件产生的信息
- source 选择 exec。exec 监听一个指定的命令,获取命令的结果作为数据源。source 组件从这个命令的结果中取数据。当 agent 进程挂掉重启后,可能存在数据丢失;
- channel 选择 memory
- sink 选择 HDFS
1
2
3
4
5tail -f
等同于--follow=descripror,根据文件描述符进行追踪,当文件改名或被删除,追踪停止
tail -F
等同于--follow=name--retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪选择语言
操作步骤
1、环境准备。Flume 要想将数据输出到 HDFS, 必须持有 Hadoop 相关 jar 包。将
commons-configuration-1.6.jar
hadoop-auth-2.10.1.jar
hadoop-common-2.10.1.jar
hadoop-hdfs-2.10.1.jar
commons-io-2.4.jar
htrace-core4-4.1.0-incubating.jar
拷贝到 $FLUME_HOME/lib 文件夹下1
2
3
4
5
6
7cd $HADOOP_HOME/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib
cp commons-configuration-1.6.jar $FLUME_HOME/lib
cp hadoop-auth-2.10.1.jar $FLUME_HOME/lib
cp hadoop-common-2.10.1.jar $FLUME_HOME/lib
cp hadoop-hdfs-2.10.1.jar $FLUME_HOME/lib
cp commons-io-2.4.jar $FLUME_HOME/lib
cp htrace-core4-4.1.0-incubating.jar $FLUME_HOME/lib
创建配置文件
vim ~/conf/flume-exec-hdfs.conf1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37# Name the components on this agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2
# Describe/configure the source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /tmp/root/hive.log
# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://master:9000/flume/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-
# 是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
# 积攒10000个Event才f1ush到HDFS一次
a2.sinks.k2.hdfs.batchSize = 10000
# 设置文件类型,支持压缩。Datastream没启用压缩
a2.sinks.k2.hdfs.fileType = DataStream
# 1分钟滚动一次
a2.sinks.k2.hdfs.rollInterval = 60
# 128M滚动一次
a2.sinks.k2.hdfs.rollsize = 134217700
# 文件的滚动与Event数量无关
a2.sinks.k2.hdfs.rollCount = 0
# 最小见余数
a2.sinks.k2.hdfs.minBlockReplicas = 1
# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2启动 Flume
1
2
3flume-ng agent --name a2 \
--conf-file ~/conf/flume-exec-hdfs.conf \
Dflume.root.logger=INFO,console测试
使用命令监控,为什么做比对1
2cd /tmp/root
tail -F hive.log
输入错的命令使其产生日志1
hive -e "show databasessss"
- 查看 HDFS 中的文件
1
hadoop fs -ls /flume