Apache Flume 入门

191 阅读6分钟

#博学谷IT学习技术支持#

01 概述

什么是Apache Flume

Flume是由Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的软件。

Flume的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目的地(sink)。为了保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume在删除自己缓存的数据。

Flume支持定制各类数据发送方,用于收集各类型数据;同时,Flume支持定制各种数据接受方,用于最终存储数据。一般的采集需求,通过对flume的简单配置即可实现。针对特殊场景也具备良好的自定义扩展能力。因此,flume可以适用于大部分的日常数据采集场景。

当前Flume有两个版本。Flume 0.9X版本的统称Flume OG(original generation),Flume1.X版本的统称Flume NG(next generation)。由于Flume NG经过核心组件、核心配置以及代码架构重构,与Flume OG有很大不同,使用时请注意区分。改动的另一原因是将Flume纳入 apache 旗下,Cloudera Flume 改名为 Apache Flume。

使用flume 核心就是学习如何配置flume的采集脚本(采集配置文件)

02 Flume的运行机制

Flume系统中核心的角色是agent,agent本身是一个Java进程,一般运行在日志收集节点。

每一个agent相当于一个数据传递员,内部有三个组件:

  • Source:采集源,用于跟数据源对接,以获取数据;
  • Sink:下沉地,采集数据的传送目的,用于往下一级agent传递数据或者往最终存储系统传递数据;
  • Channel:agent内部的数据传输通道,用于从source将数据传递到sink;

在整个数据的传输的过程中,流动的是event,它是Flume内部数据传输的最基本单元。event将传输的数据进行封装。如果是文本文件,通常是一行记录,event也是事务的基本单位。event从source,流向channel,再到sink,本身为一个字节数组,并可携带headers(头信息)信息。event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。

一个完整的event包括:event headers、event body、event信息,其中event信息就是flume收集到的日记记录。

需要认识的Source组件:

需要认识的sink组件:

需要认识channel组件:

03 Flume的安装使用

1) 上传安装包到数据源所在节点上:

cd /export/software

rz 上传即可

2) 解压安装包 tar -zxvf apache-flume-1.9.0-bin.tar.gz

tar -zxvf apache-flume-1.9.0-bin.tar.gz

3) 然后进入flume的目录,修改conf下的flume-env.sh,在里面配置JAVA_HOME

cd /export/server/apache-flume-1.9.0-bin/conf

cp flume-env.sh.template flume-env.sh

vim flume-env.sh

在第22 行中, 打开 注释, 然后修改JAVA_HOME的路径

export JAVA_HOME=/export/server/jdk1.8.0_241/

04 Flume基础入门程序

需求说明: 监听服务器上某一个端口号(例如: 44444), 采集发向此端口的数据。

实现步骤:

  1. 确定三大组件
  • source组件: 需要一个能够监听端口号的组件(网络组件)

  • channel组件: 需要一个传输速度更快的管道(内存组件)

  • sink组件: 此处我们只需要打印出来即可

  1. 编写采集配置文件
cd /export/server/apache-flume-1.9.0-bin/conf
vim netcat_source_logger_sink.conf
# 说明: 文件名称可以任意, 一般建议为 source名称_sink名称.conf
# 第一部分: 定义这个agent中各组件的名字
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#第二部分:  描述和配置source组件:r1
a1.sources.r1.type = netcat
a1.sources.r1.bind = node1
a1.sources.r1.port = 44444
 
# 第三部分: 描述和配置sink组件:k1
a1.sinks.k1.type = logger
# 第四部分: 描述和配置channel组件,此处使用是内存缓存的方式
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 第五部分: 描述和配置source  channel   sink之间的连接关系
a1.sources.r1.channels = c1 
a1.sinks.k1.channel = c1
	
  1. 启动flume: 指定采集配置文件
cd /export/server/apache-flume-1.9.0-bin
bin/flume-ng agent -c conf -f conf/netcat_source_logger_sink.conf -n a1  -Dflume.root.logger=INFO,console
参数说明:   
     -c conf   指定flume自身的配置文件所在目录  
     -f conf/netcat-logger.con  指定我们所描述的采集方案  
     -n a1  指定我们这个agent的名字

  1. 接下来进行测试: 一定要启动之后, 连接测试

先要往agent采集监听的端口上发送数据,让agent有数据可采。

随便在一个能跟agent节点通信的机器上:

执行: telnet anget-hostname port (例如: telnet node1 44444)

注意: 如果提示 -bash: telnet: command not found 错误

执行: yum -y install telnet

常见问题说明:

问题1: -bash: telnet: command not found 或者 命令找不到 错误

原因: 未安装 telnet命令

解决方案

yum -y install telnet

问题2:

原因: 当前服务器没有绑定在4444端口的程序, 此时一般出现的原因是flume的监听44444端口程序没有启动

解决方案: 启动flume的监听44444端口程序

05、Flume的复杂流动

多个agent的数据流(多级流动)

数据流合并(扇入流)

在做日志收集的时候一个常见的场景就是,大量的生产日志的客户端发送数据到少量的附属于存储子系统的消费者agent。例如,从数百个web服务器中收集日志,它们发送数据到十几个负责将数据写入HDFS集群的agent

这个可在Flume中可以实现,需要配置大量第一层的agent,每一个agent都有一个avro sink,让它们都指向同一个agent的avro source(强调一下,在这样一个场景下你也可以使用thrift source/sink/client)。在第二层agent上的source将收到的event合并到一个channel中,event被一个sink消费到它的最终的目的地

数据流复用(扇出流)

Flume支持多路输出event流到一个或多个目的地。这是靠定义一个多路数据流实现的,它可以实现复制和选择性路由一个event到一个或者多个channel

上面的例子展示了agent foo中source扇出数据流到三个不同的channel,这个扇出可以是复制或者多路输出。在复制数据流的情况下,每一个event被发送所有的三个channel;在多路输出的情况下,一个event被发送到一部分可用的channel中,它们是根据event的属性和预先配置的值选择channel的。 这些映射关系应该被填写在agent的配置文件中