Apache Flume是一个分布式的、可靠和易用的日志收集系统,用于将大量日志数据从许多不同的源进行收集、聚合,最终移动到一个集中的数据中心进行存储。Flume的使用不仅限于日志数据聚合,由于数据源是可定制的,因此Flume可以用于传输大量数据,包括但不限于网络流量数据、社交媒体生成的数据、电子邮件消息和几乎所有可能的数据源。
Flume中最小的独立运行单位是Agent。Agent是一个JVM进程,运行在日志收集节点(服务器节点),它包含三个组件——Source(源)、Channel(通道)和Sink(接收地)。数据可以从外部数据源流入这些组件,然后再输出到目的地。一个Flume单节点架构如图3-4所示。
图3-4 Flume单节点架构
Flume中传输数据的基本单位是event(如果是文本文件,则通常是一行记录),event包括event头(headers)和event体(body)。event头是一些key-value(键-值对),存储在Map集合中,就好比HTTP的头信息,用于传递与体不同的额外信息。event体为一个字节数组,存储实际要传递的数据。event的结构如图3-5所示。
event从Source流向Channel,再流向Sink,最终输出到目的地。event的数据流向如图3-6所示。
图3-5 event的结构
图3-6 event的数据流向
Flume除了可以单节点直接采集数据外,也提供了多节点共同采集数据的功能,多个Agent位于不同的服务器上,每个Agent的Avro Sink将数据输出到另一台服务器上的同一个Avro Source进行汇总,最终将数据输出到HDFS文件系统中,如图3-7所示。
例如一个大型网站,为了实现负载均衡功能,往往需要部署在多台服务器上,每台服务器都会产生大量日志数据,如何将每台服务器的日志数据汇总到一台服务器上,然后对它们进行分析呢?这个时候可以在每个网站所在的服务器上安装一个Flume,每个Flume启动一个Agent对本地日志进行收集,然后分别将每个Agent收集到的日志数据发送到同一台装有Flume的服务器上进行汇总,最终将汇总的日志数据写入本地HDFS文件系统中。
图3-7 Flume多节点共同采集数据架构
为了能使数据流跨越多个Agent,前一个Agent的Sink和当前Agent的Source需要是同样的Avro类型,并且Sink需要指定Source的主机名(或者IP地址)和端口号。
此外,Flume还支持将数据流多路复用到一个或多个目的地,如图3-8所示。
图3-8 Flume数据流的多路复用架构
图3-8中,名称为foo的Agent中的Source组件将接收到的数据发送给了3个不同的Channel,发送方式可以是复制(默认为复制)或多路输出。在复制的情况下,每个event都被发送到3个Channel。对于多路输出的情况,一个event可以被发送到一部分可用的Channel中,Flume会根据event的属性和预先配置的值选择Channel,可以在Agent的配置文件中进行映射的设置,若不进行设置,则默认为复制。HDFS、JMS和名称为bar的Agent分别接收来自Sink1、Sink2和Sink3的数据,这种方式称为“扇出”。所谓扇出就是Sink将数据输出到多个目的地中。Flume还支持“扇入”方式,所谓扇入就是一个Source可以接收来自多个数据源的输入。
注意 一个Source可以对应多个Channel,一个Channel也可以对应多个Source。一个Channel可以对应多个Sink,但一个Sink只能对应一个Channel。
Source用于消费外部数据源中的数据(event,例如Web系统产生的日志),一个外部数据源(如Web服务器)可以以Source识别的格式向Source发送数据。
Channel用于存储Source传入的数据,当这些数据被Sink消费后就会自动删除。
Sink用于消费Channel中的数据,然后将它存放在外部持久化的文件系统中(例如HDFS、HBase和Hive等)。
Flume可以在一个配置文件中指定一个或者多个Agent,每个Agent都需要指定Source、Channel和Sink这3个组件以及它们的绑定关系,从而形成一个完整的数据流。
Source、Channel和Sink根据功能的不同有不同的类型。根据数据源的不同,Source组件的常用类型与描述如表3-2所示。
表3-2 Source组件常用类型介绍
根据存储方式的不同,Channel组件的常用类型与描述如表3-3所示。
表3-3 Channel组件常用类型介绍
根据输出目的地的不同,Sink组件的常用类型与描述如表3-4所示。
表3-4 Sink组件常用类型介绍
具体使用哪个类型,在实际开发中根据需要的功能在Flume配置文件中进行指定即可。
Flume依赖于Java环境,安装Flume之前需要先安装好JDK,JDK的安装此处不再赘述。
下面讲解在集群中的centos01节点上安装Flume的操作步骤,并配置Flume从指定端口采集数据,将数据输出到控制台。
将安装包apache-flume-1.9.0-bin.tar.gz上传到centos01节点的/opt/softwares目录,并将它解压到目录/opt/modules/下,解压命令如下:
$ tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /opt/modules/
解压后,进入Flume安装目录,查看安装后的相关文件,如图3-9所示。
图3-9 查看Flume安装后的文件
执行以下命令,修改/etc/profile文件:
$ sudo vi /etc/profile
在该文件中加入以下代码,使flume命令可以在任意目录下执行:
export FLUME_HOME=/opt/modules/apache-flume-1.9.0-bin export PATH=$PATH:$FLUME_HOME/bin
刷新/etc/profile文件使修改生效:
$ source /etc/profile
在任意目录下执行flume-ng命令,若能成功输出如下参数信息,则说明环境变量配置成功:
Flume配置文件是一个Java属性文件,里面存放键-值对字符串。Flume对配置文件的名称和路径没有固定的要求,但一般都放在Flume安装目录的conf文件夹中。
在Flume安装目录的conf文件夹中新建配置文件flume-conf.properties,并在其中加入以下内容:
上述配置属性解析如下:
上述配置信息描述了一个单节点的Flume部署,允许用户生成数据并发送到Flume,Flume接收到数据后会输出到控制台。该配置定义了一个名为a1的Agent。a1的Source组件监听端口44444上的数据源,并将接收到的event发送给Channel,a1的Channel组件将接收到的event缓冲到内存,a1的Sink组件最终将event输出到控制台。
Flume的配置文件中可以定义多个Agent,在启动Flume时可以指定使用哪一个Agent。
在任意目录执行以下命令,启动Flume:
$ flume-ng agent \ --conf conf \ --conf-file $FLUME_HOME/conf/flume-conf.properties \ --name a1 \ -Dflume.root.logger=INFO,console
上述代码中各参数的含义如下:
部分启动日志如下:
启动成功后,新开一个SSH窗口,执行以下命令,连接本地44444端口:
$ telnet localhost 44444
若提示找不到telnet命令,则执行以下命令安装telnet组件:
$ yum install -y telnet
安装成功后,重新连接44444端口,命令及输出信息如下:
[hadoop@centos01 ~]$ telnet localhost 44444 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
此时继续输入任意字符串(此处输入字符串“hello”)后按回车键,向本地Flume发送数据。然后回到启动Flume的SSH窗口,可以看到控制台成功打印出了接收到的数据“hello”,如图3-10所示。
图3-10 控制台打印接收到的数据
为什么要进行多节点数据采集?
本小节根据1.2节的系统数据流设计,配置3个Flume节点进行用户行为数据的采集。具体思路是,在centos01节点、centos02节点、centos03节点都安装Flume,centos01节点和centos02节点的Flume负责实时监控指定的日志文件数据,并将监控到的新数据发送到centos03节点中的Flume进行合并,centos03节点中的Flume将接收到的数据打印到当前主机的控制台。整个过程的数据流架构如图3-11所示。
图3-11 Flume多节点数据流架构
具体操作步骤如下。
分别在centos01节点和centos02节点的/opt/modules/data目录中创建user_behavior_info日志文件,用于存储用户行为日志信息。
在centos01节点安装Flume,并创建配置文件flume-conf.properties,该文件的配置内容如下:
在centos02节点安装Flume,并创建配置文件flume-conf.properties,该文件的配置内容与上述centos01节点的Flume配置内容相同。
在centos03节点安装Flume,并创建配置文件flume-conf.properties,该文件的配置内容如下:
首先在centos03节点上执行以下命令,启动Flume:
启动后将在当前节点的5555端口监听数据。
然后分别在centos01节点、centos02节点上执行上述同样的命令,启动Flume。
接下来向centos01节点的日志文件user_behavior_info中写入测试数据“hello flume1”:
[hadoop@centos01 data]$ echo 'hello flume1'>>user_behavior_info
向centos02节点的日志文件user_behavior_info中写入测试数据“hello flume2”:
[hadoop@centos02 data]$ echo 'hello flume2'>>user_behavior_info
此时观察centos03节点控制台的输出信息,如图3-12所示。
图3-12 centos03节点的Flume输出接收到的数据
发现centos03节点成功接收到了centos01节点和centos02节点的日志文件数据,Flume多节点数据采集配置成功。