《Flume日志收集与MapReduce模式》一3.2 文件通道-阿里云开发者社区

开发者社区> 华章出版社> 正文

《Flume日志收集与MapReduce模式》一3.2 文件通道

简介:

本节书摘来自华章出版社《Flume日志收集与MapReduce模式》一书中的第3章,第3.2节,作者 [美] 史蒂夫·霍夫曼(Steve Hoffman)斯里纳特·佩雷拉(Srinath Perera),更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.2 文件通道

文件通道指的是将事件存储到代理本地文件系统中的通道。虽然要比内存通道慢一些,不过它却提供了持久化的存储路径,可以应对大多数情况,它应该用在数据流中不允许出现缺口的场合。
这种持久化能力是由Write Ahead Log(WAL)以及一个或多个文件存储目录联合提供的。WAL用于以一种原子且安全的方式追踪来自于通道的所有输入与输出。通过这种方式,如果代理重启,那么WAL可以重放,从而确保在清理本地文件系统的数据存储前进入到通道中的所有事件都会被写出。
此外,如果数据处理策略要求磁盘上的所有数据(甚至是临时数据)都要加密,那么文件通道还支持将加密数据写到文件系统中。本书并不会对此进行介绍,不过如果需要,那么可以看看Flume用户指南(http://flume.apache.org/FlumeUserGuide.html)上的示例。请记住,使用加密会降低文件通道的吞吐量。
要想使用文件通道,请将通道的type参数设定为file:
image

上面为名为agent的代理定义了一个名为c1的文件通道。
下面是一个配置参数表格,你可以据此调整默认值:
image

要想指定Flume代理持有数据的位置,你需要设定checkpointDir
与dataDirs属性:
image

从技术上来说,这些属性并不是必需的,对于开发来说,其默认值已经很不错了。不过,如果代理中配置了多个文件通道,那么只有第一个通道会启动。对于使用了多个文件通道的产品部署与开发来说,你应该针对每个文件通道存储区域使用不同的目录路径,并考虑将不同的通道放在不同的磁盘上以避免IO争抢。此外,如果使用大容量的机器,那么请考虑使用某种形式的包含了条带化的RAID(RAID 10、50、60)来获得更好的磁盘性能,而不是购买更昂贵的10k或15k驱动器或是SSDs。如果没有RAID条带化但却有多个磁盘,那么请将dataDirs设为包含每个存储位置的逗号分隔的列表。使用多个磁盘会分散磁盘访问,类似于条带化的RAID,不过却没有RAID 50/60的计算代价以及RAID 10的50%的空间浪费。你可以测试一下系统,看看RAID的代价是否能够弥补这种速度上的差异。既然硬盘驱动器的故障是存在的,那么你就应该首选某些RAID配置而不是单独的磁盘,从而防止出现与单个驱动故障相关的数据丢失情况的发生。
出于相同的原因,你不应该使用NFS存储。使用JDBC通道是个不好的做法,因为它会引入瓶颈和单点故障,这些都是高性能分布式系统在设计上应该极力避免的。
image

java.lang.NoClassDefFoundError: org/apache/hadoop/io/Writable
默认的文件通道容量是100万个事件,无论事件内容的大小是多少均如此。如果到达了通道容量,那么源就无法再接收数据了。这个默认值对于低容量的场景来说还不错。如果接收的数据量很大,导致无法忍受正常规划或未规划的中断,那么你可以调整该值。比如,Hadoop中有很多配置改变需要重启集群。如果Flume向Hadoop中写入的是一些重要数据,那么文件通道就应该调整以接受Hadoop重启的时间(或许对于意外的情况还需要添加一个缓冲)。如果集群或是其他系统是不可靠的,那么你可以将这个值设得更高一些来处理更长的宕机时间。有时,你会遇到磁盘空间不够用的情况,因此请设定好一个上限值(或是购买更大的磁盘)。
keep-alive参数类似于内存通道。它指的是满载的通道在放弃前,源尝试写入到通道中的最大等待时间。如果超时前又有可用空间了,那么写入就将成功;否则会向源抛出ChannelException异常。
属性transactionCapacity指的是在单个事务中所允许的最大事件数量。对于某些源来说,它们会将事件集中到一起,然后在单个调用中传递给通道,对于这种情况来说,该参数就很重要。很多时候,你无需改变其默认值。将该值设得比较高会在内部分配额外的资源,因此除非遇到了性能问题,否则不应该增加其值。
checkpointInterval属性指的是两个检查点(还会将日志文件写到logDirs中)之间间隔的毫秒数,不能将该值设为低于1000毫秒。
检查点文件也会使用maxFileSize属性根据写入到其中的文件量进行卷动。如果想节省一些磁盘空间,那么你可以针对低负载的通道降低该值的大小。假如最大的文件大小是50000字节,但通道一天只会写入500字节,那么要想填充满单个日志需要100天的时间。假如在第100天的时候写入了2000字节,那么有些数据就会被写到旧的日志文件中,新的文件则从剩余部分开始。在卷动后,Flume会尝试删除不再需要的日志文件。由于完整的日志有未被处理的记录,因此还不能将其删除。下一次清理旧日志文件可能还得100天之后。如果旧的50000字节文件留存的时间更长,那就没什么问题,不过由于默认大小是2GB左右,因此每个通道所用的磁盘空间是其两倍(4GB)。取决于可用的磁盘空间大小以及代理中配置的通道数量,这可能是个问题,也可能不是什么问题。如果机器有大量的存储空间,那么使用其默认值就可以了。
最后,minimumRequiredSpace属性指的是你不想用作日志的空间数量。如果尝试使用与dataDir路径相关联的最后500MB磁盘空间,那么默认配置就会抛出异常。这个限制适用于所有通道,因此如果配置了3个文件通道,那么其上限依然是500MB而不是1.5GB。你可以将其值设为1MB那么小,不过一般来说,如果磁盘使用率接近于100%,就会出现一些不好的结果。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接