flume面经

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 filterWords;

    private DataFilterInterceptor(List filterWords) {
        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 intercept(List events) {
        List interceptedEvents = new ArrayList<>();

        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 filterWords;

        @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)提供了相关的配置选项,例如 batchSizebatchSizeBytes,用于设置内存缓冲区的大小

        6.4 JVM调优

7.file channel优化

将datadir存放到多个磁盘的多个目录底下开增加flume吞吐量

8.HDFSsink小文件

影响:元数据 计算

应对:合并小文件、数据分区、动态调整滚动策略(数据写入时决定写入多少内容后重新开一个文件)、数据压缩

你可能感兴趣的:(flume,java,kafka)