大数据开发工程师-第七周 第1章 极速入门Flume


第七周 第1章 极速入门

什么是Flume

1
2
3
4
5
6
7
8
9
先来看一下官方解释
Flume是一个高可用,高可靠,分布式的海量日志采集、聚合和传输的系统,能够有效的收集、聚合、移动大量的日志数据。
其实通俗一点来说就是Flume是一个很靠谱,很方便、很强的日志采集工具。

他是目前大数据领域数据采集最常用的一个框架
为什么它这么香呢?
主要是因为使用Flume采集数据不需要写一行代码,注意是一行代码都不需要,只需要在配置文件中随便写几行配置Flume就会死心塌地的给你干活了,是不是很香?

看这个图,这个属于Flume的一个非常典型的应用场景,使用Flume采集数据,最终存储到HDFS上。

H4pUiV.png

1
2
3
4
5
6
7
8
  左边的web server表示是一个web项目,web项目会产生日志数据,通过中间的Agent把日志数据采集到HDFS中。
其中这个Agent就是我们使用Flume启动的一个代理,它是一个持续传输数据的服务,数据在Agent内部的这些组件之间传输的基本单位是Event

从图中可以看到,Agent是由Source、Channel、Sink这三大组件组成的,这就是Flume中的三大核心组件,其中source是数据源,负责读取数据
channel是临时存储数据的,source会把读取到的数据临时存储到channel中
sink是负责从channel中读取数据的,最终将数据写出去,写到指定的目的地中

后面我们会详细分析这三大组件。

Flume的特性

1
2
3
1. 它有一个简单、灵活的基于流的数据流结构,这个其实就是刚才说的Agent内部有三大组件,数据通过这三大组件流动的
2. 具有负载均衡机制和故障转移机制,这个后面我们会详细分析
3. 一个简单可扩展的数据模型(Source、Channel、Sink),这几个组件是可灵活组合的

Flume高级应用场景

1
2
3
前面我们分析了Flume的典型常见应用场景,下面来看一下Flume的高级应用场景

看这个图,这个图里面主要演示了Flume的多路输出,就是可以将采集到的一份数据输出到多个目的地中,不同目的地的数据对应不同的业务场景。

一对多的输出

H49eOJ.png

1
2
3
4
5
6
7
8
9
10
11
12
13
下面来详细分析一下
这个图里面一共有两个Agent,表示我们启动了2个Flume的代理,或者可以理解为了启动了2个flume的进程。

首先看左边这个agent,给他起个名字叫 foo
这里面有一个source,source后面接了3个channel,表示source读取到的数据会重复发送给每个channel,每个channel中的数据都是一样的

针对每个channel都接了一个sink,这三个sink负责读取对应channel中的数据,并且把数据输出到不同的目的地,

sink1负责把数据写到hdfs中
sink2负责把数据写到一个Java消息服务数据队列中
sink3负责把数据写给另一个Agent

注意了,Flume中多个Agent之间是可以连通的,只需要让前面Agent的sink组件把数据写到下一个Agent的source组件中即可。
1
2
3
4
所以sink3就把数据输出到了Agent bar中
在Agent bar中同样有三个组件,source组件其实就获取到了sink3发送过来的数据,然后把数据临时存储到自己的channel4中,最终再通过sink组件把数据写到其他地方。

这就是这个场景的应用,把采集到的一份数据重复输出到不同的目的地中

flume的汇聚功能

1
接着再看下面这张图,这张图主要表示了flume的汇聚功能,就是多个Agent采集到的数据统一汇聚到一个Agent

H4ifAA.png

1
2
3
4
5
6
7
8
9
10
下面来详细分析一下,
这个图里面一共启动了四个agent,左边的三个agent都是负责采集对应web服务器中的日志数据,数据采集过来之后统一发送给agent4,最后agent4进行统一汇总,最终写入hdfs。

这种架构的好处是后期如果要修改最终数据的输出目的地,只需要修改agent4中的sink即可,不需要修改agent1、2、3。

但是这种架构也有弊端,
1. 如果有很多个agent同时向agent4写数据,那么agent4会出现性能瓶颈,导致数据处理过慢
2. 这种架构还存在单点故障问题,如果agent4挂了,那么所有的数据都断了。

不过这些问题可以通过flume中的负载均衡和故障转移机制解决,后面我们会详细分析

Flume的三大核心组件

1
2
3
4
5
Flume的三大核心组件:
Source:数据源
Channel:临时存储数据的管道
Sink:目的地
接下来具体看一下这三大核心组件都是干什么的

Source

1
2
3
Source:数据源:通过source组件可以指定让Flume读取哪里的数据,然后将数据传递给后面的channel

Flume内置支持读取很多种数据源,基于文件、基于目录、基于TCP\UDP端口、基于HTTP、Kafka的等等、当然了,如果这里面没有你喜欢的,他也是支持自定义的

Exec Source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
在这我们挑几个常用的看一下:
Exec Source:实现文件监控,可以实时监控文件中的新增内容,类似于linux中的tail -f 效果。

在这需要注意 tail -F 和 tail -f 的区别
tail -F
等同于–follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪

tail -f
等同于–follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止

在实际工作中我们的日志数据一般都会通过log4j记录,log4j产生的日志文件名称是固定的,每天定时给文件重命名
假设默认log4j会向access.log文件中写日志,每当凌晨0点的时候,log4j都会对文件进行重命名,在access后面添加昨天的日期,然后再创建新的access.log记录当天的新增日志数据。

这个时候如果想要一直监控access.log文件中的新增日志数据的话,就需要使用tail -F

NetCat TCP/UDP Source

1
NetCat TCP/UDP Source: 采集指定端口(tcp、udp)的数据,可以读取流经端口的每一行数据

Spooling Directory Source

1
采集文件夹里新增的文件

Kafka Source

1
从Kafka消息队列中采集数据
1
注意了,前面我们分析的这几个source组件,其中exec source 和 kafka source在实际工作中是最常见的,可以满足大部分的数据采集需求。

channel

1
2
3
4
5
Channel:接受Source发出的数据,可以把channel理解为一个临时存储数据的管道

Channel的类型有很多:内存、文件,内存+文件、JDBC等

接下来我们来分析一下

Memory Channel

1
2
3
4
5
Memory Channel:使用内存作为数据的存储
优点是效率高,因为就不涉及磁盘IO
缺点有两个
1:可能会丢数据,如果Flume的agent挂了,那么channel中的数据就丢失了。
2:内存是有限的,会存在内存不够用的情况

File Channel

1
2
3
4
5
6
File Channel:使用文件来作为数据的存储
优点:是数据不会丢失

缺点:是效率相对内存来说会有点慢,但是这个慢并没有我们想象中的那么慢

所以这个也是比较常用的一种channel。

Spillable Memory Channel

1
2
3
4
Spillable Memory Channel:使用内存和文件作为数据存储,即先把数据存到内存中,如果内存中数据达到阈值再flush到文件中

优点:解决了内存不够用的问题。
缺点:还是存在数据丢失的风险

sink

1
2
3
4
Sink:从Channel中读取数据并存储到指定目的地
Sink的表现形式有很多:打印到控制台、HDFS、Kafka等,

注意:Channel中的数据直到进入目的地才会被删除,当Sink写入目的地失败后,可以自动重写,不会造成数据丢失,这块是有一个事务保证的。

常用的sink组件有

1
2
3
4
5
Logger Sink:将数据作为日志处理,可以选择打印到控制台或者写到文件中,这个主要在测试的时候使用

HDFS Sink:将数据传输到HDFS中,这个是比较常见的,主要针对离线计算的场景

Kafka Sink:将数据发送到kafka消息队列中,这个也是比较常见的,主要针对实时计算场景,数据不落盘,实时传输,最后使用实时计算框架直接处理。

Flume安装部署

下载

Flume安装部署

1
2
3
4
5
6
7
8
想要使用Flume采集数据,那肯定要先安装Flume
在这里我重新克隆了一台Linux机器,主机名设置为bigdata04,ip设置为192.168.206.132

屏蔽防火墙,安装jdk并配置环境变量,因为Flume是java开发,所以需要依赖jdk环境

直接克隆的bigdata01虚拟机的当前状态:ip和hostname需要改,防火墙和java环境已经配置好了,ip映射需要添加

这些工作已经提前做好了,继续往下面分析

image-20230317004041127

1
2
3
4
5
6
安装包下载好以后上传到linux机器的/data/soft目录下,并且解压

修改盘flume的env环境变量配置文件
在flume的conf目录下,修改flume-env.sh.template的名字,去掉后缀template

这样就好了,Flume的安装是不是很简单,这个时候我们不需要启动任何进程,只有在配置好采集任务之后才需要启动Flume。

本文标题:大数据开发工程师-第七周 第1章 极速入门Flume

文章作者:TTYONG

发布时间:2022年02月16日 - 22:02

最后更新:2023年03月17日 - 00:03

原始链接:http://tianyong.fun/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88-%E7%AC%AC%E4%B8%83%E5%91%A8-%E7%AC%AC1%E7%AB%A0-%E6%9E%81%E9%80%9F%E5%85%A5%E9%97%A8Flume.html

许可协议: 转载请保留原文链接及作者。

多少都是爱
0%