kafka-connect-fs 二次开发总结

   kafka-connect-fs 项目是一个开源的fluent connecor,它可以从文件系统读取文件,并加载到kafka中。它支持以下特性    

  • Several sort of File Systems (FS) to use.
  • Dynamic and static URIs to ingest data from.
  • Policies to define rules about how to look for files.
  • File readers to parse and read different kind of file format

   支持的文件格式包括Avro、Parquet、SequenceFile、Text以及Delimited text ,并且支持Simple policy和Sleepy policy,项目具体明细可查看github:https://github.com/mmolimar/kafka-connect-fs/

   在实际应用中,需要读取AWS S3上的gz文件,在kafka-connect-fs中未有相关FileReader实现,在整体的处理框架中,该项目采用了策略模式,根据实际应用需求,需要实现符合实际需求的FileReader和policy策略类。

   1、AwsTextFileReader

       实现从AWS s3 中读取gz的压缩文件,其中主要用到GZIPInputStream即可,即可读取压缩的文件流,但在给定一个较多文件的S3文件路径进行读取时,读取的文件达到一定时,会出现以下错误:

     原因分析:在github中有人提交这个issues:Missing reader.close ? 但是作者添加的reader.close方法并不是很全,因为文件可能包含两种内容格式,1是全部是数据,没有文件头,2 是第一行为文件头,即数据的schema信息,其余行为数据,作者的解决方式只是解决了2文件格式内容的问题,但对于1文件格式内容未完全解决,在此情况下,其实现逻辑会将reader重新赋值,但原来的reader并未销毁,文件读取到一定程度的情况下,会存在大量未关闭的文件reader,最后导致上述问题。

    解决方式:

    @Override
    public void seek(Offset offset) {
        if (offset.getRecordOffset() < 0) {
            throw new IllegalArgumentException("Record offset must be greater than 0");
        }
        try {
            if (offset.getRecordOffset() < reader.getLineNumber()) {
                this.reader.close();
                this.reader =  null;
                this.reader = new LineNumberReader(new InputStreamReader(new GZIPInputStream(getFs().open(getFilePath())),this.charset));
                currentLine = null;
            }
            while ((currentLine = reader.readLine()) != null) {
                if (reader.getLineNumber() - 1 == offset.getRecordOffset()) {
                    this.offset.setOffset(reader.getLineNumber());
                    return;
                }
            }
            this.offset.setOffset(reader.getLineNumber());
        } catch (IOException ioe) {
            throw new ConnectException("Error seeking file " + getFilePath(), ioe);
        }
    }

    重置reader的时候将reader close并置为空即可,参照L8-9行。

 2:*Policy  策略类

     根据实际的情况编写自己的Policy类,并继承 AbstractPolicy即可。

   二次开发完成之后进行maven编译 mvn package -DskipTests 。将编译的文件同一复制到/usr/local/confluent-5.0.0/share/java/下,并在confluent worker节点到配置添加此connector , 

plugin.path=/usr/local/confluent-5.0.0/share/java/kafka-connect-fs

  

kafka-connect-transform-kryptonite 是 Kafka Connect 的一个转换器插件。Kafka Connect 是一个可扩展的分布式数据集成工具,可用于在 Apache Kafka 和外部系统之间进行可靠和高效的数据流传输。而 Kafka Connect 转换器是用于对数据进行转换、过滤或处理的插件。 Kafka Connect 是一个开源的分布式数据集成框架,用于连接和处理来自各种数据源的数据,例如数据库、消息队列和文件系统等。它提供了一个统一的、可扩展的架构,允许用户将数据从多个来源导入到 Kafka 中,并将数据导出到多个目标系统。这为数据集成提供了更加灵活和可靠的方式,且能够满足各种实时数据处理的需求。 Kafka Connect 的一个关键特性是插件化的架构,使得用户可以根据自己的需求,选择和配置合适的插件。其中,kafka-connect-transform-kryptonite 插件就是其中之一。Kryptonite 可以理解为一种“解除”或“削弱”转换器,它可能采用一些特定的规则或算法,对输入的数据进行加工、转换或过滤。 使用 kafka-connect-transform-kryptonite 插件,我们可以根据具体的业务需求,对 Kafka 中的消息进行处理。例如,我们可以通过 Kryptonite 转换器,将消息中的某些字段进行加密,以保护敏感数据的安全;或者根据一些规则,对消息进行过滤和筛选,只保留我们关心的数据。 总之,kafka-connect-transform-kryptonite 是 Kafka Connect 提供的一个转换器插件,可以用于对数据进行加工、转换和过滤。通过这个插件,我们可以根据业务需求对 Kafka 中的消息进行定制化处理,以满足不同场景下的数据集成和处理需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值