第一次使用markdown编辑器
哈哈哈,还挺有意思的嘛,也算一个新技能,MarkDown编辑器。
言归正传,Flink代码学习
Flink目前是非常受关注的一个分布式流式数据处理引擎,虽然使用的过程可以借助Flink提供的API,但是如果不深入地跟踪Flink的代码,出问题的时候就无从下手,更不用提优化框架了。这篇博客的目的也是记录一下自己学习Flink代码的过程。
Flink的架构和执行流程
Flink的架构是由输入通道、中间处理、输出组成的,其中的关键在于中间处理部分。将问题分解,并通过组装算子的方式,对任务进行运算。下图为Flink的架构,其中,中间部分是Flink向外提供的各种API。
从WordCount开始
就像学C/C++、java等代码从HelloWorld开始,分布式框架的‘ HelloWorld ’就是WordCount代码。
public class SocketTextStreamWordCount {
public static void main(String[] args) throws Exception {
if (args.length != 2){
System.err.println("USAGE:\nSocketTextStreamWordCount <hostname> <port>");
return;
}
String hostName = args[0];
Integer port = Integer.parseInt(args[1]);
// set up the execution environment
final StreamExecutionEnvironment env = StreamExecutionEnvironment
.getExecutionEnvironment();
// get input data
DataStream<String> text = env.socketTextStream(hostName, port);
text.flatMap(new LineSplitter()).setParallelism(1)
// group by the tuple field "0" and sum up tuple field "1"
.keyBy(0)
.sum(1).setParallelism(1)
.print();
// execute program
env.execute("Java WordCount from SocketTextStream Example");
}
/**
* Implements the string tokenizer that splits sentences into words as a user-defined
* FlatMapFunction. The function takes a line (String) and splits it into
* multiple pairs in the form of "(word,1)" (Tuple2<String, Integer>).
*/
public static final class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
// normalize and split the line
String[] tokens = value.toLowerCase().split("\\W+");
// emit the pairs
for (String token : tokens) {
if (token.length() > 0) {
out.collect(new Tuple2<String, Integer>(token, 1));
}
}
}
}
}
这个代码还是很工整的,首先得到socket的<ip,host>,然后设置执行环境,再之后给定输入的方式,之后设置好中间处理的算子拓扑,最后execute执行运行环境。下面的override是重写flatMap函数。
分解代码
整个的代码块可以按照下图的方法来分解:
- 设置环境
- 设计算子拓扑
- 执行
设计算子拓扑
其余两步都是一句简单的代码就可以解决了,具体的工作是由系统负责。而设计算子拓扑则是由程序员来做的,那么是如何设计的?代码又是如何转化的?参考下图:
总结
从WordCount的例子入手,FLink的代码是很工整的,每一步的目的都很清晰。其中,算子设计是需要程序员自己来考虑并实现的,环境的设置和运行则是由系统框架自动识别运行。先把最基础的代码结构看懂,接下来就要深入到每一行代码中,阅读框架底层的代码。
参考:
[1]: https://github.com/bethunebtj/flink_tutorial.git
[2]: https://flink.apache.org/