关于日志采集系统Flume知识的学习
第1章 Flume概述
1.1 Flume定义
Flume是一个高可用,高可靠的,分布式的海量日志采集、聚合和传输的系统
Flume基于流式架构,灵活简单
Flume最主要的作用就是,实时读取服务器本地磁盘的数据,将数据写入到HDFS
1.2 Flume基础架构
1.2.1 Agent
Agent是一个JVM进程,它以事件的形式将数据从源头送至目的地
Agent主要有3个部分组成,Source、Channel、Sink
1.2.2 Source
Source是负责接收数据到Flume Agent组件。Source组件可以处理各种类型、各种格式的日志数据
1.2.3 Sink
Sink不断轮询Channel中的事件且批量移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另外一个Flume Agent
1.2.4 Channel
Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作
Flume自带两种Channel:Memory Channel 和 File Channel
Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失
File Channel将所有事件写入磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据
1.2.5 Event
传输单元,Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。Event由Header和Body两部分组成,Header用来存放该Event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组
第2章 Flume入门
2.1 Flume入门案例–监控端口数据
使用Flume监听一个端口,收集该端口的数据,并打印到控制台
实现步骤:
在 flume 目录下创建 job 文件夹并进入 job 文件夹
在 job 文件夹下创建 Flume Agent 配置文件 flume-netcat-logger.conf
在 flume-netcat-logger.conf 文件中添加如下内容
# Name the components on this agent a1:表示agent的名称 a1.sources = r1 r1:表示a1的source的名称 a1.sinks = k1 k1:表示a1的sink名称 a1.channels = c1 c1:表示a1的channel名称 # Describe/configure the source a1.sources.r1.type = netcat 表示a1是输入源类型为netcat端口类型 a1.sources.r1.bind = localhost 表示a1的监听的主机 a1.sources.r1.port = 44444 表示a1的监听的端口号 # Describe the sink a1.sinks.k1.type = logger 表示a1的输出目的地是控制台logger类型 # Use a channel which buffers events in memory a1.channels.c1.type = memory 表示a1的channel类型是memory内存型 a1.channels.c1.capacity = 1000 表示a1的channel总容量是1000个event a1.channels.c1.transactionCapacity = 100 表示a1的channel传输时收集到了100条event以后再去提交事务 # Bind the source and sink to the channel a1.sources.r1.channels = c1 表示r1和c1连接起来 a1.sinks.k1.channel = c1 表示k1和c1连接起来
开启Flume监听端口
第1种写法:bin/flume-ng agent –conf conf/ –name a1 –conf-file job/flume-netcat-logger.conf -
Dflume.root.logger=INFO,console
第2种写法:bin/flume-ng agent -c conf/ -n a1 -f job/flume-netcat-logger.conf -Dflume.root.logger=INFO,console
参数说明:- –conf/-c:表示配置文件存储在 conf/目录
- –name/-n:表示给 agent 起名为 a1
- –conf-file/-f:flume 本次启动读取的配置文件是在 job 文件夹下的 flume-telnet.conf
文件 - -Dflume.root.logger=INFO,console :-D 表示 flume 运行时动态修改 flume.root.logger
参数属性值,并将控制台日志打印级别设置为 INFO 级别。日志级别包括:log、info、warn、
error
使用 netcat 工具向本机的 44444 端口发送内容
nc localhost 44444
2.2 Flume入门案例–实时监控单个追加文件
这里同上一个案例的区别主要是Flume Agent 配置文件不同
创建配置文件 flume-file-hdfs.conf
# Name the components on this agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2
# Describe/configure the source
a2.sources.r2.type = exec
# hive的日志
a2.sources.r2.command = tail -F /opt/module/hive/logs/hive.log
# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://hadoop102:8200/flume/%Y%m%d/%H
#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-
#是否按照时间滚动文件夹
a2.sinks.k2.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k2.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k2.hdfs.roundUnit = hour
#是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a2.sinks.k2.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一个新的文件
a2.sinks.k2.hdfs.rollInterval = 60
#设置每个文件的滚动大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动与 Event 数量无关
a2.sinks.k2.hdfs.rollCount = 0
# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100
# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
注意:对于所有与时间相关的转义序列,Event Header 中必须存在以 “timestamp”的key(除非 hdfs.useLocalTimeStamp 设置为 true,此方法会使用 TimestampInterceptor 自动添加 timestamp)
2.3 Flume入门案例–实时监控目录下多个新文件
说明:在使用Spooling Directory Source时,不要在监控目录中创建目录并持续修改文件;上传完成的文件会以.COMPLETED结尾;被监控的文件每500毫秒扫描一次文件变动
创建配置文件 flume-dir-hdfs.conf
a3.sources = r3
a3.sinks = k3
a3.channels = c3
# Describe/configure the source
a3.sources.r3.type = spooldir
a3.sources.r3.spoolDir = /opt/module/flume/upload
a3.sources.r3.fileSuffix = .COMPLETED
a3.sources.r3.fileHeader = true
#忽略所有以.tmp 结尾的文件,不上传
a3.sources.r3.ignorePattern = ([^ ]*\.tmp)
# Describe the sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path =
hdfs://hadoop102:9820/flume/upload/%Y%m%d/%H
#上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = upload-
#是否按照时间滚动文件夹
a3.sinks.k3.hdfs.round = true
#多少时间单位创建一个新的文件夹
a3.sinks.k3.hdfs.roundValue = 1
#重新定义时间单位
a3.sinks.k3.hdfs.roundUnit = hour
#是否使用本地时间戳
a3.sinks.k3.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a3.sinks.k3.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a3.sinks.k3.hdfs.fileType = DataStream
#多久生成一个新的文件
a3.sinks.k3.hdfs.rollInterval = 60
#设置每个文件的滚动大小大概是 128M
a3.sinks.k3.hdfs.rollSize = 134217700
#文件的滚动与 Event 数量无关
a3.sinks.k3.hdfs.rollCount = 0
# Use a channel which buffers events in memory
a3.channels.c3.type = memory
a3.channels.c3.capacity = 1000
a3.channels.c3.transactionCapacity = 100
# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3
2.4 Flume入门案例–实时监控目录下多个追加文件
Exec Source适用于监控一个实时追加的文件,不能实现断点续传;Spooling Source适用于同步新文件,但不适合对实时追加日志的文件进行监听并同步;而Taildir Source适合用于监听多个实时追加的文件,并且能够实现断点续传
创建配置文件 flume-taildir-hdfs.conf
a3.sources = r3
a3.sinks = k3
a3.channels = c3
# Describe/configure the source
a3.sources.r3.type = TAILDIR
a3.sources.r3.positionFile = /opt/module/flume/tail_dir.json
a3.sources.r3.filegroups = f1 f2
a3.sources.r3.filegroups.f1 = /opt/module/flume/files/.*file.*
a3.sources.r3.filegroups.f2 = /opt/module/flume/files2/.*log.*
# Describe the sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path =
hdfs://hadoop102:9820/flume/upload2/%Y%m%d/%H
#上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = upload-
#是否按照时间滚动文件夹
a3.sinks.k3.hdfs.round = true
#多少时间单位创建一个新的文件夹
a3.sinks.k3.hdfs.roundValue = 1
#重新定义时间单位
a3.sinks.k3.hdfs.roundUnit = hour
#是否使用本地时间戳
a3.sinks.k3.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a3.sinks.k3.hdfs.batchSize = 100
#设置文件类型,可支持压缩
a3.sinks.k3.hdfs.fileType = DataStream
#多久生成一个新的文件
a3.sinks.k3.hdfs.rollInterval = 60
#设置每个文件的滚动大小大概是 128M
a3.sinks.k3.hdfs.rollSize = 134217700
#文件的滚动与 Event 数量无关
a3.sinks.k3.hdfs.rollCount = 0
# Use a channel which buffers events in memory
a3.channels.c3.type = memory
a3.channels.c3.capacity = 1000
a3.channels.c3.transactionCapacity = 100
# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3
Taildir 说明:Taildir Source维护了一个json格式的position file,其会定期的往position file中更新每个文件读取到的最新的位置,因此能够实现断点续传
- 标题: 关于日志采集系统Flume知识的学习
- 作者: 宣胤
- 创建于: 2023-05-04 09:58:43
- 更新于: 2023-05-05 21:39:10
- 链接: http://xuanyin02.github.io/2023/050462077.html
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。