本节书摘来自华章出版社《Flume日志收集与MapReduce模式》一书中的第3章,第3.1节,作者 [美] 史蒂夫·霍夫曼(Steve Hoffman)斯里纳特·佩雷拉(Srinath Perera),更多章节内容可以访问云栖社区“华章计算机”公众号查看
3.1 内存通道
见名知意,内存通道指的是事件存储在内存中的通道。由于通常情况下,内存的速度要比磁盘快几个数量级,因此事件的接收速度也会更快,这降低了对硬件的需求量。使用这种通道的弊端在于代理失败(如硬件问题、断电、JVM崩溃、Flume重启等)会导致数据丢失。根据使用场景的不同,这可能是非常不错的解决方案。系统度量通常属于这一类,因为少量的数据丢失并不会造成什么影响。然而,如果事件表示的是网站的购买情况,那么内存通道就是一种非常差劲的选择了。
要想使用内存通道,请将通道的type参数设定为memory。
上面为名为agent的代理定义了一个名为c1的内存通道。
下面是一个配置参数表格,你可以据此调整默认值:
该通道的默认容量是100个事件,这可以通过设置capacity属性来达成:
记住一点,如果增加了这个值,那么你还需要增加Java堆空间大小,方式是使用-Xmx以及可选的-Xms参数实现。
你可以设定的另一个与容量相关的设置是transactionCapacity。它指的是源的ChannelProcessor(负责在单个事务中将数据从源移动到通道中的组件)可以写入的最大的事件数量。它也指的是SinkProcessor(负责将数据从通道移动到接收器的组件)在单个事务中所能读取的最大的事件数量。你可以将这个值设得大一些,从而降低事务包装器的代价,这会提升速度。对于失败事件来说,增加这个值的弊端在于源需要回滚更多的数据。
如果使用的接收器得益于更大规模的批量处理(比如HDFS)将内容写到某处,那么你应该将该值设得更大一些。就像其他东西一样,唯一能够确保的就是使用不同值来运行性能测试。Flume提交者Mike Percy所写的博文http://bit.ly/flumePerfPt1值得你好好读读。
https://issues.apache.org/jira/browse/FLUME-1535介绍了byteCapacity-
BufferPercentage与byteCapacity参数,它们使用字节而非事件数量来作为调整内存通道大小的方式,同时还避免了OutOfMemoryErrors。如果事件大小的变化范围很大,那么你应该使用这些设置来调整容量,但需要注意的是,计算只是根据事件体来评估的。如果有任何头,那么实际的内存使用量就会比配置的值大一些。
最后,keep-alive参数指的是通道已满并且在放弃前,线程将数据写到通道中的等待时间。由于数据同时也在从通道中被写出,因此如果在超时到期后又有了新的空间,那么数据还是会被写入通道中,而不会向源抛出异常。你可能想将该值设得非常大,不过请记住,等待写入到通道会阻塞数据进入到源中,这可能会导致数据堵在上游代理中。最后,这会造成事件被丢弃。你需要针对周期性的流量变化以及临时计划(或未计划)的维护情况进行调整。