1.Flume概述

flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。
支持在日志系统中定制各类数据发送方,用于收集数据;
同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。

2.Flume基础组成

2.1 Agent

Flume运行核心是Agent,Agent是一个JVM进程,它以Event(事件)的形式将数据从源头送到目的地。
一个Agent含有三个核心组件,分别是source、channel、sink。

2.2 Event

数据传输单元,由Header和Body两部分构成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。

2.3 Source

Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy,同样支持自定义source。

2.4 Channel

中转Event的一个临时存储,保存由Source组件传递过来的Event。它是Source和Sink之间的缓冲区,且是线程安全的,可以同时处理多个Source的写入和Sink的读取操作。
常用的有两种channel:MemoryChannel和FileChannel。
memory channel是内存中的队列,能够实现高速的吞吐,缺点就是机器宕机、程序重启或者挂了都会导致数据丢失。
File channel 是将事件写入磁盘,能够持久化保存数据

2.5 Sink

轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent,支持自定义sink

3.Flume安装部署

Flume安装部署非常简单

# 1. 上传jar包至服务器
# 2.创建安装目录
sudo mkdir /opt/apps
sudo chown v2admin:v2admin -R /opt/apps
# 3.解压
tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/apps
cd /opt/apps
mv apache-flume-1.9.0-bin flume
# 4.修改环境变量
sudo vim /etc/profile
.....
// 在最后添加如下
export FLUME_HOME=/opt/apps/flume
export PATH=$PATH:$FLUME_HOME/bin
.....
source /etc/profile
# 5.修改配置文件

cd /opt/apps/flume/conf
cp flume-env.sh.template flume-env.sh
vim flume-env.sh
....
export JAVA_HOME=/usr/local/jdk8
// 改成自己的java目录
....

至此部署完成,可通过flume-ng version 查看版本

[v2admin@hadoop10 conf]$ flume-ng version
Flume 1.9.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: d4fcab4f501d41597bc616921329a4339f73585e
Compiled by fszabo on Mon Dec 17 20:45:25 CET 2018
From source with checksum 35db629a3bda49d23e9b3690c80737f9

4 Flume 部署类型

4.1 单一流程


这是最简单的部署方式。

4.2 串联

可以将多个Agent顺序连接起来,将最初的数据源经过收集,存储到最终的存储系统中,一般情况下,应该控制这种顺序连接的Agent 的数量,
Agent数量过多不仅会影响传输速率,而且一旦传输过程中某个节点宕机,会影响整个传输系统。

4.3 多个流的聚合


这种模式是最常见的,也最常用的模式。
例如,一些web应用通常分布在上百个服务器,大者甚至上千个、上万个服务器,产生的日志,每台服务器部署一个flume采集日志,传送到一个集中收集日志的flume,
再由此flume上传到hdfs、hive、hbase等,进行日志分析。

4.4 多路复用

这种模式可以将相同数据复制到多个channel中,或者将不同数据分发到不同的channel中,sink可以选择传送到不同的目的地。
当java, nginx、 tomcat等混合在一起的日志流开始流入一个flume的agent后,可以使用这种模式,将agent中将混杂的日志流分开,
然后给每种日志建立一个自己的Agent。

4.4 负载均衡和故障恢复


Agent1是一个路由节点,负责将Channel暂存的Event均衡到对应的多个Sink组件上,而每个Sink组件分别连接到一个独立的Agent上 ,这个就是负载均衡。
同样也可以实现,当Agent2、Agent3、Agent4其中一个节点故障后,转移到其他节点上使用,实现故障转移。

5.入门示例

  • 使用Flume监听一个端口,收集该端口数据,并打印到控制台

这个示例是官网手册中有 查看地址http://flume.apache.org/FlumeUserGuide.html

# 1.安装netcat,如果有就不需要安装了
sudo yum install -y nc
# 2.配置(我的配置保存在flume下的jobs目录中)
cd /opt/apps/flumes
touch netcat-logger.conf
vim netcat-logger.conf
....
# 这是官网中的一个示例
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

# Describe the sink
a1.sinks.k1.type = logger

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
....

# 3.开启两个终端窗口
# 3.1 终端1 开启监听
flume-ng agent -c conf/ -n a1 -f jobs/flume-netcat-logger.conf -Dflume.root.logger=INFO,console

# 3.2 终端2 使用netcat工具向本机的44444端口发送内容
nc localhost 44444
....
hello world
OK
....

# 3.3 在监听端观察
....
2020-12-26 09:22:21,818 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] 
Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64                hello world }

....

leafgood
183 声望15 粉丝

踏入IT这个圈子,就成了一名玩家,想要走的更远,就要不断给自己技能加点才行。