flume MemoryChannel分析

本文深入分析了Flume中的MemoryChannel,它是一个完全在内存中运行的快速通道,但不支持持久化,数据易丢失。MemoryChannel包括Channel、Transaction和Configurable接口,其中关键操作在MemoryTransaction内部类实现,涉及put、get、commit和rollback方法。当异常发生时,会触发rollback,将数据回滚到Channel。了解MemoryChannel有助于理解Flume中更复杂的FileChannel和KafkaChannel。
摘要由CSDN通过智能技术生成

前边介绍了flume的基本概念和Source部分,接下来看看flume中的第二大组件Channel中的MemoryChannel。MemoryChannel是完全在内存中运行,速度很快,其优点同样也就成了缺点,不能持久化,若机器发生宕机或断电,数据就会丢失。在实际使用中需要根据具体的需求进行合理的选择。 
先看下MemoryChannel的基本的类图,根据这个结构图可以很好的帮助理解。 
 
MemoryChannel中最重要的部分主要是Channel、Transaction 和Configurable三个接口。 
Channel接口中主要声明了Channel中的三个方法:

 
 
 
  1. public void put(Event event) throws ChannelException; //刚方法从指定的Source中获得Event放入指定的Channel中
  2. public Event take() throws ChannelException; //take方法主要是从Channel中取出event放入Sink中
  3. public Transaction getTransaction(); //getTransaction方法是获得当前Channel的事务实例

Transaction接口主要声明了flume中事务机制的四个方法:

 
 
 
  1. enum TransactionState { Started, Committed, RolledBack, Closed } //枚举类型,指定了事务的四种状态,事务开始、提交、失败回滚、关闭
  2. void begin();
  3. void commit();
  4. void rollback();
  5. void close();

Configurable接口主要是和flume配置组件相关的,需要从flume配置系统获取配置信息的任何组件,都必须实现该接口。该接口中只声明了一个context方法,用于获取配置信息。 
以上方法的具体内容都是在具体的Channel中实现的,系统在启动时会根据配置文件信息调用相应的组件的方法实现,这种实现称为回调,类似于C语言中的钩子函数,先声明方法然后在具体的需要时调用相应的实现方法。

接下来看看具体的代码实现,代码开始是定义一些默认的配置信息,Channel、Transaction事务大小等信息:

 
 
 
  1. public class MemoryChannel extends BasicChannelSemantics {
  2. private static Logger LOGGER = LoggerFactory.getLogger(MemoryChannel.class);
  3. private static final Integer defaultCapacity = 100;
  4. private static final Integer defaultTransCapacity = 100;
  5. private static final double byteCapacitySlotSize = 100;
  6. private static final Long defaultByteCapacity = (long)(Runtime.getRuntime().maxMemory() * .80);
  7. private static final Integer defaultByteCapacityBufferPercentage = 20;
  8. private static final Integer defaultKeepAlive = 3;

接下来就是实现Channel的put、get方法和事务的commit、rollback方法,这几个方法都是在内部类 MemoryTransaction 实现的,看到下边的几个方法名字,大家可能会问怎么每个方法前边都有个do,实际上这是因为 MemoryTransaction 继承了BasicTransactionSemantics抽象类,而不是直接实现了 Channel 和 Transaction 接口,在 BasicTransactionSemantics抽象接口中 对上边提到的几种方法做了一些简单的封装,在内部调用就是调用类似doTake的方法:

 
 
 
  1. protected Event take() {
  2. Preconditions.checkState(Thread.currentThread().getId() == initialThreadId,
  3. "take() called from different thread than getTransaction()!");
  4. Preconditions.checkState(state.equals(State.OPEN),
  5. "take() called when transaction is %s!", state);
  6. try {
  7. return doTake();
  8. } catch (InterruptedException e) {
  9. Thread.currentThread().interrupt();
  10. return null;
  11. }
  12. }

具体的 MemoryTransaction 内部类实现的几个方法如下代码:

 
 
 
  1. private class MemoryTransaction extends BasicTransactionSemantics {
  2. private LinkedBlockingDeque<Event> takeList; //阻塞双端队列,从channel中取event先放入takeList,输送到sink,commit成功,从channel queue中删除
  3. private LinkedBlockingDeque<Event> putList; //从source 会先放至putList,然后commit传送到channel queue队列
  4. private final ChannelCounter channelCounter
Flume是一个分布式、高可靠、高可用的日志收集系统,它的主要作用是将分布式环境中产生的海量数据进行汇聚和传输。Flume的核心组件包括Source、Channel和Sink,下面是这些组件常用的配置: 1. Source组件配置:Source组件是Flume的数据输入源,常用的Source组件有ExecSource、AvroSource、NetcatSource等。它们的配置主要包括监听地址、端口号、日志格式、字符集等,具体如下: ``` # 监听地址和端口号 a1.sources.r1.type = netcat a1.sources.r1.bind = 0.0.0.0 a1.sources.r1.port = 44444 # 日志格式和字符集 a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = regex_filter a1.sources.r1.interceptors.i1.regex = ^\[\d{4}-\d{2}-\d{2} a1.sources.r1.interceptors.i1.excludeEvents = false a1.sources.r1.interceptors.i1.charset = UTF-8 ``` 2. Channel组件配置:Channel组件是Flume的数据传输通道,常用的Channel组件有MemoryChannel、FileChannel、JDBCChannel等。它们的配置主要包括内存大小、数据保留时间、事务容量等,具体如下: ``` # 内存大小和事务容量 a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 数据保留时间 a1.channels.c1.keep-alive = 3m ``` 3. Sink组件配置:Sink组件是Flume的数据输出目标,常用的Sink组件有HDFS Sink、Kafka Sink、Avro Sink等。它们的配置主要包括输出地址、序列化格式、批处理大小等,具体如下: ``` # 输出地址和序列化格式 a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = /flume/%Y/%m/%d/%H/ a1.sinks.k1.hdfs.filePrefix = events- a1.sinks.k1.hdfs.fileSuffix = .log a1.sinks.k1.hdfs.rollInterval = 3600 a1.sinks.k1.hdfs.fileType = DataStream a1.sinks.k1.serializer = org.apache.flume.sink.hdfs.AvroEventSerializer$Builder # 批处理大小 a1.sinks.k1.batchSize = 1000 ``` 以上是Flume组件常用配置的一些示例,具体的配置内容和参数取决于具体的场景和需求。Flume支持丰富的配置选项,可以根据实际需要进行灵活配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值