SeaTunnel 2.1.2的源码解析(2)seatunnel-connectors-flink-file

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star

随着业务的数据量越来越多,采用的数据库也多样,SeaTunnel【简称ST】开源项目也充当一个数据集成的角色工具。分析SeaTunnel源码的同时也更熟悉flink的使用,这篇文章讲解seatunnel-connectors-flink-file这小模块的代码。


提示:以下是本篇文章正文内容,下面源码分析可供参考,如有出错请指正!

1、总览

SeaTunnel2.1.2的源码分析

2、ST封装flink连接文件的源码分析

1.FileSink类的outputStream流输出函数

源码如下(根据滚动策略、输出文件配置来创建一个流式文件系统的连接器:StreamingFileSink):

@Override
    public void outputStream(FlinkEnvironment env, DataStream<Row> dataStream) {
        final DefaultRollingPolicy<Row, String> rollingPolicy = DefaultRollingPolicy.builder()
      			 //自定义配置或者默认文件大小已达到1GB就会滚动分区文件
                .withMaxPartSize(MB * TypesafeConfigUtils.getConfig(config, MAX_PART_SIZE, DEFAULT_MAX_PART_SIZE)) 
                //自定义配置或者默认至少包含60分钟的数据就会滚动分区文件
                .withRolloverInterval(
                        TimeUnit.MINUTES.toMillis(TypesafeConfigUtils.getConfig(config, ROLLOVER_INTERVAL, DEFAULT_ROLLOVER_INTERVAL))) 
                .build();
        OutputFileConfig outputFileConfig = OutputFileConfig.builder()
                .withPartPrefix(TypesafeConfigUtils.getConfig(config, PART_PREFIX, DEFAULT_PART_PREFIX))
                .withPartSuffix(TypesafeConfigUtils.getConfig(config, PART_SUFFIX, DEFAULT_PART_SUFFIX))
                .build();
        //流式文件系统的连接器:StreamingFileSink<Row>
        //行编码:StreamingFileSink.forRowFormat(basePath,rowEncoder)
        final StreamingFileSink<Row> sink = StreamingFileSink
                .forRowFormat(filePath, new SimpleStringEncoder<Row>())
                .withRollingPolicy(rollingPolicy)
                .withOutputFileConfig(outputFileConfig)
                .build();
        dataStream.addSink(sink);
    }

2.FileSink类的outputBatch批输出函数

源码如下():

@Override
    public void outputBatch(FlinkEnvironment env, DataSet<Row> dataSet) {
        //设置文件输出的格式【json\csv\txt】
        FormatType format = FormatType.from(config.getString(FORMAT).trim().toLowerCase());
        switch (format) {
            case JSON:
                RowTypeInfo rowTypeInfo = (RowTypeInfo) dataSet.getType();
                outputFormat = new JsonRowOutputFormat(filePath, rowTypeInfo);
                break;
            case CSV:
                outputFormat = new CsvRowOutputFormat(filePath);
                break;
            case TEXT:
                outputFormat = new TextOutputFormat<>(filePath);
                break;
            default:
                LOGGER.warn(" unknown file_format [{}],only support json,csv,text", format);
                break;

        }
        //设置写入模式【overwrite\no_overwrite】
        if (config.hasPath(WRITE_MODE)) {
            String mode = config.getString(WRITE_MODE);
            outputFormat.setWriteMode(FileSystem.WriteMode.valueOf(mode));
        }

        DataSink<Row> dataSink = dataSet.output(outputFormat);
        //设置并行度
        if (config.hasPath(PARALLELISM)) {
            int parallelism = config.getInt(PARALLELISM);
            dataSink.setParallelism(parallelism);
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值