Flume超详细知识点汇总(进阶篇)

1.Flume事务

1.1Flume事务介绍

防止两端数据不一致情况的发生,需要在flume组件之间定义事务,即保证组件之间数据传递的可靠性,一致性.

在Flume中一共有两个事务
Put事务:在Source组件和Channel组件之间, take事务:在Channel组件和Sink组件之间

这里需要注意的是: 创建事务只能保证flume内部的数据是可靠的,如果flume读取的是网络端口的数据,即source组件为netcat source,监控过程中,source流向channel的这一步出现问题,事务会回滚,但网络端口之前的数据源读取不了,这个时候数据会发生丢失.同时如果下游sink端流向其它地方(一般是HDFS上)时,数据还没传完,发生故障,这时事务会发生回滚,待故障解决完之后,数据会重新传输,这时接收的数据端会发生重复,以上这两种情况要注意.

1.2事务流程图

这里需要留有印象,channel始终是被动的,source主动往channel里推送数据,sink端主动从channel拿数据.数据在flume内部是被包装为事件,通过event流转的

2.Flume Agent内部原理

2.1原理介绍

这里面有几个点着重说明下:

1. 数据被包装成event后,在流通过程中,从拦截器Interceptor出来之后,event会增加哪些内容?
这里需要明白拦截器的功能就是:根据实际需求对event(map集合) 加工或者过滤 ,比如增加时间戳,即时间拦截器,会在event的Header中添加一个key为timestamp,value为当前时间戳的值,还有静态拦截器,主机名拦截器等等.或者根据正则表达式等对一些数据进行过滤,不符合要求的丢弃

2.channel选择器是干什么的?
Channel Selectors有两种类型,Replicating(复制) 和Multiplexing(多路复用);flume的channel选择器默认是第一种类型,往每个channel通道里发送一份数据,第二种类型需要自定义拦截器规则,将其发送到不同的channel里, Multiplexing的原理是:根据event中Header的某个key的值,将不同的event发送到不同的Channel中,案例见文末.

3. channel一个可以发给多个sink,一个sink只能接收一个channel传来的数据

2.2原理流程图

3.典型案例:多路复用和拦截器的使用

3.1需求分析

在实际的开发中,一台服务器产生的日志类型可能有很多种,不同类型的日志可能需要发送到不同的分析系统。
此时会用到Flume的channel selecter中的Multiplexing结构。
情景:以端口数据模拟日志,通过在客户端输入不同的数字或者字母,将数字发往一个channel,字母发往另一个channel,Sink端用logger进行接收,说道这里,小伙伴们想想该如何配置source-channel-sink组件呢?

3.2实现步骤

1. 自定义拦截器,代码如下:
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;

import java.util.List;

public class CustomInterceptor implements Interceptor {
    @Override
    public void initialize() {
        //初始化的,需要对数据初始化赋值时用到
    }
    @Override
    public Event intercept(Event event) {
        // 1. 从事件中获取数据
        byte[] body = event.getBody();
        // 2. 判断数据开头的字符是字母还是数据
        if (body[0] >= 'a' && body[0] <= 'z') {
            event.getHeaders().put("type", "letter");         // 是字母就在事件头部设置type类型为letter
        } else if (body[0] >= '0' && body[0] <= '9') {
            event.getHeaders().put("type", "number");         // 是数字就在事件头部设置type类型为number
        }
        // 3. 返回事件
        return event;
    }

    @Override
    public List<Event> intercept(List<Event> list) {
        for (Event event : list) {
            intercept(event);
        }
        return list;
    }

    @Override
    public void close() {

    }


    // 拦截器对象的构造对象
    public static class Builder implements Interceptor.Builder {

        @Override
        public Interceptor build() {
            return new CustomInterceptor();
        }

        @Override
        public void configure(Context context) {
        }
    }
}
2. 打成jar,拖进linux 中flume目录下的lib目中,lib目录放的都是依赖,jar包
3. 编写3个配置文件,这部分内容如果有不熟悉的地方,详见 Flume超详细知识点汇总(基础篇)
分别是:flume-1-netcat-avro,flume-2-avro-logger,flume-3-avro-logger
# 文件名:flume-1-netcat-avro
# agent
a1.sources=r1
a1.sinks=k1 k2
a1.channels=c1 c2

# source
a1.sources.r1.type = netcat
a1.sources.r1.bind= hadoop102
a1.sources.r1.port=44444

# 配置拦截器
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = com.atguigu.demo1.CustomInterceptor$Builder
# 配置channel选择器
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = type
a1.sources.r1.selector.mapping.letter = c1
a1.sources.r1.selector.mapping.number = c2


# sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = hadoop102
a1.sinks.k1.port = 4142

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = hadoop102
a1.sinks.k2.port = 4143


# channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 100
a1.channels.c1.transactionCapacity = 100

a1.channels.c2.type = memory
a1.channels.c2.capacity = 100
a1.channels.c2.transactionCapacity = 100

# bind
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2
# flume-2-avro-logger
# agent
a1.sources=r1
a1.sinks=k1
a1.channels=c1

# source
a1.sources.r1.type = avro
a1.sources.r1.bind = hadoop102
a1.sources.r1.port = 4142


# sink
a1.sinks.k1.type = logger


# channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 100
a1.channels.c1.transactionCapacity = 100

# bind
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
# flume-3-avro-logger
# agent
a1.sources=r1
a1.sinks=k1
a1.channels=c1

# source
a1.sources.r1.type = avro
a1.sources.r1.bind = hadoop102
a1.sources.r1.port = 4143


# sink
a1.sinks.k1.type = logger


# channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 100
a1.channels.c1.transactionCapacity = 100

# bind
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
4.开启flume
开启原则:基于C/S架构,先开启服务端,再开启客户端,同理关闭时先关闭客户端,再关闭服务端
特别注意:下游是服务端,flume-2和flume-3是平行运行,先开启哪一个无所谓
# flume-2
bin/flume-ng agent -n a1 -c conf/ -f job/enterprise/multi/flume-2-avro-logger.conf
# flume-3
bin/flume-ng agent -n a1 -c conf/ -f job/enterprise/multi/flume-3-avro-logger.conf
# flume-1
bin/flume-ng agent -n a1 -f job/enterprise/multi/flume-1-netcat-avro.conf
# 开启客户端,监听端口44444
nc hadoop102 44444

4.总结

Flume就是一个对海量的日志的采集,传输系统.通过配置source-channel-sink组件对文件夹进行实时监控与传输.
Flume具有良好的扩展性,架构是完全分布式的,没有任何中心化组件,它非常容易扩展。
同时高度定制化:各个组件(比如 Source 、 Channel 和 Sink 等)是可插拔的,用户很容易根据需求进行定制。

📊📊📊文本为学习之余,梳理的知识点,有初学的小伙伴可以慢慢研究,有疑惑的地方可在下方留言,欢迎大家随时交流.

📊📊📊如果有喜欢的小伙伴,欢迎点赞,收藏及留言,谢谢你们😘~

📊📊📊如有错误之处,请随时指正!!!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据青椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值