在大数据时代背景下,如何收集有用信息已成为大数据发展的关键因素之一。数据采集可以说是大数据产业的基石。 Flume作为一个开源的数据采集系统,已经得到业界的认可并广泛应用。本文将带您了解Flume 的基本架构和用例。
01
Flume简介
1.1什么是Flume?
Flume是Apache软件基金会的顶级项目。它是一个分布式、可靠且可用的系统,主要设计用于有效收集、聚合大量日志数据并将其从不同来源移动到集中式数据存储中。
Flume的用途不仅仅限于日志数据聚合。由于数据源是可定制的,Flume 可用于传输大量事件数据,包括但不限于网络流量数据、社交媒体数据、电子邮件消息以及几乎任何可能的数据源。
1.2 水槽外部结构
数据生成器产生的数据由服务器上的Agent收集,然后数据收集容器收集各个Agent的数据并将收集到的数据存储到HDFS或HBase中。同时Flume还具有以下特点:
使用Flume,我们可以快速将从多个服务器获取的数据传输到Hadoop;支持多种接入数据类型和出站数据类型;支持多路径流量、多路访问流量、多路出站流量、上下文路由等;支持水平扩展。 02
Flume的一些核心概念
Client:客户端,产生数据,运行在单独的线程中。
事件:事件是由消息头和消息体组成的数据单元。
Agent:一个独立的Flume进程,包括Source、Channel、Sink组件。
Source:数据采集端负责捕获数据后进行特殊格式化,将数据封装成Event,然后推送到Channel中。
Channel:中转Events的临时存储,保存Source组件传递过来的Events。
Sink:从Channel中读取并移除Event,并将Event传递给下一个Agent。
2.1 Flume代理结构
Flume内部有一个或多个Agent,它们是Flume运行的核心。然而,对于每个Agent来说,它都是一个独立的守护进程(JVM)。它从客户端或其他Agent接收数据,然后快速将其传递到下一个目标节点、Sink或Agent。
Flume采用Agent作为最小的独立运行单元。它是一个完整的数据采集工具,包含三个核心组件,分别是Source、Channel、Sink。其工作流程是:从数据源(Source)收集数据,然后将收集到的数据发送到指定的目的地(Sink)。为了保证传输过程成功,数据在发送到目的地之前会被缓存(Channel)。当数据真正到达目的地(Sink)后,Flume会删除缓存的数据。
2.2 来源
Source负责数据的生成或收集,捕获数据后进行特殊格式化,封装成Event,然后push到Channel中。一般是连接到一些RPC程序或者其他Flume节点的sink,接收来自数据生成器的数据,并将接收到的数据以Event格式传递到一个或多个通道。 Flume提供了多种数据接收方式,如avro、thrift、netcat、序列生成器、syslog、http等。如果内置的Source不能满足您的需求,Flume还支持定制。
2.3频道
Channel是一个短暂的存储容器,负责数据的存储和持久化。可以持久化到jdbc、文件、内存中。它缓存从Source 接收到的Event 格式的数据,直到它们被Sink 消耗。可以查看Channel 是一个队列。队列的优点是先进先出。队列放入后,Event 就一一出来了。 Flume非常重视数据传输,因此几乎没有数据解析和预处理。只是数据的产生,封装成Event,然后传输。只有当数据存储到下一个存储位置时,才会从当前Channel中删除数据。这个过程是通过事务来控制的,从而保证了数据的可靠性。
然而Flume的持久性也有容量限制。比如内存超过一定量,分配不够,也会爆炸。
2.4 水槽
Sink负责数据转发,并将数据存储在Hbase、HDFS等集中存储中。它消耗来自Channel 的数据并将其传送到目的地。目的地可能是另一个Sink,也可能是hdfs、logger、avro、thrift、file、Hbase、solr 或自定义的。
Sink从Channel中取出事件,然后将数据发送到其他地方。它可以将数据存储在文件系统、数据库、hadoop 中,也可以是其他代理的来源。当日志数据较小时,可以将数据存储在文件系统中,并可以设置一定的时间间隔来保存数据。
Sink支持设置存储数据位置。当日志数据较小时,可以将数据存储在文件系统中,并可以设置一定的时间间隔来保存数据。当日志数据量较大时,可以将相应的日志数据存储在Hadoop中,方便以后进行相应的数据分析。
2.5 事件
Flume 使用Event 对象作为传输数据的格式。特点如下:
Event封装了传输的数据,是Flume传输数据的基本单位。如果是文本文件,通常是一行记录。
事件也是交易的基本单位。
Event从Source流向Channel,再流向Sink。它是一个字节数组,可以携带头信息。
事件代表最小的完整数据单元,来自外部数据源并前往外部目的地。
一个完整的事件包括:标题、正文和事件信息(即文本文件中的单行记录)。 body是一个包含实际内容的字节数组,如下图所示:
03
Flume 拦截器、数据流和可靠性
3.1 水槽拦截器
当我们需要过滤数据时,除了Source、Channel、Sink中的代码修改外,Flume还为我们提供了一个拦截器,位于Source和Channel之间,用于在日志进入Source之前对其进行包装。清洗、过滤等动作。
当我们为Source指定一个拦截器时,我们就会在其中获取Event。我们可以根据需要保留或丢弃该Event。被丢弃的数据不会进入Channel。
3.2 Flume数据流
Flume的核心是从数据源收集数据,然后发送到目的地。为了保证传输成功,数据在发送到目的地之前会被缓存。当数据真正到达目的地后,缓存的数据将被删除。
Flume传输数据的基本单位是Event。如果是文本文件,通常是一行记录。事件从Source流向Channel,然后流向Sink。它是一个字节数组,可以携带头信息。事件代表数据流的最小完整单元,来自外部数据源并前往外部目的地。
值得注意的是Flume提供了大量内置的Source、Channel和Sink类型。不同类型可以自由组合。组合方式根据用户设置的配置文件,非常灵活。例如:Channel可以将事件临时存储在内存中或者持久化到本地硬盘。 Sink 可以将日志写入HDFS、HBase 或其他源。 Flume支持用户建立多级流,也就是说多个Agent可以协同工作,这也是Flume的强大之处。
3.3 水槽可靠性
Flume通过以下方式保证其可靠性:
Flume如何保证单跳的可靠性:直到传输完成,事件才会从通道中移除;
Flume采用事务方式来保证事件交互的可靠性;
Flume可以临时存储数据。当目标不可访问时,数据会暂时存储在Channel中,待目标可访问后传输;
数据处理过程中,如果由于网络中断等原因导致某一步骤被迫结束,则下次数据将重新传输;
Source和Sink封装在事务的存储和检索中,即事件的放置或提供由事务通过通道提供,确保事件集在流中端到端可靠地传递。
04
Flume使用场景****
Flume在英语中是水道的意思。它更像是一根可以随意组装的消防水带。根据官方文档,Flow有以下几种类型。
4.1 单一智能体收集数据
单个Agent收集数据源并将其存储在最终的外部系统中。这是最简单的情况。
4.2 多个agent顺序连接
多个Agent依次连接,收集初始数据源,最终存储在外部系统中。一般来说,应该控制按这个顺序连接的Agent数量,因为数据流经的路径变长,如果出现故障,整个服务都会受到影响。
4.3 多Agent数据采集
日志收集中一个非常常见的场景是大量日志生成客户端将数据发送到连接到存储子系统的消费者代理。例如,从数百个Web 服务器收集的日志被发送到写入HDFS 集群的多个代理。
这可以在Flume 中通过为多个第一层代理配置avro 接收器来实现,所有代理都指向单个代理的avro 源。第二层代理上的源将接收到的事件组合到一个通道中,该通道由接收器消耗到其最终目的地。
4.4 多级流程
Flume支持多级流,那么什么是多级流呢?让我们举个例子。当syslog、java、nginx、tomcat等混合日志流开始流入某个agent时,可以在agent中将混合日志流分开,然后为每种类型的日志建立自己的传输通道。
上面的示例显示了来自代理“foo”的源将流扩展到三个不同的通道。
值得注意的是,多个Agent级联时,一个Source可以连接多个Channel,但一个Channel只能连接一个Sink。
05
Flume的优点和缺点
5.1 优点
Flume可以将应用程序产生的数据存储到各种集中式存储器中;
Flume提供上下文路由功能;
Flume的管道基于事务,保证传输和接收过程中数据的一致性;
Flume 可靠、容错、可扩展、易于管理、可定制;
Flume可以实时分析数据并将数据保存在数据库或其他系统中;
当收集数据的速度超过写入数据的速度时,即信息的收集达到峰值时,收集到的信息非常大,甚至超过了系统写入数据的能力。这时候Flume就会在数据生产者和系统之间进行数据的拆分。数据容器在两者之间进行调整,以确保能够在两者之间提供稳定的数据。
5.2 缺点
Flume的配置比较繁琐。 Source、Channel、Sink之间的关系在配置文件中交织在一起,不方便管理。