昨天用Flume采集kafka中的数据到HDFS上,今天才发现Flume采集丢数据了。
于是又回顾了一下这个问题:
Flume采集数据会丢失吗?(防止数据丢失的机制)
- 根据Flume的架构原理,Flume是不可能丢失数据的,其内部有完善的事物机制,Source到Channel是Put事务,Channel到Sink是Take事务,因此这两个环节不会出现数据的丢失。
- 如果Channel采用FileChannel不会丢失,Channel存储可以存储在File中,数据传输自身有事务。
- 如果Channel采用MemoryChannel有可能会丢数据,agent宕机会导致数据丢失,或者Channel存储数据已满,导致Source不再写入,未写入的数据丢失。
而我正正是使用了MemoryChannel,所以才导致数据丢失的。
今天来学习一下FileChannel吧。文章来源:https://www.toymoban.com/news/detail-481741.html
属性 | 默认值 | 说明 |
---|---|---|
type | - | 组件类型,这个是:file
|
checkpointDir | ~/.flume/file-channel/checkpoint | 记录检查点的文件的存储目录 |
checkpointInterval | 30000 | 检查点的时间间隔(毫秒) |
useDualCheckpoints | false | 是否备份检查点目录(默认是false) |
backupCheckpointDir | - | 备份检查点的目录(不能与数据目录和检查点目录相同) |
dataDirs | ~/.flume/file-channel/data | 逗号分隔的数据目录列表,用于存储数据文件( dataDirs 配置多个不同盘下的目录可以提高File Channel的性能。) |
transactionCapacity | 10000 | channel支持的单个事务最大容量 |
capacity | 1000000 | channel的最大容量 |
maxFileSize | 2146435071(≈2047MB) | 单个日志文件的最大字节数 |
minimumRequiredSpace | 524288000 | 最小空闲空间的字节数。为了避免数据损坏,当空闲空间低于这个值的时候,file channel将拒绝一切存取请求 |
keep-alive | 3 | 存入Event的最大等待时间(秒) |
检查点目录(checkpointDir)文章来源地址https://www.toymoban.com/news/detail-481741.html
- 在File Channel中,有一个内存队列用来保存已被Source写入但还未被Sink消费的Event数据的指针,Event指针指向的就是Event在数据目录下的数据文件中的存放位置。
- 所以检查点指的就是内存队列在某一稳定时刻的“快照”,而且每隔一段时间(checkpointInterval)File Channel会将内存队列持久化到磁盘文件,也就是我们配置的检查点目录下。
- 为了保证内存队列“快照”的完整性,在将内存队列持久到磁盘文件时需要锁定内存队列,也就是说,在这个过程中 Source不能将Event写入到Channel中,并且Sink也不能从Channel中拉取Event。
(总之,既不能读也不能写)
- backupCheckpointDir就是检查点目录的备份目录,因为检查点文件是经常读写的,很容易导致文件损坏。
参考链接:flume之Channel - 如果一个Agent中有多个File Channel实例,而且都是使用了默认的检查点目录checkpointDir或者是设置了同样的检查点目录,则只有一个实例可以锁定目录并导致其它Channel初始化失败。所以,我们应该为所有的File Channel显式配置不同的检查点目录,最好是在不同的磁盘上。
#表示a1的channel类型是file文件型
a1.channels.c1.type = file
#设置检查点目录
a1.channels.c1.checkpointDir = /opt/module/flume-1.9.0/jobs/douban_movies/checkpoint
#设置数据目录
a1.channels.c1.dataDirs = /opt/module/flume-1.9.0/jobs/douban_movies/data
到了这里,关于Flume File Channel的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!