⭐简单说两句⭐
✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! 🔒 以下内容仅对你可见~
作者:不正经小新,CSDN后端领域新星创作者 |阿里云专家博主
CSDN个人主页:不正经小新
🔎GZH:
不正经小新🎉欢迎关注🔎点赞👍收藏⭐️留言📝
DataStream API - socketTextStream源码分析
今天来通过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");
}
}
这段代码的逻辑很简单
- 从Socket为Source Stream
- flatMap切分输入行为若干单词
- 按照单词进行keyBy
- 以5秒为窗口,进行在处理时间属性上的滚动开窗
- 进行sum聚合求和
- print输出聚合值到控制台
🍉核心Api源码
🍌socketTextStream
从socketTextStream方法进入到了Environment中,经过几层简单的重载到了addSource方法:
这里将重载过程增加的默认参数,例如,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
最终调用了DataStream的构造
所以,经过以上对socketTextStream的函数调用栈分析,结论是最终返回了一个DataSteam实例,并且实例中持有两个重要的实例:tansformation、environment。
- tansformation是对SocketTextStreamFunction的封装
- environment是用于持有上下文环境
【都看到这了,点点赞点点关注呗,爱你们】😚😚
💬
✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! 🔒 以下内容仅对你可见~
作者:不正经小新,CSDN后端领域新星创作者 |阿里云专家博主
CSDN个人主页:不正经小新
🔎GZH:不正经小新
🎉欢迎关注🔎点赞👍收藏⭐️留言📝