Flume File Channel

Flume File Channel

昨天用Flume采集kafka中的数据到HDFS上,今天才发现Flume采集丢数据了。
于是又回顾了一下这个问题:
Flume采集数据会丢失吗?(防止数据丢失的机制)

  • 根据Flume的架构原理,Flume是不可能丢失数据的,其内部有完善的事物机制,Source到Channel是Put事务,Channel到Sink是Take事务,因此这两个环节不会出现数据的丢失。
  • 如果Channel采用FileChannel不会丢失,Channel存储可以存储在File中,数据传输自身有事务。
  • 如果Channel采用MemoryChannel有可能会丢数据,agent宕机会导致数据丢失,或者Channel存储数据已满,导致Source不再写入,未写入的数据丢失。

而我正正是使用了MemoryChannel,所以才导致数据丢失的。
今天来学习一下FileChannel吧。

属性 默认值 说明
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)

  • 在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,大数据)