Flume基础
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 }
....