Flink代码初学记录

Flink代码初学记录

  • 第一次使用markdown编辑器
  • 言归正传,Flink代码学习
    • Flink的架构和执行流程
    • 从WordCount开始
    • 分解代码
      • 设计算子拓扑
  • 总结

第一次使用markdown编辑器

哈哈哈,还挺有意思的嘛,也算一个新技能,MarkDown编辑器

言归正传,Flink代码学习

Flink目前是非常受关注的一个分布式流式数据处理引擎,虽然使用的过程可以借助Flink提供的API,但是如果不深入地跟踪Flink的代码,出问题的时候就无从下手,更不用提优化框架了。这篇博客的目的也是记录一下自己学习Flink代码的过程。

Flink的架构和执行流程

Flink的架构是由输入通道、中间处理、输出组成的,其中的关键在于中间处理部分。将问题分解,并通过组装算子的方式,对任务进行运算。下图为Flink的架构,其中,中间部分是Flink向外提供的各种API。Flink代码初学记录_第1张图片

从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  ");
            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 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> {
            @Override
            public void flatMap(String value, Collector> 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(token, 1));
                    }
                }
            }
        }
    }

这个代码还是很工整的,首先得到socket的,然后设置执行环境,再之后给定输入的方式,之后设置好中间处理的算子拓扑,最后execute执行运行环境。下面的override是重写flatMap函数。

分解代码

整个的代码块可以按照下图的方法来分解:
Flink代码初学记录_第2张图片

  1. 设置环境
  2. 设计算子拓扑
  3. 执行

设计算子拓扑

其余两步都是一句简单的代码就可以解决了,具体的工作是由系统负责。而设计算子拓扑则是由程序员来做的,那么是如何设计的?代码又是如何转化的?参考下图:
Flink代码初学记录_第3张图片

总结

从WordCount的例子入手,FLink的代码是很工整的,每一步的目的都很清晰。其中,算子设计是需要程序员自己来考虑并实现的,环境的设置和运行则是由系统框架自动识别运行。先把最基础的代码结构看懂,接下来就要深入到每一行代码中,阅读框架底层的代码。

参考:
[1]: https://github.com/bethunebtj/flink_tutorial.git
[2]: https://flink.apache.org/

你可能感兴趣的:(分布式学习博客,Flink,代码)