07 Flume

1 Flume概述

1.1 定义

● Flume是Cloudera提供的一个高可用高可靠分布式的海量日志采集聚合传输的框架。

● 主要作用:实时读取服务器本地磁盘的数据,将数据写入到HDFS。 数据(服务器)——> HDFS

1.2 基础架构

Flume基础构架图:

(1) Agent

● 是flume的部署单元

● 是一个JVM进程, 源头—数据(事件)—>目的

● 组成:Source、Channel、Sink。

(2) Source

接收数据给Flume Agent组件

● 处理日志数据(各种类型、格式)

● 包括:avro、thrift、exec、jms、spooling directorynetcat、 taildir 、sequence generator、syslog、http、legacy。

(3) Sink

不断轮询Channel中的事件,批量移除。批量写入到存储、索引系统,或被发送到另一个Flume Agent。

● 组件类型:hdfsloggeravro、thrift、ipc、fileHBase、solr、自定义。

(4) Channel

● 位于Source和Sink之间的缓冲区

● 允许Source和Sink运作在不同的速率上

● 线程安全,可以支持多个Source的写入和多个Sink的读取。

● 类型:

  • Memory Channel:内存中的队列。(快,不安全
  • File Channel:将事件写入磁盘。(慢,安全

(5) Event

传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。

● 组成

  • Header:存放event的属性,k-v结构
  • Body:存放数据,字节数组

 

2 Flume入门

2.1 Flume安装部署

上传——解压——改名flume——删除jguava-11.0.2.jar(处理兼容问题)

 

2.2 Flume入门案例

2.2.1 案例1(监控端口数据)

1)案例需求

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

● 案例图 

2)需求分析

3)实现步骤

安装netcat工具 —— 判断端口情况 —— 创建job文件夹 —— 在job/simpleCase文件下,创建Flume Agent配置文件flume-1-netcat-logger.conf

查看代码
# Name the components on this agent
a1.sources = r1                                      # 为a1的Source组件命名为r1,多个组件用空格间隔
a1.sinks = k1                                        # 为a1的Sink组件命名为k1,多个组件用空格间隔
a1.channels = c1                                     # 为a1的Channel组件命名为c1,多个组件用空格间隔

# Describe/configure the source
a1.sources.r1.type = netcat                          # 配置r1的类型
a1.sources.r1.bind = localhost                       # 配置r1的绑定地址(注意localhost和hadoop102的区别)
a1.sources.r1.port = 44444                           # 配置r1的监听端口

# Describe the sink
a1.sinks.k1.type = logger                            # 配置k1的类型为logger

# Use a channel which buffers events in memory    
a1.channels.c1.type = memory                         # 配置c1的类型为memory
a1.channels.c1.capacity = 1000                       # 配置c1的容量为1000个事件
a1.channels.c1.transactionCapacity = 100             # 配置c1的事务容量为100个事件

# Bind the source and sink to the channel
a1.sources.r1.channels = c1                          # 配置r1的channel属性,指定r1连接到那个channel
a1.sinks.k1.channel = c1                             # 配置k1的channel属性,指定k1连接到那个channel

开启flume监听端口 & netcat的使用

写法 指令
方法1

$ bin/flume-ng agent --conf conf/ --name a1 --conf-file job/simpleCase/flume-1-netcat-logger.conf -Dflume.root.logger=INFO,console

方法2

$ bin/flume-ng agent -c conf/ -n a1 -f job/simpleCase/flume-1-netcat-logger.conf -Dflume.root.logger=INFO,console

使用netcat工具向本机的44444端口发送内容

$ nc localhost 44444     //  nc IP 端口号

参数说明

参数 说明
--conf / -c 表示配置文件存储在conf/目录
--name / -a 表示给agent起名为a1
--conf-file / -f 指定读取的配置文件是在job/simpleCase文件夹下的flume-1-1netcat-logger.conf文件     
-Dflume.root.logger=INFO,console -D表示flume运行时动态修改flume.root.logger参数属性值,并将控制台日志打印级别设置为INFO级别。日志级别包括:log、info、warn、error。 

 

2.2.2 案例2(实时监控目录下的多个追加文件)

配置 说明
Exec source 适用于监控一个实时追加的文件,不能实现断点续传
Spooldir Source 适用于同步新文件,但不适合对实时追加日志的文件进行监听并同步
Taildir Source 适合用于监听多个实时追加的文件,并且能够实现断点续传

1) 需求:

使用Flume监听整个目录的实时追加文件,并上传至HDFS

2) 分析

3) 步骤

①配置文件 flume-2-taildir-hdfs.conf

# agent
a2.sources = r1
a2.sinks = k1
a2.channels = c1

# source
a2.sources.r1.type = TAILDIR
a2.sources.r1.filegroups = f1 f2		#指定需要监控的文件夹(文件组)
a2.sources.r1.filegroups.f1 = /opt/module/flume/datas/tailCase/files/.*file.* 	#指定文件夹的路径
a2.sources.r1.filegroups.f2 = /opt/module/flume/datas/tailCase/logs/.*log.*
a2.sources.r1.positionFile = /opt/module/flume/tail_dir.json	#配置断点续传文件,放到指定目录

# Describe the sink
a2.sinks.k1.type = hdfs
a2.sinks.k1.hdfs.path = hdfs://hadoop102:8020/flume/tailDir/%Y%m%d/%H	#写往hdfs的路径
# 上传文件的前缀
a2.sinks.k1.hdfs.filePrefix = tail-
# 是否按照时间滚动文件夹
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 = 100
# 设置文件类型,可支持压缩
a2.sinks.k1.hdfs.fileType = DataStream
# 多久生成一个新的文件
a2.sinks.k1.hdfs.rollInterval = 60
# 设置每个文件的滚动大小大概是128M
a2.sinks.k1.hdfs.rollSize = 134217700
# 文件的滚动与Event数量无关
a2.sinks.k1.hdfs.rollCount = 0


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

# bind
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1

 

3 Flume进阶

3.1 Flume事务

● Put事务和Take事务

事务 说明
Put doPut — 将批数据先写入临时缓冲区putList
doCommit — 检查channel内存队列是否足够合并
doRollback — channel内存队列空间不足,回滚数据
如果出现error,会删除putList中的数据,将error返回给Source后,再重新推送事务
Take doTake — 将数据取到临时缓冲区takeList,并将数据放送到HDFS
doCommit — 如果数据全部发送成功,则清楚临时缓冲区takeList
数据发送过程中如果出现异常,rollback将临时缓冲区takeList中的数据归还给channel内存队列

3.2 Flume Agent内部原理

重要组件

组件 说明
ChannelSelector 作用:选出Event将要被发往哪个Channel
两种类型:Replicating(复制)和 Multiplexing(多路复用)
Replicating Channel Selector:会将同一个Event发往所有的Channel。
Mulitiplexing Channel Selector:会根据响应的原则,将不同的Event发往不同的Channel。(分类)
SinkProcessor 三种类型:长度
DefaultSinkProcessor:对应的是单个Sink。
LoadBalancingSinkProcessor:对应的是Sink Group,可以实现负载均衡的功能。
FailoverSinkProcessor:对应的是Sink group,可以实现恢复的功能。(故障转移

 

posted @ 2022-01-06 16:14  白森  阅读(79)  评论(0编辑  收藏  举报