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

3.2 文件通道

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

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

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

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

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%,就会出现一些不好的结果。

时间: 2024-08-02 06:11:29

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

《Flume日志收集与MapReduce模式》一3.3 小结

3.3 小结 本章介绍了在数据处理管道中常用的两类通道.内存通道提供了更快的速度,这是以故障事件出现时数据丢失为代价的.此外,文件通道提供了更可靠的传输,因为它能容忍代理故障与重启,这是以牺牲性能为代价的.你需要确定哪种通道更适合于你的使用场景.在确定内存通道是否适合时,请问问自己丢失一些数据的经济上的代价如何.在考虑是否使用持久化通道时请衡量它与添加更多的硬件以弥补性能上的差异时的代价相比如何.另一个考虑就是数据问题了.写入到Hadoop中的数据不一定都来自于流式应用日志.如果接收的是每天的数

《Flume日志收集与MapReduce模式》一第3章 通  道

第3章 通 道在Flume中,通道指的是位于源与接收器之间的构件.它为流动的事件提供了一个中间区域,从源中读取并且被写到数据处理管道中的接收器的事件处于这个区域中.本章将要介绍的两类通道分别是内存/非持久化通道与本地文件系统/持久化通道.持久化文件通道会在发送者接收到事件前将所有变化写到磁盘上.它要比非持久化的内存通道慢一些,不过可以在出现系统事件或是Flume代理重启时进行恢复.与之相反,内存通道要更快一些,不过在出现失败时会导致数据丢失,并且与拥有大量磁盘空间的文件通道相比,它的存储能力要低

《Flume日志收集与MapReduce模式》一2.4 小结

2.4 小结 本章介绍了如何下载Flume二进制分发包.我们创建了一个简单的配置文件,里面包含了一个源,它会将内容写到一个通道中,后者又会将其写到一个接收器中.源监听着一个Socket,等待网络客户端的连接,并向其发送事件数据.这些事件被写到一个内存通道中,然后被写到一个log4j接收器中,从而成为输出.接下来,我们使用Linux netcat工具连接到监听代理上,向Flume代理的源发送一些字符串事件.最后,我们验证基于log4j的接收器成功将事件写出.下一章将会详细介绍在数据处理工作流中会用

《Flume日志收集与MapReduce模式》一1.5 Flume事件

1.5 Flume事件 Flume传输的基本的数据负载叫作事件.事件由0个或多个头与体组成. 头是一些键值对,可用于路由判定或是承载其他的结构化信息(比如说事件的时间戳或是发出事件的服务器主机名).你可以将其看作是与HTTP头完成相同的功能--传递与体不同的额外信息的方式. 体是个字节数组,包含了实际的负载.如果输入由日志文件组成,那么该数组就非常类似于包含了单行文本的UTF-8编码的字符串. Flume可能会自动添加头(比如,源添加了数据来自的主机名或是创建了事件时间戳),不过体基本上是不受影

《Flume日志收集与MapReduce模式》一第1章 概览与架构

第1章 概览与架构 如果在阅读本书,那就说明你正在数据的海洋中遨游.创建大量的数据是非常简单的事情,这要归功于Facebook.Twitter.Amazon.数码相机与相机照片.YouTube.Google,以及你能想得到的能够连接到互联网上的任何东西.作为网站的提供者,10年前的应用日志只是用来帮助你解决网站的问题.时至今日,如果你知道如何从大量的数据中浪里淘金,那么相同的数据就会提供关于业务与客户的有价值的信息. 此外,既然在阅读本书,那么你肯定知道创建Hadoop的目的在一定程度上就是为了

《Flume日志收集与MapReduce模式》一2.3 从“Hello World”开始

2.3 从"Hello World"开始 每一本技术图书都会有一个"Hello World"示例.下面是我们将会使用的配置文件: 这里定义了一个名为agent的代理,它有一个名为s1的源.一个名为c1的通道,以及一个名为k1的接收器.源s1的类型为netcat,它只是打开一个Socket监听事件(每个事件一行文本).它需要两个参数,分别是一个绑定IP与一个端口号.该示例使用0.0.0.0作为绑定地址(表示监听任何地址的Java约定)以及端口号12345.源配置还有一

《Flume日志收集与MapReduce模式》一1.1 Flume 0.9

1.1 Flume 0.9 Flume是在2011年被首次引入到Cloudera的CDH3分发中的.它由一套工作守护进程(代理)构成,这些守护进程是通过Zookeeper(一个配置与协调系统)根据一个或多个集中的Master配置而成的.在Master上,你可以在Web UI中查看代理状态,也可以以集中的方式在UI或是通过命令行Shell的方式取出配置(这两种方式都是通过Zookeeper与工作代理进行通信的).可以通过3种模式发送数据,分别叫作Best Effort(BE).Disk Failo

《Flume日志收集与MapReduce模式》一2.2 Flume配置文件概览

2.2 Flume配置文件概览 既然已经下载好了Flume,下面来花点时间看看如何配置代理.Flume代理的默认配置提供者使用了一个简单的键值对的Java属性文件,你需要在启动时向代理传递一个参数.由于可以在单个文件中配置多个代理,因此还需要额外传递一个代理标识符(叫作名字),这样它就知道该使用哪个代理了.在给出的示例中,我只指定了一个代理,使用agent这个名字.每个代理的配置都以下面这3个参数开始: 每个源.通道与接收器在该代理的上下文中也有一个唯一的名字.比如,如果不打算传递Apache访

《Flume日志收集与MapReduce模式》一1.3 HDFS与流式数据/日志的问题

1.3 HDFS与流式数据/日志的问题 HDFS并不是真正的文件系统,至少从传统的认识来说不是这样,对于通常的文件系统来说,很多我们认为理所当然的东西并不适合于HDFS,比如挂载.这使得将流式数据装载进Hadoop中变得有些复杂.在通常的Portable Operating System Interface(POSIX)风格的文件系统中,如果打开文件并写入数据,那么在文件关闭前它会一直存在于磁盘上.也就是说,如果另一个程序打开了相同的文件并开始读取,那么它会读取到写入器写到磁盘上的数据.此外,如