Flume日志采集系统 (flume的翻译叫水槽:它就是管道输送)
http://flume.apache.org/releases/content/1.6.0/FlumeUserGuide.html
1.Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和移动大量日志数据。
它具有基于流数据流的简单灵活的架构。
它具有可靠的可靠性机制和许多故障转移和恢复机制,具有强大的容错能力。
2.Flume原始版本为Flume-OG,经过对整体架构的重新设计,已改名为Flume-NG.
Flume发展到现在已经不仅限于日志采集,还可以通过简单的配置收集不同数据源的海量数据并将数据准确
高效地传输到不同的中心存储.目前Flume可以对接的主流大数据框架有Hadoop、Kafka、ElasticSearch、
Hive、HBase等
3.Flume基本架构(FLume-NG)
flume三个组件:[Source(数据源)、Channel(通道)、Sink(接收器)]==Agent(代理)
4.Flume工作原理
从设置角度讲,Flume是一个灵活的分布式系统,提供多种不同来源高效收集、
聚合和传送大量数据到集中式数据存储的可靠且可扩展的方式。
以下是关键概念列表。理解了这些概念,就可以更好地理解Flume的架构及其工作原理:
一个event在一个agent中的传输流程参照【event在agent传输流程图.png】
Source-->Interceptor-->Selector-->Channel-->Sink Processor-->Sink-->存储中心/下一个Agent
客户端(client):生成事件并将它们发送到一个或多个代理的实体。
如果你的应用程序内嵌了Flume代理,那么无需客户端.
事件(Event): 一条消息或者说是一条数据,具有可选头信息,在头信息中可以设置时间戳、主机名称等信息
代理(Agent):Flume的部署单位,包含source、channel、sink等组件的flume进程
源(Source):数据源,接收或者收集不同形式的数据源,从指定地点接收事件并将其放入一个或多个通道
通道(Channel):event的临时缓冲区,source先将event发送到chanel缓存等待sink拉取
接收器(Sink):主动组件,从Channel中拉取Event并将它们传送到最终目的地HDFS或流中的下一个代理Agent。
拦截器(Interceptor):可选组件,event拦截器,根据配置文件在event的header中添加时间戳、主机名称等信息
Sink Processor:event sink处理器,flume提供了故障转移处理器和负载均衡处理器
流(Flow):从事件的源头到其最终目的地之间的管道。最简单的Agent代理只有一个流.
Flume可靠性
Flume 使用事务性的方式保证传送Event整个过程的可靠性。Sink必须在Event被存入Channel后,
或者,已经被传达到下一站agent里,又或者,已经被存入外部数据目的地之后,
才能把Event从Channel中remove 掉。这样数据流里的event无论是在一个agent里还是多个
agent 之间流转都能保证可靠,因为以上的事务保证了event会被成功存储起来。
比如 Flume支持在本地保存一份文件 channel 作为备份,而memory channel 将 event存在内存 queue 里,
速度快,但丢失的话无法恢复。
3.安装:
a.下载Flume1.6.0版本
$>cp /mnt/hgfs/2.安装环境/download/apache-flume/apache-flume-1.6.0-bin.tar.gz /home/crx/soft/
b.解压至{home/crx/soft}
$>tar -zxvf apache-flume-1.6.0-bin.tar.gz
$>rm apache-flume-1.6.0-bin.tar.gz
$>ln -s apache-flume-1.6.0-bin/ flume
c.配置环境变量
$>cd ~
$>gedit .bash_profile
追加以下代码:
#Flume install
export FLUME_HOME=/home/crx/soft/flume
export PATH=$FLUME_HOME/bin:$PATH
d.安装完成!!
查看Flume安装目录bin/下,只有flume-ng命令
验证成功:$>flume-ng version
nameserver 8.8.8.8
案例测试:收集socket端数据,并显示到logger端
1.在linux中安装netcat工具,用户开启Socket客户端:
a.切换至root下
$>su root
b.nc安装命令
$>yum install -y nc
c.切换至crx用户下,模拟聊天室:
$>nc
开启服务器端:$>nc -l 55555
开启客户端 :$>nc localhost 55555
2.创建Agent
编写Agent配置信息,在{FLUME_HOME/conf}目录下,新建文件:ncAgent.conf,添加以下代码:
a1.sources = s1
a1.channels = c1
a1.sinks = k1
#定义agent的source属性
a1.sources.s1.type = netcat
a1.sources.s1.bind = master
a1.sources.s1.port = 55555
#配置agent的sink属性
a1.sinks.k1.type = logger
#配置agent的channel的属性
a1.channels.c1.type = memory
a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1 #注意:a1.sinks.k1.channel后不用有s
3.开启flume进程:
$>flume-ng agent --name a1 --conf /home/crx/soft/flume/conf/ --conf-file /home/crx/soft/flume/conf/ncAgent.conf -Dflume.root.logger=INFO,console
或者:
$>flume-ng agent -n a1 -c /home/crx/soft/flume/conf/ -f /home/crx/soft/flume/conf/ncAgent.conf -Dflume.root.logger=INFO,console
4.开启nc客户端:
$>nc master 55555
hello world
zhang san
5.结果:
在flume的会话窗口中,显示以下信息:
Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64 hello world }
Event: { headers:{} body: 7A 68 61 6E 67 20 73 61 6E zhang san }
File Channel:
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /home/crx/flumeAAA/checkpoint
a1.channels.c1.dataDirs = /home/crx/flumeAAA/data
flume的可恢复性 推荐使用FileChannel,事件持久化在本地文件系统里(性能较差)
自动生成flumeAAA文件夹
案例测试:收集socket端数据,并获取后写入到本地磁盘
netcat-fileroll.conf
1.编写agent
a1.sources=s1
a1.channels=c1
a1.sinks=k1
#定义agent的source属性
a1.sources.s1.type=netcat
a1.sources.s1.bind=master
a1.sources.s1.port=55555
#配置agent的sink属性
#/home/crx/tmp/flume 需要事先创建好此文件夹 【mkdir】 flume
a1.sinks.k1.type=file_roll
a1.sinks.k1.sink.directory=/home/crx/tmp/flume
#每30秒滚动一次文件。指定0将禁用滚动并导致所有事件都写入单个文件
a1.sinks.k1.sink.rollInterval=0
#配置agent的channel的属性
a1.channels.c1.type=memory
a1.sources.s1.channels=c1
a1.sinks.k1.channel=c1
2.执行:
$>flume-ng agent --name a1 --conf /home/crx/soft/flume/conf/
--conf-file /home/crx/soft/flume/conf/netcat-fileroll.conf
-Dflume.root.logger=INFO,console
3.开启nc客户端4个会话
$>nc master 55555 hello word
$>nc master 55555 hello
$>nc master 55555 hello123
$>nc master 55555 hello1234
4.查看采集目录
$>cd /home/crx/tmp/flume
$>ll
-rw-rw-r--. 1 crx crx 0 Sep 10 14:03 1536613249150-7
-rw-rw-r--. 1 crx crx 0 Sep 10 14:04 1536613249150-8
-rw-rw-r--. 1 crx crx 0 Sep 10 14:04 1536613249150-9
-rw-rw-r--. 1 crx crx 0 Sep 10 14:06 1536613569603-1
[crx@master flume0804]$ cat 1564884105308-1
hello word
hello
hello123
hello1234
经过测试a1.sinks.k1.sink.rollInterval=10
每10秒自动生成文件,不管source是否传来数据,都会自动生成文件
案例测试:定义 一个agent 两套流(FLow)
1.实现要求:前提条件为一个Agent(代理)
a.监控44444端口,收集的数据写入到本地磁盘{/home/crx/tmp/flume} (本地磁盘要事先创建文件)
b.监控55555端口,收集的数据显示到logger
2.编写Agent:
在{FLUME_HOME/conf}下新建one-agent.conf文件
a1.sources=s1 s2
a1.channels=c1 c2
a1.sinks=k1 k2
#定义agent的source属性
a1.sources.s1.type=netcat
a1.sources.s1.bind=master
a1.sources.s1.port=44444
a1.sources.s2.type=netcat
a1.sources.s2.bind=master
a1.sources.s2.port=55555
#配置agent的sink属性
a1.sinks.k1.type=file_roll
a1.sinks.k1.sink.directory=/home/crx/tmp/flume
a1.sinks.k1.sink.rollInterval=0
a1.sinks.k2.type=logger
#配置agent的channel的属性
a1.channels.c1.type=memory
a1.channels.c2.type=memory
#source-->channel-->sink
a1.sources.s1.channels=c1
a1.sinks.k1.channel=c1
#source-->channel-->sink
a1.sources.s2.channels=c2
a1.sinks.k2.channel=c2
3.开启flume-ng
$>flume-ng agent --name a1 --conf /home/crx/soft/flume/conf/
--conf-file /home/crx/soft/flume/conf/one-agent.conf
-Dflume.root.logger=INFO,console
4.开启nc客户端
$>nc master 44444
$>nc master 55555