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/appssudo chown v2admin:v2admin -R /opt/apps# 3.解压tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/appscd /opt/appsmv apache-flume-1.9.0-bin flume# 4.批改环境变量sudo vim /etc/profile.....// 在最初增加如下export FLUME_HOME=/opt/apps/flumeexport PATH=$PATH:$FLUME_HOME/bin.....source /etc/profile# 5.批改配置文件cd /opt/apps/flume/confcp flume-env.sh.template flume-env.shvim flume-env.sh....export JAVA_HOME=/usr/local/jdk8// 改成本人的java目录....

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

[v2admin@hadoop10 conf]$ flume-ng versionFlume 1.9.0Source code repository: https://git-wip-us.apache.org/repos/asf/flume.gitRevision: d4fcab4f501d41597bc616921329a4339f73585eCompiled by fszabo on Mon Dec 17 20:45:25 CET 2018From 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/flumestouch netcat-logger.confvim netcat-logger.conf....# 这是官网中的一个示例# Name the components on this agenta1.sources = r1a1.sinks = k1a1.channels = c1# Describe/configure the sourcea1.sources.r1.type = netcata1.sources.r1.bind = localhosta1.sources.r1.port = 44444# Describe the sinka1.sinks.k1.type = logger# Use a channel which buffers events in memorya1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100# Bind the source and sink to the channela1.sources.r1.channels = c1a1.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 worldOK....# 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 }....