Flume的概述与入门

Apache Flume 是一个高可用、高可靠的数据采集系统,常用于大规模日志处理。它由 Agent 组成,包含 Source、Sink 和 Channel 三个组件,实现数据的接收、存储和传输。Source 接收数据,如 netcat、spoolingdirectory;Sink 处理并发送数据,如 HDFS、logger;Channel 作为缓冲区,保证数据传输的可靠性。Flume 支持断点续传和负载均衡策略,并可通过 ChannelSelector 和 SinkProcessor 进行定制。安装 Flume 后,可以通过配置文件创建 Agent 实现特定场景的日志收集,例如监听端口或监控文件夹变化。

目录

一、概述

二、Flume的架构

1. Agent

2.Source

3.Sink

4.Channel

5.Event

hdfs sink

三、Flume的安装

四、官方案例


一、概述

        Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。并于2009 年被捐赠给了 apache 软件基金会,是hadoop的一个相关组件。Flume基于流式架构,灵活简单。

        那么为什么使用Flume

        1.HDFS最怕的就是小文件过多,如果直接从磁盘文件夹读取,会产生大量的小文件 

        2.可以解决磁盘IO问题、减少网络IO问题
Flume的三个特性和Hadoop的三个特性的区别

        Flume 高可用:通过重启实现

                  高可靠:不会修改数据

                  伪分布式:多个节点一起做事
        Hadoop 高可用    利用HA和多个NN解决单点故障问题    
                      高可靠    副本机制
                     分布式    多个节点并成集群使用,共同完成任务

二、Flume的架构

1. Agent

        Agent主要有3个部分组成,Source、Channel、Sink。是一个JVM进程,它以事件的形式将数据从源头送至目的地。

2.Source

        Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据

        source:avro、exec、spooling directory、taildir(断点续传、多目录)*、netcat(端口数据)*

3.Sink

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

        sink:hdfs*、logger(将数据打印在控制台)*、avro

4.Channel

        Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作。

        channel:memory(内存)*、file(磁盘)* 安全性和效率

        Flume自带两种Channel:Memory Channel和File Channel。

        Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。

        File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。

5.Event

        传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event由HeaderBody两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。

hdfs sink

roll字段是满足条件文件回滚

字段        默认值       说明
rollInterval    30    滚动文件之前等待的秒数。设置为0表示不会因为时间间隔截断文件
rollSize    1024    触发滚动的文件大小,以字节为单位。设置为0就不因为文件大小截断文件
rollCount    10    滚动文件之前写入文件的时间数。设置为0就不因为event数量截断文件
原文链接:https://blog.youkuaiyun.com/weixin_43326910/article/details/111876155

round字段作用对象时时间戳,是目录回滚

字段默认值说明
roundfalse时间戳需不需要四舍五入(不影响%t)
roundValue1时间戳四舍五入的倍数,要小于当前时间
roundUnitsecond时间戳四舍五入的单位


原文链接:https://blog.youkuaiyun.com/weixin_43326165/article/details/101103564

agent原理图

 

其中:channel-sink有三种情况
        默认:一对一
        负载均衡:三分之一 三分之一 三分之一
        故障转移(容灾):先往一个sink去发送,直到他出了问题,再换sink,通过设置优先级

组件介绍:

1)ChannelSelector

        ChannelSelector的作用就是选出Event将要被发往哪个Channel。其共有两种类型,分别是Replicating(复制)和Multiplexing(多路复用)。

ReplicatingSelector会将同一个Event发往所有的Channel,Multiplexing会根据相应的原则,将不同的Event发往不同的Channel。

2)SinkProcessor

        SinkProcessor共有三种类型,分别是DefaultSinkProcessor(默认1对1)、LoadBalancingSinkProcessor(负载均衡)和FailoverSinkProcessor(故障转移)

        DefaultSinkProcessor对应的是单个的Sink,LoadBalancingSinkProcessor和FailoverSinkProcessor对应的是Sink Group,LoadBalancingSinkProcessor可以实现负载均衡的功能,FailoverSinkProcessor可以错误恢复的功能。

三、Flume的安装

1.官网安装地址:

        Flume官网地址:Welcome to Apache Flume — Apache Flume

        文档查看地址:Flume 1.9.0 User Guide — Apache Flume

        下载地址:http://archive.apache.org/dist/flume/

2.安装步骤

        解压

tar -zxvf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/

        将lib文件夹下的guava-11.0.2.jar删除以兼容Hadoop 3.1.3

rm -rf guava-11.0.2.jar

         修改conf下的log4j.properties

#console表示同时将日志输出到控制台
flume.root.logger=INFO,LOGFILE,console
#固定日志输出的位置
flume.log.dir=/opt/module/flume-1.9.0/logs

四、官方案例

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

        步骤:

(1)安装netcat工具
sudo yum install -y nc
(2)判断44444端口是否被占用
sudo netstat -nlp | grep 44444
(3)在conf文件夹下创建Flume Agent配置文件nc-flume-log.conf。
vim nc-flume-log.conf
(4)在nc-flume-log.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
注:配置文件来源于官方手册http://flume.apache.org/FlumeUserGuide.html
(5)先开启flume监听端口
第一种写法:
bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/nc-flume-log.conf -Dflume.root.logger=INFO,console
第二种写法:
bin/flume-ng agent -c conf/ -n a1 -f conf/nc-flume-log.conf -Dflume.root.logger=INFO,console
参数说明:
	--conf/-c:表示配置文件存储在conf/目录
	--name/-n:表示给agent起名为a1
	--conf-file/-f:flume本次启动读取的配置文件是在conf文件夹下的nc-flume-log.conf文件。
	-Dflume.root.logger=INFO,console :-D表示flume运行时动态修改flume.root.logger参数属性值,并将控制台日志打印级别设置为INFO级别。日志级别包括:log、info、warn、error。日志参数已经在配置文件中修改了,不再需要重复输入。
(6)使用netcat工具向本机的44444端口发送内容
nc localhost 44444
(7)在Flume监听页面观察接收数据情况

需求:实时监控目录下的多个追加文件,Taildir Source适合用于监听多个实时追加的文件,并且能够实现断点续传。

步骤:

(1)在conf目录下创建配置文件taildir-flume-hdfs.conf
创建一个文件
vim taildir-flume-hdfs.conf
添加如下内容
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = f1 f2
# 必须精确到文件,可以写匹配表达式匹配多个文件
a1.sources.r1.filegroups.f1 = /opt/module/flume-1.9.0/files1/.*file.*
a1.sources.r1.filegroups.f2 = /opt/module/flume-1.9.0/files2/.*log.*
# 实现断点续传的文件存放位置 不改有默认位置也能实现断点续传
a1.sources.r1.positionFile = /opt/module/flume-1.9.0/taildir_position.json


# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop102:8020/flume/%Y%m%d/%H
#上传文件的前缀
a1.sinks.k1.hdfs.filePrefix = log-

#是否使用本地时间戳
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a1.sinks.k1.hdfs.batchSize = 100

#设置文件类型,可支持压缩
a1.sinks.k1.hdfs.fileType = DataStream


#多久生成一个新的文件
a1.sinks.k1.hdfs.rollInterval = 30
#设置每个文件的滚动大小大概是128M
a1.sinks.k1.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a1.sinks.k1.hdfs.rollCount = 0

# 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
(2)向files文件夹中追加内容
在/opt/module/flume-1.9.0目录下创建files1文件夹
mkdir files1
mkdir files2
(3)启动监控文件夹命令
bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/taildir-flume-hdfs.conf
向upload文件夹中添加文件
echo hello >> file1.txt
echo hpu >> file2.txt
(4)查看HDFS上的数据
Taildir说明:
	Taildir Source维护了一个json格式的position File,其会定期的往position File中更新每个文件读取到的最新的位置,因此能够实现断点续传。Position File的格式如下:
{"inode":2496272,"pos":12,"file":"/opt/module/flume-1.9.0/files1/file1.txt"}
{"inode":2496275,"pos":12,"file":"/opt/module/flume-1.9.0/files1/file2.txt"}
注:Linux中储存文件元数据的区域就叫做inode,每个inode都有一个号码,操作系统用inode号码来识别不同的文件,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。TailDir source使用inode和文件的全路径一起识别同一个文件,所以修改文件名之后如果表达式也能够匹配上,会再重新读取一份文件的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值