Apache Flume是一个分布式,高可靠和高可用的系统,它用于高效的收集,汇总和将大量来自不同来源的日志数据移动到一个中央数据仓库。
Flume event被定义为一个数据流单元,他有一个字节负载和一个可选的字符串属性,Flume agent是一个JVM进程,agent中的组件将事件流(event flow)从一个外部源传到下一个目的地。
请记住以下概念
Flume传输的基本的数据负载叫做事件,事件由0个或多个头与体组成。
头是一些键值对,可以用于路由判定或是承载其他的结构化信息(例如:时间戳,服务器主机名等)
体是字节数据,包含了实际的负载,如果输入由日志文件组成,那么该数组就非常类似于包含了单行文本的UTF-8编码的字符串。
拦截器是指在数据流中的一个点,可以在这里检查和修改Flume事件,可以在源创建事件后或是接收器发送事件前链接0个或多个拦截器。
通道选择器负责将数据从一个源转向一个或多个通道上,Flume自带了两个通道选择器,也可以根据自己的需要编写选择器。复制通道选择器
(默认)是将事件的复本放到每个通道中,前提是已经配置好了多个通道。相反,多路通道选择器
会根据某些头信息将事件写到不同的通道中。搭配拦截器逻辑,这两种选择器构成了将输入路由到不同通道的基础。
输入处理器
指的是这样一种机制,你课可以通过它作为输入器创建故障恢复路径,或是跨越一个通道的多个输入器创建负载均衡事件。
内存通道指的是事件存储在内存中的通道,由于通常情况下,内存的速度比磁盘快好几个数量级,所以事件的接收速度也会更快,这降低了对硬件的需求量。但是如果代理失败(如:硬件问题,断电,JVM崩溃,Flume重启等)会导致数据丢失。
如果想使用内存通道,那么就可以将type参数设定为memory
agent.channels.c1.type = memory
键 | 是否必须 | 类型 | 默认值 |
---|---|---|---|
type | 是 | String | memory |
capacity | 否 | int | 100 |
transactionCapacity | 否 | int | 100 |
byteCapacityBufferPercentage | 否 | int(百分比) | 20% |
byteCapacity | 否 | long(字节) | JVM堆大小的80% |
keep-alive | 否 | int | 3秒 |
通道的默认容量是100个事件,可以通过设置capacity属性来实现:
agent.channels.c1.capacity=200
如果增加了这个值,那么还需要增加java堆空间大小,方式是使用-Xmx以及可选的-Xms参数实现。
你可以设定的另一个与容量相关的设置是transactionCapacity。他指的是源的ChannelProcessor(负责在单个事务
中将数据从源
移动到通道
中的组件)可以写入的最大的事件数量。它也指的是SinkProcessor(负责将数据从通道
移动到接收器
的组件)在单个事务中所能读取的最大的事件数量。可以将这个值设大一些,从而降低事务包装器的代价,提升速度,对于失败事件来说,增加这个值的弊端在于源需要回滚更多的数据。
keep-alive参数指的是通道已满并且在放弃前,线程将数据写到通道中的等待时间。由于数据同时也在从通道中被写出,因此如果在超时到期后又有了新的空间,那么数据还是会被写入通道中,而不会向源抛异常。如果将此值设置的非常大,等待写入到通道会阻塞数据进入到源中,这可能会导致数据堵在上游代理中。最后,这会造成事件被丢弃。需要针对周期性的流量变化以及临时计划的维护情况进行调整。
文件通道指的是将事件存储到代理本地文件系统中的通道,虽然要比内存通道慢一些,不过它却提供了持久化的存储了路径,可以应对大多数情况,他应该用在数据流中不允许出现缺口的场合。
这种持久化能力是由Write Ahead Log(WAL 简单来说就是:做一个操作之前先讲这件事情记录下来的意思)以及一个或多个文件存储目录联合提供的。WAL用于以一种原子且安全的方式追踪来自于通道的所有输入与输出。通过这种方式,如果代理重启,那么WAL可以重放,从而确保在清理本地文件系统给的数据存储前进入到通道中的所有事件都会被写出。
如果想使用文件通道,将通道参数设定为file:
agent.channels.c1.type=file
键 | 是否必须 | 类型 | 默认值 |
---|---|---|---|
type | 是 | String | file |
checkpointDir | 否 | String | ~/.flume/file-channel/checkpoint |
dataDirs | 否 | String(逗号分隔的列表) | ~/.flume/file-channel/data |
capacity | 否 | int | 1000000 |
keep-alive | 否 | int | 3秒 |
transactionCapacity | 否 | int | 1000 |
checkpointInterval | 否 | long | 300000毫秒即5分钟 |
write-timeout | 否 | int | 10秒 |
maxFileSize | 否 | long | 2146435071字节 |
minimumRequiredSpace | 否 | long | 524288000字节 |
要想指定Flume代理持有数据的位置,需要设定checkpointDir与dataDirs属性:
agent.channels.c1.checkpointDir=/flume/c1/checkpoint
agent.channels.c1.dataDirs=/flume/c1/data
默认的文件通道容量是100万个事件,无论事件内容的大小是多少均如此。如果到达了通道容量,那么源就无法再接收数据了,如果接收的数量很大,导致无法忍受正常规划或未规划的中断,那么可以调整该值。例如Hadoop中有很多配置改变需要重启集群,如果Flume向Hadoop中写入的是一些重要数据,那么文件通道就应该调整以接受Hadoop重启的时间。
keep-alive参数类似于内存通道。它指的是满载的通道在放弃前,源尝试写入到通道中的最大等待时间。如果超过这个时间前又有可用空间了,那么写入就将成功,否则会向源抛出ChannelException异常。
属性transactionCapacity指的是在单个事务中所允许的最大事件数量。对于某些源来说,他们会将事件集中到一起,然后在单个调用中传递给通道,对于这种情况来说,该参数就很重要。一般默认值无需改变,将该值设的比较高会在内部分配额外的资源,因此除非遇到性能问题,否则不应该增加该值。
checkpointInterval属性指的是两个检查点之间间隔的毫秒数,不能将该值设为低于1000毫秒。