Flume日志采集工具使用详解1(基本介绍、安装配置、日志输出到控制台)
一、基本介绍
1,什么是 Flume?
(1)Flume 是 Apache 开源的日志采集工具,它是一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。它也是目前大数据领域最常用的一个数据采集框架,因为使用 Flume 采集数据不需要写代码。
提示:我们只需要在配置文件中写几行配置,Flume 就会按照我们配置的流程去采集数据。
- 有一个简单、灵活、基于流的数据流结构。
- 具有负载均衡机制和故障转移机制,能保证数据采集的稳定性和可靠性。
- 具有一个简单可扩展的数据模型(Source、Channel 和 Sink)。
2,Flume 架构介绍
(1)下面是一个使用 Flume 的典型架构图,其中 Web Server 表示一个 Web 项目,Web 项目会产生日志数据。通过中间的 Agent 把日志数据采集到 HDFS 中。
- Agent 就是我们使用 Flume 启动的一个代理,它是一个持续传输数据的服务,数据在 Agent 内部组件之间传输的基本单位是 Event。
- Agent 是由 Source、Channel 和 Sink 组成的,这就是 Flume 中的 3 大核心组件:
- Source:数据源。
- Channel:临时存储数据的管道。
- Sink:目的地。
(2)接下来是 Flume 的高级应用场景,下图里面主要演示了 Flume 的多路输出,就是可以将采集到的一份数据输出到多个目的地中,不同目的地的数据对应不同的业务场景。
- 通过两个 Flume 代理(Agent)的配置,数据从一个代理的 source 经过多个 channel 分发给不同的 sink,其中 sink1 将数据写入 HDFS,sink2 写入 Java 消息服务数据队列,sink3 将数据发送给另一个代理。多个代理可以通过在 sink 组件中将数据写入下一个代理的 source 组件来实现连通,实现了数据的多重输出到不同目的地。
(3)下图主要表示了 flume 的汇聚功能,就是多个 Agent 采集到的数据统一汇聚到一个 Agent。
- 图里面一共启动了四个 agent,左边的三个 agent 都是负责采集对应 web 服务器中的日志数据,数据采集过来之后统一发送给agent4,最后 agent4 进行统一汇总,最终写入 hdfs。
(4)在实际工作中 flume 和 kafka 常常深度结合使用,比如使用 flume 采集日志文件中产生的实时数据,写入到 kafka 中,然后再使用 flume 从 kafka 中将数据消费出来,保存到 hdfs 上面。
为什么不直接使用 flume 将采集到的日志数据保存到 hdfs 上面呢?
- 因为中间使用 kafka 进行缓冲之后,后面既可以实现实时计算,又可以实现离线数据备份,最终实现离线计算,所以这一份数据就可以实现两种需求,使用起来很方便,所以在工作中一般都会这样做。
3,Flume 的 3 大核心组件
(1)Source 为数据源,通过它可以指定读取哪里的数据,将数据传递给后面的 Channel 组件。Flume 默认支持读取多种数据源,下面是一些常见的数据源:
- Exec Source:用于文件监控,可以实时监控文件中的新增内容,类似于 Linux 中 tail -F 的效果。
- tail -F 等同于 –follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
- tail -f 等同于 –follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止
- 假设默认 log4j 会向 access.log 文件中写日志,每当凌晨 0 点的时候,log4j 都会对文件进行重命名,在 access 后面添加昨天的日期,然后再创建新的 access.log 记录当天的新增日志数据。这个时候如果想要一直监控 access.log 文件中的新增日志数据的话,就需要使用 tail -F
- Spooling Directory Source:采集文件夹中新增的文件。
- NetCat Source:监听 TCP 端口,接收通过 TCP 传输的事件数据。
- Kafka Source:从 Kafka 消息队列中采集数据。
- Avro Source:通过 Avro 协议接收数据。可以与 AvroSink 一起使用,实现 Flume 之间的 Agent 通信。
- HTTP Source:通过 HTTP 协议接收数据。可以通过 HTTP POST 请求将数据发送到 Flume。
- JMS Source:通过 Java Message Service(JMS)接收消息。
(1)在这需要注意 tail -F 和 tail -f 的区别:
(2)在实际工作中我们的日志数据一般都会通过 log4j 记录,log4j 产生的日志文件名称是固定的,每天定时给文件重命名。
提示:在这些 source 组件中,execsource 和 kafkasource 在实际工作中是最常见的,可以满足大部分的数据采集需求。
(2)Channel 是临时存储数据的管道,接收 Source 发出的数据。Channel 支持的类型有很多,下面是一些常用类型:
- Memory Channel:使用内存作为数据的存储介质。优点是效率高,因为不涉及磁盘 I/O;缺点是可能会丢失数据,会存在内存不够用的情况。
- File Channel:使用文件来作为数据的存储介质。优点是数据不会丢失;缺点是相对内存来说其效率有点慢。但是这个慢并没有我们想象的那么慢,所以它也是比较常用的一种 Channel。
- Spillable Memory Channel:使用内存和文件作为数据存储介质,即先把数据存到内存中,如果内存中数据达到阈值则将其存储到文件中。优点是解决了内存不够用的问题;缺点是依然存在数据丢失的风险。
提示:Channel 中的数据直到被 Sink 成功写入目的地之后才会被删除,当 Sink 写入目的地失败时,Channel 中的数据不会丢失,这是因为有事务机制提供保证。
(3)Sink 表示从 Channel 中读取数据并将其存储到指定目的地。下面是一些常见的 Sink 类型:
- Logger Sink:将数据作为日志处理,可以将其选择打印到控制台或写到文件中。这个主要在测试时使用,比较方便验证效果。
- HDFS Sink:将数据传输到 HDFS 中。这个是比较常见的,主要针对离线计算场景。
- Kafka Sink:将数据传输到 Kafka 消息队列中。这个也是比较常见的,主要针对实时计算场景。其优点是数据不落盘,实时传输。
- HBase Sink:将事件写入 Apache HBase,一个分布式 NoSQL 数据库。用于实时写入和查询数据的场景。
- Avro Sink:将事件通过 Avro 协议发送到远程 Flume Agent。与 Avro Source 搭配使用,实现 Flume 之间的 Agent 通信。
- Elasticsearch Sink:将事件数据索引到 Elasticsearch,一个分布式搜索和分析引擎。适用于实时日志分析和搜索的场景。
附一:Flume 的安装配置
1,准备安装包
(1)首先我们访问 Flume 的官网(点击查看)下载合适的版本:
(2)将安装包上传到服务器然后执行如下命令解压缩:
tar -zxvf apache-flume-1.11.0-bin.tar.gz
2,修改 Flume 的环境变量配置文件
(1)进入 Flume 的 conf 目录:
cd apache-flume-1.11.0-bin/conf/
(2)修改 flume-env.sh.template 文件的名字,去掉后缀“template”
mv flume-env.sh.template flume-env.sh
(3)接着编辑 flume-env.sh 文件:
vi flume-env.sh
(4)配置里面的 JAVA_HOME 路径,注意 export 前面的 # 号需要去除,然后保存退出:
3,运行测试
(1)flume 安装包中为我们提供了一个样例 agent 配置文件 flume-conf.properties.template,我们可以使用它直接启动一个 Agent,进入 flume 文件夹执行如下命令:
bin/flume-ng agent -n agent -c conf -f conf/flume-conf.properties.template
(2)该 Agent 的 source 是 SeqGenSource,一个用于生成序列数据的源。它会生成一系列的事件,每个事件包含一个递增的序列号。sink 则为 Logger。我们打开 flume.log 文件可以看到如下内容:
附二:将日志信息直接输出到控制台
(1)在 flume1.9 以及之前的版本,启动时使用 -Dflume.root.logger=INFO,console 参数即可在控制台直接输出数据,而不用查看日志文件:
bin/flume-ng agent -n agent -c conf -f conf/flume-conf.properties.template -Dflume.root.logger=INFO,console
(2)而到了 flume1.10 以及之后的版本,由于其内部使用 Log4j 2.x 替换 Log4j 1.x 版本,这个参数就不起作用。我们可以通过修改 log4j2.xml 配置文件来实现控制台输出:
vi conf/log4j2.xml
(3)修改 Root 的 logger,增加控制台的 appender 即可:
<Loggers> <Logger name="org.apache.flume.lifecycle" level="info"/> <Logger name="org.jboss" level="WARN"/> <Logger name="org.apache.avro.ipc.netty.NettyTransceiver" level="WARN"/> <Logger name="org.apache.hadoop" level="INFO"/> <Logger name="org.apache.hadoop.hive" level="ERROR"/> <Root level="INFO"> <AppenderRef ref="Console" /> <AppenderRef ref="LogFile" /> </Root> </Loggers>
(4)启动程序可以看到日志信息便会直接在控制台上输出: