1.在Flume中,通道指的是位于源与接收器之间的构件。它为流动的事件提供了一个中间区域,从源中读取并且被写到数据处理管道中的接收器的事件处于这个区域中。
2.通道类型
1.内存/非持久化通道
2.本地文件系统/持久化通道
持久化文件通道会在发送者接收到事件前将所有变化写到磁盘上。它要比非持久化的内存通道要慢一些,不过可以在出现系统事件或是Flume代理重启时进行恢复。
3.内存通道
1.内存通道指的是事件存储在内存中通道。由于通常情况下,内存的速度要比磁盘快几个数量级,因此事件的接收速度也会更快,降低了对硬件的需求量。
2.弊端:代理失败(如硬件问题,断电,JVM崩溃,Flume重启等)会导致数据丢失。
3.要想使用内存通道,请将通道的type参数设定为memory: agent.channels.c1.type=memory
键 | 是否必须 | 类型 | 默认值 | 备注 |
type | 是 | String | memory | |
capacity | 否 | int | 100 | 可以通过设置capacity属性来达成:agent.channels.c1.capacity=20 如果增加了这个值,需要增加Java堆空间大小,使用-Xmx以及可选的-Xms参数实现 |
transactionCapacity | 否 | int | 100 | 指的是源的ChannelProcessor(负责在单个事务中将数据从源移动到通道中的组件)可以写入的最大的事件数量。它也指的是SinkProcessor(负责将数据从通道移动到接收器组件)在单个事务中所能读取的最大的事件数量。对于失败事件来说,增加这个值的弊端在于源需要回滚更多的数据。 |
byteCapacityBufferPercentage | 否 | int(百分比) | 20% | 使用字节而非事件数量来作为调整内存通道大小的方式。同时还避免了OutOfMemoryErrors。如果事件大小的变化范围很大,应该使用这些设置来调整容量。 |
byteCapacity | 否 | long(字节数) | JVM堆大小的80% | 同上 |
keep-alive | 否 | int | 3秒 | 通道已满且在放弃前,线程将数据写到通道中等待时间。等待写入到通道会阻塞数据进入源中,这可能会导致数据堵在上游代理中。最后会造成事件被丢弃。 |
4.文件通道
1.文件通道指的是将事件存储到代理本地文件系统中的通道。虽然要比内存通道慢一些,不过它却提供了持久化的存储路径。可以应对大多数情况,应该应用在数据流中不允许出现缺口的场合。
这种持久化能力是由Write Ahead Log(WAL)以及一个或多个文件存储目录联合提供的。
WAL用于以一种原子且安全的方式追踪来自于通道的所有输入与输出。通过这种方式,如果代理重启,那么WAL可以重放,从而确保在清理本地文件系统的数据存储前进入到通道中的所有事件都会被写出。
要使用文件通道,可以将通道的type参数设定为file:
agent.channels.c1.type = file
键 | 是否必须 | 类型 | 默认值 | 备注 |
type | 是 | String | file | |
checkpointDir | 否 | String | ~/.flume/file-channel/checkpoint | |
dataDirs | 否 | String(逗号分隔的列表) | ~/.flume/file-channel/data | |
capacity | 否 | int | 100000 | |
keep-alive | 否 | int | 3秒 | |
transactionCapacity | 否 | int | 1000 | |
checkpointInterval | 否 | long | 300000毫秒,即5分钟 | |
write-timeout | 否 | int | 10秒 | |
maxFileSize | 否 | long | 2146435071字节 | |
minimumRequiredSpace | 否 | long | 524288000字节 |