函数吗 jsp_Flink | 你真的理解Stateful Function吗?

96b759c30779eea387b41de479091f9b.png

Flink必备 | Stateful Function介绍

d769e4410e50e83b6fa2f5c6cc9331db.png

Flink将Stateful Function放在这样的位置,可想而知,有状态函数在Flink中地位可以说是相当重要,我们毫不夸张的说,它一定是Flink的核心。

有状态的函数

说到函数,很久以前,我们写的C语言程序里面就有函数的概念。我们使用函数可以进行输入输出数据处理。在C语言中,可以在函数中定义一种static类型的变量。例如以下:

#include <stdio.h> int func() { static int n = 0; n++; return n;}

因为有了这个static变量,就好比函数有了状态,每次调用该函数,都可以记录调用了多少次。因为我们之前编写的C程序都是单机应用程序,都是在一台电脑上运行。所以维护起来很容易。

Flink中的函数也是有状态的,但我们要注意Flink的函数和C语言中的函数不一样,Flink的程序是运行在大规模集群中的,它要处理的数据量也是很大规模的。所以,如果我们要将大量的数(zhuang)据(tai)保存,就必须要支持分布式存储。而且一旦某个任务出现故障,还需要将状态进行持久化。Flink是如何存储这些状态数据呢?接下来,我来给大家分析分析。

Flink状态函数

41b0c3815740ea9204cc66a20e6f2053.png

上图是Flink官方的一张图(https://flink.apache.org/zh/stateful-functions.html),我们看到,在Flink的执行流中的每一个函数,都一个柱状图(圆柱),这说明Flink中的每一个函数都有自己独立的存储。这也是Flink函数与其他计算引擎不一样的地方。例如:Spark Streaming、Storm等等。以前,我们编写Spark Streaming或者Storm应用程序,我们如果要做有状态的计算,很大程度上要依赖外部存储。例如:Redis、MySQL之类的。现在如果我们要做一些有状态的计算,有了Flink,我们就可以直接利用Flink内置的状态存储直接处理了。看起来,好像很方便。我们接下来再看看Flink这样设计有什么好处呢?

状态函数功能

Flink的状态函数类似于Akka的Actor一样,一个状态函数就是一段运行在集群中每个实例的一小段代码,状态函数并不需要我们手动调用(废话),是通过消息来触发执行的。在Flink中的函数具备以下特征:

  1. 有状态

每个计算函数有自带、可容错的状态存储,而且编程的时候就好像访问本地变量一样。就好比我们之前在C函数中定义一个static变量一样。使用起来非常简单。

2. 虚拟的

函数本身不会耗费任何的计算资源,函数没有被执行的是不会消耗CPU和内存的。熟悉JavaEE的同学,如果我们创建一个Servlet,是需要占用JVM的内存空间的,而且需要为这个Servlet不断地开辟线程来执行。

应用程序是由具有多种函数组成的模块构建的,这些函数可以很方便地和以下模块交互:

  1. 一次性语义

状态存储和消息共同协作,提供精确一次的语义保障。

2. 逻辑寻址

函数通过逻辑地址相互传递消息,无需服务发现组件。

3. 动态和循环消息

消息的传递模式无需提前定义,也不局限于DAG。也就是说,消息传递并不是按照DAG严格执行的,可以通过其他(外部)的方式来动态传递消息给函数。

专门为serverless架构构建的运行时库

serverless为无服务器计算,通过FaaS和BaaS可以让程序无需服务器完成指定的操作。

运行时库

有状态函数运行时的设计初衷是提供一组和serverless函数类似的功能,也就是说Cloud Native的程序是可以直接去访问、操作Flink中的状态函数存储并发送消息。但它目前主要还是应用于进行有状态的计算。

a541e88b8b1e781891b7ce7a72d8d0e0.png

通过上图,我们看到,类似于K8S、API Gateway或者其他的微服务端可以通过http或者gRPC的方式来访问状态数据、发送消息给状态函数。简单来说,就是Flink中函数的状态是可以被外部访问的,业务系统可以直接从状态中读取状态,就像访问后端服务器一样,而客户端却完全感知不到服务器的存在。这不正是Serverless吗?

之所以称之为Runtime,表示它有自己的上下文。熟悉Java Web的朋友们,我们编写Servlet或者JSP的时候,是不是也有一个叫做WebApplicationContext的东西?我们之前把它理解为Tomcat(或者其他JavaEE容器)的Runtime。而Flink为了实现serverless,专门实现了这样的一套Runtime。

这一套Runtime是基于Flink构建的,它有以下的一些重要特点:

  1. 逻辑上计算和状态存放在一起

为了确保开发时开箱即用,消息、访问状态、更新状态、函数执行都是在一起统一管理的。这样,编写Flink程序的时候,我们无需关心状态的存储、持久化、消息通信等细节。

2. 物理上计算和状态是分离的

函数可以被远程执行,在执行请求时,消息和状态访问可以作为请求的一部分。函数可以像无状态处理一样方便管理,并且支持快速扩展、滚动升级以及其他常见的操作。

3. 对开发语言没有限制

函数可以基于HTTP或者gRPC的简单协议调用,用任何语言都可以实现函数

状态函数的优点

动态消息传递

我们可以构建、并且用于组合这些函数,并且通过外部可以直接发送消息给函数。与传统流处理的topology相比,提供了更大的灵活性。不得不说,Flink这点有点太牛x。让我们大胆地猜想,在不久地将来,Flink可以替代web后端地开发。Flink完美地实现了跨界

e6bad59e8ec78dcf5f74643c6ce04778.png

大家看这张图,这意味着Flink和业务系统走到了一起。这绝对是大数据开发者的福音,Flink实现和业务系统的对接。从此,我们再也不用做SQL Boy了。

一致的状态支持

在分布式计算中,要保证数据的一致性其实并不容易。而Flink帮助实现了Exactly-Once,我们基于Flink编程,可以利用Flink的Exactly-Once保障机制,来更完美地实现数据处理。分布式计算+存储 All in one。状态函数可以保持将本地状态持久化,并与函数之间的消息传递集成在一起。提供精确一次语义的状态访问/更新的效果,并保证了开箱即用的高效消息传递。

多语言环境支持

通过HTTP和gRPC的方式,我们可以使用任何语言来实现对消息、状态的操作。Flink原生支持Python,后续还会为Go,Javascript和Rust等语言提供更多SDK支持。

无需数据库

状态持久化和容错建立在Apache Flink的分布式快照模型的基础上。我们只需要一个简单的存储层(例如:HDFS)来存储状态的快照。

云原生

状态函数可以与K8S、Knative、AWS Lambda等serverless平台无缝集成。

“无状态”操作

状态操作是函数调用的一部分,有状态函数应用程序看起来就像无状态进程,可以简单的方式进行管理,例如快速扩展,滚动/零停机时间升级。

未来,让我们期待Flink带来更多惊喜吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值