Flink代码初学记录

第一次使用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&lt;String, Integer&gt;).
         */
        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函数。

分解代码

整个的代码块可以按照下图的方法来分解:
Flink代码的基本结构

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

设计算子拓扑

其余两步都是一句简单的代码就可以解决了,具体的工作是由系统负责。而设计算子拓扑则是由程序员来做的,那么是如何设计的?代码又是如何转化的?参考下图:
在这里插入图片描述

总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值