当前位置: > > > Flume日志采集工具使用详解1(基本介绍、安装配置、日志输出到控制台)

Flume日志采集工具使用详解1(基本介绍、安装配置、日志输出到控制台)

一、基本介绍

1,什么是 Flume?

(1)FlumeApache 开源的日志采集工具,它是一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。它也是目前大数据领域最常用的一个数据采集框架,因为使用 Flume 采集数据不需要写代码。
提示:我们只需要在配置文件中写几行配置,Flume 就会按照我们配置的流程去采集数据。

(2)Flume 具备 3 大特性:
  • 有一个简单、灵活、基于流的数据流结构。
  • 具有负载均衡机制和故障转移机制,能保证数据采集的稳定性和可靠性。
  • 具有一个简单可扩展的数据模型(SourceChannelSink)。

2,Flume 架构介绍

(1)下面是一个使用 Flume 的典型架构图,其中 Web Server 表示一个 Web 项目,Web 项目会产生日志数据。通过中间的 Agent 把日志数据采集到 HDFS 中。
  • Agent 就是我们使用 Flume 启动的一个代理,它是一个持续传输数据的服务,数据在 Agent 内部组件之间传输的基本单位是 Event
  • Agent 是由 SourceChannelSink 组成的,这就是 Flume 中的 3 大核心组件:
    • Source:数据源。
    • Channel:临时存储数据的管道。
    • Sink:目的地。

(2)接下来是 Flume 的高级应用场景,下图里面主要演示了 Flume 的多路输出,就是可以将采集到的一份数据输出到多个目的地中,不同目的地的数据对应不同的业务场景。
  • 通过两个 Flume 代理(Agent)的配置,数据从一个代理的 source 经过多个 channel 分发给不同的 sink,其中 sink1 将数据写入 HDFSsink2 写入 Java 消息服务数据队列,sink3 将数据发送给另一个代理。多个代理可以通过在 sink 组件中将数据写入下一个代理的 source 组件来实现连通,实现了数据的多重输出到不同目的地。

(3)下图主要表示了 flume 的汇聚功能,就是多个 Agent 采集到的数据统一汇聚到一个 Agent
  • 图里面一共启动了四个 agent,左边的三个 agent 都是负责采集对应 web 服务器中的日志数据,数据采集过来之后统一发送给agent4,最后 agent4 进行统一汇总,最终写入 hdfs

(4)在实际工作中 flumekafka 常常深度结合使用,比如使用 flume 采集日志文件中产生的实时数据,写入到 kafka 中,然后再使用 flumekafka 中将数据消费出来,保存到 hdfs 上面。
为什么不直接使用 flume 将采集到的日志数据保存到 hdfs 上面呢?
  • 因为中间使用 kafka 进行缓冲之后,后面既可以实现实时计算,又可以实现离线数据备份,最终实现离线计算,所以这一份数据就可以实现两种需求,使用起来很方便,所以在工作中一般都会这样做。

3,Flume 的 3 大核心组件

(1)Source 为数据源,通过它可以指定读取哪里的数据,将数据传递给后面的 Channel 组件。Flume 默认支持读取多种数据源,下面是一些常见的数据源:
  • Exec Source:用于文件监控,可以实时监控文件中的新增内容,类似于 Linux tail -F 的效果。
  • (1)在这需要注意 tail -F tail -f 的区别:
    • tail -F 等同于 –follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
    • tail -f 等同于 –follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止
    (2)在实际工作中我们的日志数据一般都会通过 log4j 记录,log4j 产生的日志文件名称是固定的,每天定时给文件重命名。
    • 假设默认 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 ServiceJMS)接收消息。
提示:在这些 source 组件中,execsourcekafkasource 在实际工作中是最常见的,可以满足大部分的数据采集需求。

(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)进入 Flumeconf 目录:
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)该 AgentsourceSeqGenSource,一个用于生成序列数据的源。它会生成一系列的事件,每个事件包含一个递增的序列号。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)修改 Rootlogger,增加控制台的 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)启动程序可以看到日志信息便会直接在控制台上输出:
评论0