浅谈Flink分布式运行时和数据流图的并行化

本文将以WordCount的案例为主线,主要介绍Flink的设计和运行原理。关于Flink WordCount程序可以参考我之前的文章:读取Kafka实时数据流,实现Flink WordCount。阅读完本文后,读者可以对Flink的分布式运行时有一个全面的认识。
二维码

1 Flink数据流图简介

1.1 Flink作业的逻辑视图

在大数据领域,词频统计(WordCount)程序就像是一个编程语言的HelloWorld程序,它展示了一个大数据引擎的基本规范。麻雀虽小,五脏俱全,从这个样例中,我们可以一窥Flink设计和运行原理。

code

图 1 Flink样例程序示意图

如图 1所示,程序分为三大部分,第一部分读取数据源(Source),第二部分对数据做转换操作(Transformation),最后将转换结果输出到一个目的地(Sink)。 代码中的方法被称为算子(Operator),是Flink提供给程序员的接口,程序员需要通过这些算子对数据进行操作。Source算子读取数据源中的数据,数据源可以是数据流、也可以存储在文件系统中的文件。Transformation算子对数据进行必要的计算处理。Sink算子将处理结果输出,数据一般被输出到数据库、文件系统或下一个数据流程序。

我们可以把算子理解为1 + 2 运算中的加号,加号(+)是这个算子的一个符号表示,它表示对数字1和数字2做加法运算。同样,在Flink或Spark这样的大数据引擎中,算子对数据进行某种操作,程序员可以根据自己的需求调用合适的算子,完成所需计算任务。常用的算子有mapflatMapkeyBytimeWindow等,它们分别对数据流执行不同类型的操作。

我们先对这个样例程序中各个算子做一个简单的介绍,关于这些算子的具体使用方式将在后续文章中详细说明。

  • flatMap

flatMap对输入进行处理,生成零到多个输出。这里是一个简单的分词过程,对一行字符串按照空格切分,生成一个(word, 1)的二元组。

  • keyBy

keyBy根据某个Key对数据重新分组。本例中是将flatMap生成的二元组(word, 1)中第一项作为Key,相同的单词会被分到同一组。

  • timeWindow

timeWindow是时间窗口函数,用来界定对多长时间之内的数据做统计。

  • sum

sum为求和函数。sum(1)表示对二元组中第二个元素求和,因为经过前面的keyBy,所有相同的单词都被分到了一起,因此,在这个分组内,将单词出现次数做加和,就得到出现的总次数。

逻辑视图

图 2 WordCont程序的逻辑视图

在程序实际运行前,Flink会将用户编写的代码做一个简单处理,生成一个如图2所示的逻辑视图。图 2展示了WordCount程序中,数据从不同算子间流动的情况。图中,圆圈代表算子,圆圈间的箭头代表数据流,数据流在Flink程序中经过不同算子的计算,最终生成为目标数据。其中,keyBytimeWindowsum共同组成了一个时间窗口上的聚合操作,被归结为一个算子。我们可以在Flink的Web UI中,点击一个作业,查看这个作业的逻辑视图。

对于词频统计这个案例,逻辑上来讲无非是对数据流中的单词做提取,然后使用一个Key-Value结构对单词做词频计数,最后输出结果即可,这样的逻辑本可以用几行代码完成,改成使用算子形式,反而让新人看着一头雾水,为什么一定要用算子的形式来写程序呢?实际上,算子进化成当前这个形态,就像人类从石块计数,到手指计数,到算盘计数,再到计算机计数这样的进化过程一样,尽管更低级的方式可以完成一定的计算任务,但是随着计算规模的增长,古老的计数方式存在着低效的弊端,无法完成更高级别和更大规模的计算需求。试想,如果我们不使用大数据引擎提供的算子,而是自己实现一套上述的计算逻辑,尽管我们可以快速完成当前的词频统计的任务,但是当面临一个新计算任务时,我们需要重新编写程序,完成一整套计算任务。我们自己编写代码的横向扩展性可能很低,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值