8. Flume技术之自定义Sink

Flume技术之自定义Sink

1. 自定义sink介绍

  1. Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent。

  2. Sink 是完全事务性的。在从 Channel 批量删除数据之前,每个 Sink 用 Channel 启动一个事务。批量事件一旦成功写出到存储系统或下一个 Flume Agent,Sink 就利用 Channel 提交事务。事务一旦被提交,该Channel 从自己的内部缓冲区删除事件。

  3. Sink 组件目的地包括 hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义。官方提供的 Sink 类型已经很多,但是有时候并不能满足实际开发当中的需求,此时我们就需要根据实际需求自定义某些 Sink。

  4. 官方也提供了自定义 sink 的接口:https://flume.apache.org/FlumeDeveloperGuide.html#sink

  5. 根据官方说明自定义MySink 需要继承 AbstractSink 类并实现 Configurable 接口,实现相应方法:

    • configure(Context context) 初始化 context(读取配置文件内容)
    • process() 从 Channel读取获取数据(event),这个方法将被循环调用。
  6. 使用场景:读取 Channel 数据写入 MySQL 或者其他文件系统。

2. 需求

使用 flume 接收数据,并在 Sink 端给每条数据添加前缀和后缀,输出到控制台。前后缀可在 flume 任务配置文件中配置

在这里插入图片描述

3. 自定义sink代码

依赖:

        <dependency>
            <groupId>org.apache.flume</groupId>
            <artifactId>flume-ng-core</artifactId>
            <version>1.7.0</version>
        </dependency>

代码实现:

/**
 * @Date 2020/8/11 17:39
 * @Version 10.21
 * @Author DuanChaojie
 */
public class MySink extends AbstractSink implements Configurable {

    /**
     * 创建Logger对象
     */
    private static final Logger log = LoggerFactory.getLogger(AbstractSink.class);
    private String prefix;
    private String suffix;

    public void configure(Context context) {
        // 堆取配置文件的内容,有默认值
        prefix = context.getString("prefix","hello");
        // 读取配置文件内容,无默认值
        suffix = context.getString("suffix");
    }

    public Status process() throws EventDeliveryException {
        // 1.声明返回值装填信息
        Status status;
        // 2.获取当前sink绑定的channel
        Channel ch = getChannel();
        // 3.获取事务
        Transaction tx = ch.getTransaction();

        // 4.声明事件
        Event event;

        // 5.开启事务
        tx.begin();

        // 6.读取channel中的事件,直接读取到事件结束循环
        while(true){
            event = ch.take();
            if (event != null){
                break;
            }
        }

        try {
            // 7.处理事件
            log.info(prefix + new String(event.getBody()) + suffix);

            // 8.事务提交
            tx.commit();
            status = Status.READY;
        } catch (Exception e) {
            // 遇到异常,事务回滚
            tx.rollback();
            status = Status.BACKOFF;
            e.printStackTrace();
        }finally {
            // 关闭事务
            tx.close();
        }
        return status;
    }
}

打成jar包guli-flume-1.0-SNAPSHOT.jar上传到/opt/module/flume/lib/目录下

4. 测试自定义的MySink

4.1 配置文件flume.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = hadoop
a1.sources.r1.port = 44444

# Describe the sink
a1.sinks.k1.type = com.atguigu.flume.sink.MySink
#a1.sinks.k1.prefix = hi
a1.sinks.k1.suffix = atguigu

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
4.2 运行Flume
bin/flume-ng agent -c conf/ -n a1 -f job/mysink/flume.conf -Dflume.root.logger=INFO,console
4.3 查看结果

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值