1.组成、事务
source-》put-》channel-》take-》sink
source:tirdirSource 支持断点续传
channel:file、mem、kafka(与kafka的兼容性做的非常好,在flume1-》kakfa-》flume2的结构中,flume1使用kafkachannel(相当于kafka的生产者)【减少了sink操作】,kafka在传到flume2【消费者】(kafkachannel、hdfs sink)中)
2.拦截器-Flume拦截器是Flume的一个重要组件,其作用是对事件流进行实时的转换和处理。
项目中主要实现了ETL拦截器(格式和数据是否完整)和日志类型区分拦截器(分发到不同的topic)
自定义拦截器步骤:
一、实现intercept接口
二、1重写initialize方法
2重写intercept方法 单个event
3重写intercept方法 list
4重写close()
三、静态内部类,实现interceptor.Builder,作用是新建当前拦截器类的实例(在Build方法中),传入参数进行构造
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public class DataFilterInterceptor implements Interceptor {
private List
private DataFilterInterceptor(List
this.filterWords = filterWords;
}
@Override
public void initialize() {
// 初始化方法,可以在这里进行一些初始化操作
}
@Override
public Event intercept(Event event) {
// 获取事件中的原始数据
String eventData = new String(event.getBody(), StandardCharsets.UTF_8);
// 检查原始数据中是否包含过滤词汇,如果包含则忽略该事件
for (String word : filterWords) {
if (eventData.contains(word)) {
return null; // 返回null表示忽略该事件
}
}
// 返回处理后的事件
return event;
}
@Override
public List
List
for (Event event : events) {
Event interceptedEvent = intercept(event);
if (interceptedEvent != null) {
interceptedEvents.add(interceptedEvent);
}
}
return interceptedEvents;
}
@Override
public void close() {
// 关闭方法,可以在这里进行一些清理操作
}
public static class Builder implements Interceptor.Builder {
private List
@Override
public Interceptor build() {
return new DataFilterInterceptor(filterWords);
}
@Override
public void configure(Context context) {
// 从配置中获取过滤词汇列表
String filterWordsStr = context.getString("filterWords");
filterWords = new ArrayList<>();
// 将逗号分隔的过滤词汇添加到列表中
for (String word : filterWordsStr.split(",")) {
filterWords.add(word.trim());
}
}
}
}
3.channel选择器
根据不同的日志主题分发到不同的sink中,主要有两种:1多路复用multipexingCS根据数据类型的不同 2广播分发 replicatingCS
4.监控器
ganglia
日常优化
5.容错机制
5.1.多种类型channel选择,file、mem、kafka、JDBC,其中file、JDBC、kafka都是有可靠性保证,支持持久化到磁盘。
5.2.支持事务-kafka、JDBC channel支持事务,当事件传输过程中出现错误时,可以回滚或重新发送。
5.3.控制channel的大小,确保可以维持高峰时期的运作。
5.4.source、channel、sink的监控
6.flume内存
优化角度4个方面:
6.1.JVM中heap 4G大小分配, 初始内存和最大内存大小保持一致,避免内存抖动和fullgc的发生(都是内存不足导致的)-Xmx
参数设置最大堆内存大小,使用 -Xms
参数设置初始堆内存大小。例如,-Xmx2g
表示最大堆内存为 2GB
6.1.1.内存抖动,当内存空间不足以容纳应用程序时,会置换一定的内存页面到磁盘的虚拟内存当中。
6.1.2.fullgc 垃圾回收的机制之一,与之相对应的是 partial gc。为什么要垃圾回收,主要是定期释放已使用完毕的内存空间以供后续使用。fullgc运行时会让执行应用程序停止运行以保证正确进行垃圾回收,故影响系统运行的效率,应尽量避免fullgc。
6.2.channel内存 Flume 中的 Channel 组件可以使用内存来缓存事件数据。可以通过配置 Channel 的 capacity
参数来设置内存容量大小。例如,capacity = 10000
表示 Channel 的内存容量为 10000 个事件。
6.3 sink缓冲内存 Sink 组件在处理事件数据时,可能使用内存缓冲区来提高写入性能。一些 Sink 类型(如 HDFS Sink)提供了相关的配置选项,例如 batchSize
或 batchSizeBytes
,用于设置内存缓冲区的大小
6.4 JVM调优
7.file channel优化
将datadir存放到多个磁盘的多个目录底下开增加flume吞吐量
8.HDFSsink小文件
影响:元数据 计算
应对:合并小文件、数据分区、动态调整滚动策略(数据写入时决定写入多少内容后重新开一个文件)、数据压缩