Flink-socketTextStream源码分析

134 阅读3分钟

简单说两句

✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! 🔒 以下内容仅对你可见~

作者:不正经小新CSDN后端领域新星创作者 |阿里云专家博主

CSDN个人主页:不正经小新

🔎GZH不正经小新

🎉欢迎关注🔎点赞👍收藏⭐️留言📝

DataStream API - socketTextStream源码分析

image-20241111230741592

今天来通过WordCount一个简单的Demo来分析一下DataStream的源码~

🍎WC代码入口分析

WordCount代码清单

@Slf4j
public class WordCount {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStream<String> source = env.socketTextStream("localhost", 9999);
        source.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {

                    @Override
                    public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
                        if (StringUtils.isNotEmpty(value)) {
                            String[] words = value.split(" ");
                            for (String word : words) {
                                out.collect(new Tuple2<>(word, 1));
                            }
                        }
                    }
                })
                .keyBy(x -> x.f0)
                .window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
                .sum(1)
                .print();

        env.execute("✨tiancx Word Count Job");
    }
}

这段代码的逻辑很简单

  1. 从Socket为Source Stream
  2. flatMap切分输入行为若干单词
  3. 按照单词进行keyBy
  4. 以5秒为窗口,进行在处理时间属性上的滚动开窗
  5. 进行sum聚合求和
  6. print输出聚合值到控制台

🍉核心Api源码

🍌socketTextStream

从socketTextStream方法进入到了Environment中,经过几层简单的重载到了addSource方法:

image-20241109162655819

image-20241109162709158

image-20241109162733128

这里将重载过程增加的默认参数,例如,delimiter,maxRetry一起打包生成一个SocketTextStreamFunction实例。并调用addSource进行添加。

点进addSource方法

   public <OUT> DataStreamSource<OUT> addSource(
            SourceFunction<OUT> function, String sourceName, TypeInformation<OUT> typeInfo) {
        return addSource(function, sourceName, typeInfo, Boundedness.CONTINUOUS_UNBOUNDED);
    }

最内层的Source重载

    private <OUT> DataStreamSource<OUT> addSource(
            final SourceFunction<OUT> function,
            final String sourceName,
            @Nullable final TypeInformation<OUT> typeInfo,
            final Boundedness boundedness) {
        checkNotNull(function);
        checkNotNull(sourceName);
        checkNotNull(boundedness);

        TypeInformation<OUT> resolvedTypeInfo =
                getTypeInfo(function, sourceName, SourceFunction.class, typeInfo);

        boolean isParallel = function instanceof ParallelSourceFunction;

        clean(function);

        final StreamSource<OUT, ?> sourceOperator = new StreamSource<>(function);
        return new DataStreamSource<>(
                this, resolvedTypeInfo, sourceOperator, isParallel, sourceName, boundedness);
    }

这个函数里主要逻辑:

  • 参数校验

  • 通过getTypeInfo方法获取或推断数据的类型信息。

  • 检查function是否为ParallelSourceFunction的实例,以确定数据源是否可以并行处理。

  • 调用clean方法对数据源函数进行必要的清理或初始化工作。

  • 创建一个StreamSource对象,包装数据源函数。

  • 最后,构造一个DataStreamSource对象并返回,该对象包含了数据源的所有必要信息,如类型信息、并行性、数据源名称和有界性。

在DataStreamSource构造方法中,调用了DataStream的构造方法,传入了一个LegacySourceTransformation

image-20241109165731127

最终调用了DataStream的构造

image-20241109165844159

所以,经过以上对socketTextStream的函数调用栈分析,结论是最终返回了一个DataSteam实例,并且实例中持有两个重要的实例:tansformationenvironment

  • tansformation是对SocketTextStreamFunction的封装
  • environment是用于持有上下文环境

image-20241109223539668

【都看到这了,点点赞点点关注呗,爱你们】😚😚

不正经小新-小

💬

✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! 🔒 以下内容仅对你可见~

作者:不正经小新CSDN后端领域新星创作者 |阿里云专家博主

CSDN个人主页:不正经小新

🔎GZH不正经小新

🎉欢迎关注🔎点赞👍收藏⭐️留言📝