Flume

是什么?
Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume 基于流式架构,灵活简单。


核心组件
Client:Client生产数据,运行在一个独立的线程。
Event: 一个数据单元,消息头和消息体组成。(Events可以是日志记录、 avro对象等。)
Flow: Event从源点到达目的点的迁移的抽象。
Agent: 一个独立的Flume进程,包含组件Source、 Channel、 Sink。(Agent使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。)
Source: 数据收集组件。(source从Client收集数据,传递给Channel)
Channel: 中转Event的一个临时存储,保存由Source组件传递过来的Event。(Channel连接 sources 和 sinks ,这个有点像一个消息队列。)
Sink: 从Channel中读取并移除Event, 将Event传递到FlowPipeline中的下一个Agent(如果有的话(Sink从Channel收集数据,运行在一个独立线程。)

source是数据的收集端,负责将数据捕获后进行特殊的格式化,将数据封装到事件(event) 里,然后将事件推入Channel中。 Flume提供了很多内置的Source, 支持 Avro, log4j, syslog 和http post(body为json格式)。可以让应用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。 如果内置的Source无法满足需要, Flume还支持自定义Source。


组成架构


Agent:flume运行的核心,flume以agent为最小的独立运行单位,一个agent就是一个JVM, 包含三个组件source,channel,sink
source:数据的手机端,负责将数据捕获后进行特殊的格式化,将数据封装到事件(event)中,然后将数据以event推入到channel中
channel:连接source和sink的组件,类似与一个数据缓冲区,可以暂时将数据以event形式暂存到内存或持久化到本地磁盘,直到sink消费完成该数据。
sink:数据的输出方式,将channnel整理好的event,传送到指定的地方(HDFS,HBase等)

source常用的类型
NetCat source【监控端口数据】常用属性: 
type:netcat
bind:监听的哪个主机
port:监听的端口

exec source【监听单个追加文件】 常用属性:
type:exec
command:tail -F  文件路径
batchSize: 定义每批次采集多少数据, 必须<=事务容量大小

Spooling Directory Source【监听目录下新增文件】常用属性 : 
type: TAILDIR
filegroups: 定义文件组的名称,多个文件组名称通过空格分隔
filegroups.<filegroupName> : 定义对应的文件组监听的目录、文件
positionFile: 记录上一次采集到了文件的哪个位置的文件
batchSize:定义每批次采集多少数据, 必须<=事务容量大小

Taildir Source【监听目录下新增文件以及追加文件】常用属性:
type: TAILDIR
legroups: 定义文件组的名称,多个文件组名称通过空格分隔
legroups.<filegroupName> : 定义对应的文件组监听的目录、文件
sitionFile: 记录上一次采集到了文件的哪个位置的文件
tchSize:定义每批次采集多少数据, 必须<=事务容量大小

Avro Source 【监听一个avro服务端口,采集Avro数据序列化后的数据】 常用属性:
tpye: avro
bind:监听哪个主机
port:监听哪个端口  

channel常用类型:
memory channel 【使用内存缓存source传过来的数据】:
Type channel的类型:必须为memory
capacity:channel中的最大event数目
transactionCapacity:channel中允许事务的最大event数目

File Channel【使用文件作为数据存储】常用类型:
type channel的类型:必须为 file
checkpointDir :检查点的数据存储目录【提前创建目录】
dataDirs :数据的存储目录【提前创建目录】
transactionCapacity:channel中允许事务的最大event数目

Spillable Memory Channel 【使用内存作为channel,当内存超过阈值就缓存在文件中】常用属性:
Type channel的类型:必须为SPILLABLEMEMORY
memoryCapacity:内存的容量event数
overflowCapacity:数据存到文件的event阀值数
checkpointDir:检查点的数据存储目录
dataDirs:数据的存储目录


sink 常用类型:

HDFS sink【将数据传输到HDFS集群中】常用属性:
type:sink的类型 必须是hdfs。
hdfs.path:hdfs的上传路径。
hdfs.filePrefix:hdfs文件的前缀。默认是:FlumeData
hdfs.rollInterval:间隔多久产生新文件,默认是:30(秒) 0表示不以时间间隔为准。
hdfs.rollSize:文件到达多大再产生一个新文件,默认是:1024(bytes)0表示不以文件大小为准
s.rollCount:event达到多大再产生一个新文件,默认是:10(个)0表示不以event数目为准。
s.rollCount:event达到多大再产生一个新文件,默认是:10(个)0表示不以event,CompressedStream,如果使用了CompressedStream就要设置压缩方式。
hdfs.codeC:压缩方式:gzip, bzip2, lzo, lzop, snappy

Avro Sink【数据被转换成Avro Event,然后发送到指定的服务端口上】 常用属性:
type:sink的类型:必须是 avro。
hostname:指定发送数据的主机名或者ip
port:指定发送数据的端口

File Roll Sink【数据发送到本地文件】 常用属性:
type:sink的类型:必须是 file_roll。
sink.directory:存储文件的目录【提前创建目录】
batchSize:一次发送多少个event。默认为100
sink.rollInterval:多久产生一个新文件,默认为30s。单位是s。0为不产生新文件。

拦截器
当我们需要对数据进行过滤时,flume提供了拦截器,拦截器也是chain形式的,拦截器的位置在source和channnel之间,当我们指定拦截器之后,我们会在拦截器得到event,根据需求对event进行保留或过滤掉,过滤掉的数据不会进入channel

事务

put事务:在source向channnel推送数据时,为了保证数据的安全性会触发Put事务,doput将批数据写入临时缓冲区putlist,docommit检查channel队列是否有足够的空间进行合并,doRollback:当channnel内存队列空间不足,回滚数据
Take事务:当sink去channel拉取事件时,会触发take事务,dotake将数据拉取到临时缓冲去区takelist,并将数据发送到目的地,dommit当数据全部发送成功时,清除临时缓冲区 takelist,doRollback数据在发送过程中如果出现异常,rollback将临时缓冲区takelist中的数据回滚到channel队列中


Flume Agent内部原理


1:source接收webServer的数据
2:source将数据推送到channel果过程中,数据首先会经过channnel处理器
3:channnel Processor判断是否有拦截器,如果有将事件传递给拦截器 拦截器对event进行过滤,将过滤后的数据传递给channnel processor
4:channel processor将每个事件传递给channnel选择器
 channel选择类型(Replicating hannel selector和multiplexing channnel selector)
Replicating hannel selector:将传递过来的events发送到所有的channnel
multiplexing channnel selector:将传递过来的events发送到配置的channel
5:返回channel processor写入到channel列表
6:根据channel选择器的选择结果,将事件写入相应的channel中
7:sink processor有三个种属性
 1:DefaultSinkProcessor:对应的是单个的sink
 2:LoadBalancingSinkProcessor :对应的是sink Group,可以实现负载均衡
 3:FailoverSinkProcessor:实现故障转移


Flume拓扑结构
1:简单串联


将多个flume顺序连接起来,从最初的source到sink传送的目的存储系统

flume与flume之间传递event必须是Avro
2:复制和多路复用


flume支持将事件流向一个或多个目的地,这种模式可以将先相同数据复制到多个channel中,或者将不同数据分发大到不同的channel中,sink可以选择传送不同的目的地

3:负载均衡和故障转移


flume支持将多个sink逻辑上分到一个sink组,sink组配合不同的sink Processor可以实现负载均衡和故错误恢复策略

4聚合


因为一般web应用分布在很多个服务器中,产生的日志,处理起来非常麻烦,用flume组和方式可以很好的解决这一问题,每台服务器上都部署一个flume,将每台服务器收集到的日志传递到同一个flume,最后由这个存储全部日志数据的flume上传到hdfs,hive,hbase。。。

案例
1:复制和多路复用(使用flume1监控文件变动,flume1将变动的内容传递给flume2flume负责存储到hdfs,同时flume1将变动内容发送给flume3,flume3负责输出到 local filesystem)


(1)准备工作
在/opt/yjx/flume/job目录下创建group1的文件夹
在/opt/yjx/flume/datas目录下创建flume3文件夹
(2)创建flume-file-flume.conf
配置1个接收日志文件的source 和两个channel、两个sink,分别输送给 flume-flume-hdfs 和 flume-flume-dir 

编辑配置信息
vim flume-file-flume.conf
#name
a1.sources = r1
a1.channels = c1 c2
a1.sinks = k1 k2

#Source
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /opt/yjx/flume/data/hive.log
a1.sources.r1.positionFile = /opt/yjx/flume/position/position1.json

# 将数据流复制给所有channel
a1.sources.r1.selector.type = replicating

#Channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

a1.channels.c2.type = memory
a1.channels.c2.capacity = 1000
a1.channels.c2.transactionCapacity = 100

# Sink
# sink 端的 avro 是一个数据发送者
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop102
a1.sinks.k1.port = 4141

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = hadoop102
a1.sinks.k2.port = 4142

#Bind
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2

(3)创建 flume-flume-hdfs .conf
配置上级 Flume 输出的 Source,输出是到 HDFS 的 Sink 。
编辑配置文件 vim flume-flume-hdfs.conf
#name
a2.sources = r1
a2.channels = c1
a2.sinks = k1

#Source
a2.sources.r1.type = avro
a2.sources.r1.bind = hadoop102
a2.sources.r1.port = 4141

#Channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100

#Sink
a2.sinks.k1.type = hdfs
a2.sinks.k1.hdfs.path = hdfs://hadoop102:8020/group1/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k1.hdfs.filePrefix = logs-
#是否按照时间滚动文件夹
a2.sinks.k1.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k1.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k1.hdfs.roundUnit = hour
#是否使用本地时间戳
a2.sinks.k1.hdfs.useLocalTimeStamp = true
#积攒多少个Event才flush到HDFS一次
a2.sinks.k1.hdfs.batchSize = 1000
#设置文件类型,可支持压缩
a2.sinks.k1.hdfs.fileType = DataStream
#多久生成一个新的文件
a2.sinks.k1.hdfs.rollInterval = 30
#设置每个文件的滚动大小
a2.sinks.k1.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a2.sinks.k1.hdfs.rollCount = 0

#Bind
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1
(4)创建 flume-flume-dir .conf
配置上级 Flume 输出的 Source,输出是到本地目录的 Sink 。
编辑配置文件 vim flume-flume-dir.conf
#name
a3.sources = r1
a3.channels = c1
a3.sinks = k1

#Source
a3.sources.r1.type = avro
a3.sources.r1.bind = hadoop102
a3.sources.r1.port = 4142

#Channel
a3.channels.c1.type = memory
a3.channels.c1.capacity = 1000
a3.channels.c1.transactionCapacity = 100

#Sink
a3.sinks.k1.type = file_roll
a3.sinks.k1.sink.directory = /opt/module/flume-1.7.0/data/group1

#Bind
a3.sources.r1.channels = c1
a3.sinks.k1.channel = c1
输出的本地目录必须是已经存在的目录,如果目录不存在并不会创建新的目录
(5)执行配置文件
分别启动对应的 flume 进程:flume-flume-dir,flume-flume-hdfs,flume-file-flume 。
bin/flume-ng agent -c conf/ -n a3 -f job/group1/flume-flume-dir.conf

bin/flume-ng agent -c conf/ -n a2 -f job/group1/flume-flume-hdfs.conf

bin/flume-ng agent -c conf/ -n a1 -f job/group1/flume-file-flume.conf
(6)启动 Hadoop 并向 hive.log 添加数据
sbin/start-dfs.sh
sbin/start-yarn.sh
echo hello >> hive.log 
echo hust >> hive.log 
(7)检查HDFS上数据
(8)检查/opt/yjx/flume/flume3mulu中的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值