Flume-分布式日志采集

一.Flume的概述

1)Flume是什么

1.flume能做什么
Flume是一种分布式(各司其职),可靠且可用的服务,用于有效地收集,聚合(比如某一个应用搭建集群,在做数据分析的时候,将集群中的数据汇总在一起)和移动大量日志数据。Flume构建在日志流之上一个简单灵活的架构。
2.flume的特性
①它具有可靠的可靠性机制和许多故障转移和恢复机制,具有强大的容错性。使用Flume这套架构实现对日志流数据的实时在线分析
②Flume支持在日志系统中定制各类数据发送方(可以从不同地方取数据),用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
注意:当前Flume有两个版本Flume 0.9X版本的统称Flume-og,Flume1.X版本的统称Flume-ng。由于Flume-ng经过重大重构,与Flume-og有很大不同,使用时请注意区分。这里使用的是apache-flume-1.9.0-bin.tar.gz。

链接:http://flume.apache.org/download.html
apache-flume-1.9.0-bin.tar.gz:是编译过的文件,可运行文件,文件大,含有第三方依赖。
apache-flume-1.9.0-src.tar.gz:项目的源码文件,想使用需要编译。

2)Flume架构

①Agent:最小日志采集单元,所谓的Flume的日志采集是通过拼装若干个Agent完成的。
②Event:原生的日志流封装成event对象,包含EventHeader:Map,EventBody:字节数组内容。
③Source:负责采集数据,通过网络方式读取外围应用的数据,将event数据push到Channel队列中。
④Channel 通道-队列结构:event事件队列起到缓冲的作用。
⑤Sink:负责从Channel中take数据,并将原生日志流数据输送出去给外围系统。
⑥复制:source收集到一则消息后,同时发送给这两个通道,这一个消息存在两个通道中。
⑦分流:根据信息的特点发送给不同的通道。
⑧拦截器:拦截或者装饰event。
⑨通道选择器:复制,分流由通道选择器决定。
⑩SinkGroup:逻辑的Sink,里边有多个sink。
两种工作模式:负载均衡,两个小sink轮流从通道中取数据,轮流把数据写出去。
故障转移,只有当其中的一个sink宕机,另一个sink才工作。
一般情况下,一个通道对应一个SinkGroup,一个SinkGroup可以有多个sink。

在这里插入图片描述

3)Agent配置模板说明

①example1.properties 单个Agent的配置,将该配置⽂件放置在flume安装⽬录下的conf⽬录下,需要自己建文件。

cd /usr/soft/apache-flume-1.9.0-bin/
vim conf/example1.properties

a1:agent的名字
netcat:通常用于测试
在这里插入图片描述②启动a1采集组件前,需要安装插件,并测试确保指令可以用

yum -y install nmap-ncat
yum -y install telnet
nc - help

③监听端口
l:监听端口
k:允许多个人连接这个端口

nc -lk 44444

④启动a1组件

./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example1.properties -Dflume.root.logger=INFO,console

–conf:配置文件存放在哪里。
–name:agent的名字。
–conf-file:启动的是哪个配置文件。
-Dflume.root.logger=INFO,console:覆盖系统配置属性。

⑤发送数据

telnet zly 44444

在这里插入图片描述

二.Flume的组件概述

1)Source-输入源

Avro:用于RPC/序列化,用于机器间通讯的通讯协议,底层使用Avro序列化协议,用在内部系统通信,效率比http效率高。
httpclient:调用其他web服务的客户端工具。
可以设计一个拓补结构,Avro为首选
在这里插入图片描述
在这里插入图片描述

# 声明基本组件 Source Channel Sink example2.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = avro
a1.sources.s1.bind = zly
a1.sources.s1.port = 44444
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example2.properties -Dflume.root.logger=INFO,console

模拟客户端发送

./bin/flume-ng avro-client --host zly --port 44444 --filename /root/t_emp 

②Exec:可以将指令在控制台的输出采集过来,如果进程退出,source也会退出,满足实时性,但是会重新采集。
在这里插入图片描述

# 声明基本组件 Source Channel Sink example3.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = exec
a1.sources.s1.command = tail -F /root/t_emp
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example3.properties -Dflume.root.logger=INFO,console

运行之后直接可以采集到的数据。
检测是否可以动态采集,结果:可以

echo zl >> /root/t_emp

在这里插入图片描述Spooling Directory:采集静态目录下,新增的文本文件,采集完成后回去修改文件后缀,但是不会删除采集的源文件,如果用户只想采集一次,可以修改改source的默认行为,一般用于批处理。
在这里插入图片描述^匹配开头
.匹配任意字符
*匹配0-多个
$匹配结尾
^ $:表示无

# 声明基本组件 Source Channel Sink example4.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = spooldir
a1.sources.s1.spoolDir = /root/spooldir
a1.sources.s1.fileHeader = true
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example4.properties -Dflume.root.logger=INFO,console 

将文件拷贝到指定目录下

cp /root/t_emp /root/spooldir/

在这里插入图片描述查看采集目录,发现后缀名改了,这时再修改文件内容,就不会再采集了,除非修改文件后缀名。
在这里插入图片描述Taildir :可以实时监测动态文本行的追加,并且会记录采集的文件读取位置偏移量,即使下一次再次采集,可以实现增量采集,如果存放偏移量的隐藏文件被删除了就会重新读取数据。
能够一下采集多个目录
在这里插入图片描述

# 声明基本组件 Source Channel Sink example5.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = TAILDIR
a1.sources.s1.filegroups = g1 g2
a1.sources.s1.filegroups.g1 = /root/taildir/.*\.log$
a1.sources.s1.filegroups.g2 = /root/taildir/.*\.java$
a1.sources.s1.headers.g1.type = log
a1.sources.s1.headers.g2.type = java
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1

测试:
1)拷贝以并命名以.log结尾和.java结尾的文件

mkdir /root/taildir  
cp t_emp taildir/t_emp.log 
cp t_emp taildir/t_emp.java     

2)启动a1采集组件,会直接加载数据,之后重启a1采集组件,发现实现了增量采集,并不会重复加载数据。

 ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example5.properties -Dflume.root.logger=INFO,console

3)查看隐藏目录,发现文件记录这偏移量

cat .flume/taildir_position.json   

在这里插入图片描述⑤Kafka

# 声明基本组件 Source Channel Sink example9.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = org.apache.flume.source.kafka.KafkaSource
a1.sources.s1.batchSize = 100
a1.sources.s1.batchDurationMillis = 2000
a1.sources.s1.kafka.bootstrap.servers = zly:9092
a1.sources.s1.kafka.topics = topic01
a1.sources.s1.kafka.consumer.group.id = g1
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1

从Kafka读数据push到channel的最大数量为100
最多一次写入100
channel内存队列的容量
batchSize <= transactionCapacity <= capacity

测试:
1)启动a1采集组件

./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example9.properties -Dflume.root.logger=INFO,console

2)发数据

./bin/kafka-console-producer.sh --broker-list zly:9092 --topic topic01

在这里插入图片描述
3)接收到数据
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌火车滴滴开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值