Flink State 有可能代替数据库吗?

有状态的计算作为容错以及数据一致性的保证,是当今实时计算必不可少的特性之一,流行的实时计算引擎包括 Google Dataflow、Flink、Spark (Structure) Streaming、Kafka Streams 都分别提供对内置 State 的支持。State 的引入使得实时应用可以不依赖外部数据库来存储元数据及中间数据,部分情况下甚至可以直接用 State 存储结果数据,这让业界不禁思考: State 和 Database 是何种关系?有没有可能用 State 来代替数据库呢?

在这个课题上,Flink 社区是比较早就开始探索的。总体来说,Flink 社区的努力可以分为两条线: 一是在作业运行时通过作业查询接口访问 State 的能力,即 QueryableState;二是通过 State 的离线 dump 文件(Savepoint)来离线查询和修改 State 的能力,即即将引入的 Savepoint Processor API。

QueryableState

在 2017 年发布的 Flink 1.2 版本,Flink 引入了 QueryableState 的特性以允许用户通过特定的 client 查询作业 State 的内容 [1],这意味着 Flink 应用可以在完全不依赖 State 存储介质以外的外部存储的情况下提供实时访问计算结果的能力。

只通过 Queryable State 提供实时数据访问

然而,QueryableState 虽然设想上比较理想化,但由于依赖底层架构的改动较多且功能也比较受限,它一直处于 Beta 版本并不能用于生产环境。针对这个问题,在前段时间腾讯的工程师杨华提出 QueryableState 的改进计划 [2]。在邮件列表中,社区就 QueryableState 是否可以用于代替数据库作了讨论并出现了不同的观点。笔者结合个人见解将 State as Database 的主要优缺点整理如下。

优点:

  • 更低的数据延迟。一般情况下 Flink 应用的计算结果需要同步到外部的数据库,比如定时触发输出窗口计算结果,而这种同步通常是定时的会带来一定的延迟,导致计算是实时的而查询却不是实时的尴尬局面,而直接 State 则可以避免这个问题。
  • 更强的数据一致性保证。根据外部存储的特性不同,Flink Connector 或者自定义的 SinkFunction 提供的一致性保障也有所差别。比如对于不支持多行事务的 HBase,Flink 只能通过业务逻辑的幂等性来保障 Exactly-Once 投递。相比之下 State 则有妥妥的 Exactly-Once 投递保证。
  • 节省资源。因为减少了同步数据到外部存储的需要,我们可以节省序列化和网络传输的成本,另外当然还可以节省数据库成本。

缺点:

  • SLA 保障不足。数据库技术已经非常成熟,在可用性、容错性和运维上都很多的积累,在这点上 State 还相当于是处于原始人时期。另外从定位上来看,Flink 作业有版本迭代维护或者遇到错误自动重启带来的 down time,并不能达到数据库在数据访问上的高可用性。
  • 可能导致作业的不稳定。未经过考虑的 Ad-hoc Query 可能会要求扫描并返回夸张量级的数据,这会系统带来很大的负荷,很可能影响作业的正常执行。即使是合理的 Query,在并发数较多的情况下也可能影响作业的执行效率。
  • 存储数据量不能太大。State 运行时主要存储在 TaskManager 本地内存和磁盘,State 过大会造成 TaskManager OOM 或者磁盘空间不足。另外 State 大意味着 checkpoint 大,导致 checkpoint 可能会超时并显著延长作业恢复时长。
  • 只支持最基础的查询。State 只能进行最简单的数据结构查询,不能像关系型数据库一样提供函数等计算能力,也不支持谓词下推等优化技术。
  • 只可以读取,不能修改。State 在运行时只可以被作业本身修改,如果实在要修改 State 只能通过下文的 Savepoint Processor API 来实现。

总体来说,目前 State 代替数据库的缺点还是远多于其优点,不过对于某些对数据可用性要求不高的作业来说,使用 State 作为数据库还是完全合理的。由于定位上的不同,Flink State 在短时间内很难看到可以完全替代数据库的可能性,但在数据访问特性上 State 往数据库方向发展是无需质疑的。

Savepoint Processor API

Savepoint Processor API 是社区最近提出的一个新特性(见 FLIP-42 [3]),用于离线对 State 的 dump 文件 Savepoint 进行分析、修改或者直接根据数据构建出一个初始的 Savepoint。Savepoint Processor API 属于 Flink State Evolution 的 State Management。如果说 QueryableState 是 DSL 的话,Flink State Evolution 就是 DML,而 Savepoint Processor API 就是 DML 中最为重要的部分。

Savepoint Processor API 的前身是第三方的 Bravo 项目 [4],主要思路提供 Savepoint 和 DataSet 相互转换的能力,典型应用是 Savepoint 读取成 DataSet,在 DataSet 上进行修改,然后再写为一个新的 Savepoint。这适合用于以下的场景:

  • 分析作业 State 以研究其模式和规律
  • 排查问题或者审计
  • 为新的应用构建的初始 State
  • 修改 Savepoint,比如:

    • 改变作业最大并行度
    • 进行巨大的 Schema 改动
    • 修正有问题的 State

Savepoint 作为 State 的 dump 文件,通过 Savepoint Processor API 可以暴露数据查询和修改功能,类似于一个离线的数据库,但 State 的概念和典型关系型数据的概念还是有很多不同,FLIP-43 也对这些差异进行了类比和总结。

首先 Savepoint 是多个 operator 的 state 的物理存储集合,不同 operator 的 state 是独立的,这类似于数据库下不同 namespace 之间的 table。我们可以得到 Savepoint 对应数据库,单个 operator 对应 Namespace。

DatabaseSavepoint
NamespaceUid
TableState

但就 table 而言,其在 Savepoint 里对应的概念根据 State 类型的不同而有所差别。State 有 Operator State、Keyed State 和 Broadcast State 三种,其中 Operator State 和 Broadcast State 属于 non-partitioned state,即没有按 key 分区的 state,而相反地 Keyed State 则属于 partitioned state。对于 non-partitioned state 来说,state 是一个 table,state 的每个元素即是 table 里的一行;而对于 partitioned state 来说,同一个 operator 下的所有 state 对应一个 table。这个 table 像是 HBase 一样有个 row key,然后每个具体的 state 对应 table 里的一个 column。

举个例子,假设有一个游戏玩家得分和在线时长的数据流,我们需要用 Keyed State 来记录玩家所在组的分数和游戏时长,用 Operator State 记录玩家的总得分和总时长。

在一段时间内数据流的输入如下:

user_iduser_nameuser_groupscore
1001PaulA5,000
1002CharlotteA3,600
1003KateC2,000
1004RobertB3,900
user_iduser_nameuser_grouptime
1001PaulA1,800
1002CharlotteA1,200
1003KateC600
1004RobertB2,000

用 Keyed State ,我们分别注册 group_score 和 group_time 两个 MapState 表示组总得分和组总时长,并根据 user_group keyby 数据流之后将两个指标的累积值更新到 State 里,得到的表如下:

user_groupgroup_scoregroup_time
A8,6003,000
C2,00600
B3,9002,000

相对地,假如用 Operator State 来记录总得分和总时长(并行度设为 1),我们注册 total_score 和 total_time 两个 State,得到的表有两个:

total_score | 
------- | 
14,500 |

total_time
5,600

至此 Savepoint 和 Database 的对应关系应该是比较清晰明了的。而对于 Savepoint 来说还有不同的 StateBackend 来决定 State 具体如何持续化,这显然对应的是数据库的存储引擎。在 MySQL 中,我们可以通过简单的一行命令 ALTER TABLE xxx ENGINE = InnoDB; 来改变存储引擎,在背后 MySQL 会自动完成繁琐的格式转换工作。而对于 Savepoint 来说,由于 StateBackend 各自的存储格式不兼容,目前尚不能方便地切换 StateBackend。为此,社区在不久前创建 FLIP-41 [5] 来进一步完善 Savepoint 的可操作性。

总结

State as Database 是实时计算发展的大趋势,它并不是要代替数据库的使用,而是借鉴数据库领域的经验拓展 State 接口使其操作方式更接近我们熟悉的数据库。对于 Flink 而言,State 的外部使用可以分为在线的实时访问和离线的访问和修改,分别将由 Queryable State 和 Savepoint Processor API 两个特性支持。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简易投票系统数据库设计

介绍 简易版的投票系统数据库设计. 发现设计有误请在评论区指出,谢谢! 一、截图 项目表 选项表 投票表 二、代码 票表 CREATE TABLE as_ticket (id varchar(64) NOT NULL COMMENT 主键,title varchar(100) DEFAULT NULL COMMENT 投票标题,descr…

万级规模 K8s 如何管理?蚂蚁双11核心技术公开

阿里妹导读:Kubernetes 大幅降低了容器化应用部署的门槛,并以其超前的设计理念和优秀的技术架构,在容器编排领域拔得头筹。越来越多的公司开始在生产环境部署实践。本文将分享蚂蚁金服是如何有效可靠地管理大规模 Kubernetes 集群的&#xff…

定了!2020年,6种将死的编程语言!

编程界语言排行榜又要面临一次全新的洗牌,六大编程语言将要黄了!此消息一出,令众多程序员心碎!那么这将“亡”的六大语言中有你所擅长的吗?Perl,Haskell,Ruby,Visual Basic.NET&…

RuoYi-Cloud 部署篇_03(linux环境 Mysql+nginx版本)

文章目录一、localhost无法路由1. nacos控制台2. sentinel控制台3. admin控制台二、思路分析2.1. 现象分析2.2. 原因分析2.3. 解决思路三、解决方案(第一种)3.1. 调整路由url3.2. 效果验证四、解决方案解决方案(第二种)4.1. 域名分…

论坛系统数据库设计

论坛系统数据库设计 文章目录论坛系统数据库设计前言一、社区论坛是什么?二、设计表1.用户表2.Token表3. 文章表4. 话题表5. 问题表6. 评论表7. 投票表8. 回答表9. 举报表10. 话题关系对应表11. 通知表12. 私信表13. 关注关系表14. 图片表15. 设置表16. 缓存表总结前…

阿里文娱首次公开!AI 如何对爆款内容未卜先知?

阿里妹导读:文娱内容很难有完整的量化指标体系,内容的复杂性决定了文娱产品的不确定性。我们如何利用AI大数据能力,建造文娱的内容认知大脑?串联内容全生命周期,实现对内容、流量、宣推等的“未卜先知”,提…

Sentinel 1.7.0 发布,支持 Envoy 集群流量控制

流控降级中间件 Sentinel 1.7.0 版本正式发布,引入了 Envoy 集群流量控制支持、properties 文件配置、Consul/Etcd/Spring Cloud Config 动态数据源适配等多项新特性与改进。详细特性列表请参考 Release Notes,欢迎大家使用并提出建议。 下面我们来一起…

RuoYi-Cloud 部署篇_02(windows环境 mysql版本)

文章目录一、模块配置修改1. ruoyi-gateway-dev.yml2. ruoyi-auth-dev.yml3. ruoyi-system-dev.yml4. ruoyi-gen-dev.yml5. ruoyi-job-dev.yml6. ruoyi-file-dev.yml二、后端配置预启动2.1. 配置 idea的 RunDashboard2.2. 运行后端三、部署前端3.1. 安装依赖3.2. 运行前端6.3. …

运维老哥必须知道的Linux系统文件目录组织结构

夫陶公清风千古,余又何人,敢称庶几 文章目录介绍Linux目录结构Linux文件和目录管理绝对路径和相对路径绝对路径相对路径yum包管理介绍 Linux目录结构 💡 Linux文件系统的目录结构为树状结构,其中根目录为一个斜杠:/…

云原生下日志方案的架构设计

上一篇中我们介绍了为什么需要一个日志系统、为什么云原生下的日志系统如此重要以及云原生下日志系统的建设难点,相信DevOps、SRE、运维等同学看了是深有体会的。本篇文章单刀直入,会直接跟大家分享一下如何在云原生的场景下搭建一个灵活、功能强大、可靠…

不知道路由器工作原理?没关系,来这看看!看不懂你捶我 | 原力计划

作者 | 北海以北没有小王头图 | CSDN付费下载自视觉中国来源 | CSDN博客路由器概述首先我们先大致了解一下路由器的大致结构以及工作方式。路由器体系结构路由器体系结构如下图:其中四个重要组成部分依次如下:1. 接入端口将一条输入的物理链路与路由器相…

RuoYi-Cloud 部署篇_03(windows环境 mysql版本)

文章目录一、软件启动1. redis2. nacos3. myqsl二、微服务启动2.1. 认证授权中心启动2.2. 若依网关启动2.3. 系统模块启动2.4. 定时任务模块启动2.5. 监控中心启动2.6. 代码生成模块启动2.7. 前端启动三、测试验证3.1. 系统模块3.2. 定时任务3.3. 代码生成3.4. sentinel控制台3…

闲鱼推荐,让智能计算从云走向端

关键词: 智能推荐、特征工程、特征处理。 术语解释: 机器学习(Machine Learning):是关于在计算机上从数据中产生“模型”(model)的算法;数据集(Data Set):一组记录的集…

mybatis plus实现多表分页条件查询

文章目录前言一、二、如何实现1 配置mybatis plus分页插件2.准备三张表2.1 学生表2.2 老师表2.3 老师和学生Vo表3. 编写SQL语句4. 编写mapper层5. service层6.controller层演示效果【补充】 XML 自定义分页总结前言 没啥可说的 一、 没啥可说的 二、如何实现 1 配置mybatis pl…

神仙在双11晚上,都干了些啥?

11月,阿里巴巴西溪园区夜凉如水,双11作战室内,却有人身着短袖衬衫,只见她屏住呼吸,握紧微微出汗的手心,静静立于数字大屏前,等待今年最重要的一个数据。 距离双11结束,还有1分钟。 …

nginx(windows环境安装)

介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。 文章…

“编程能力差的程序员,90%输在了这点上!”谷歌AI专家:都是瞎努力!

我见过市面上很多的 Python和人工智能的教程和书籍,他们大都这样讲的:先从 Python 人工智能的发展历史开始,介绍的基本语法规则,Python 的 list, dict, tuple 等数据结构,然后再介绍机器学习、深度学习的常用框架等等&…

阿里巴巴的云原生应用开源探索与实践

导读:从拥抱开源、贡献开源、自主开源,到赋能开源,开源已升级为阿里技术战略之一,且正为开发者源源不断地输送切实可见的价值。云原生是阿里开源的重要领域,短短几年,以 K8s 为核心的云原生开源生态迅猛发展…

RuoYi-Vue 部署 Linux环境 若依前后端分离项目(war 包+nginx版本)

文章目录一、软件安装部署1. 安装jdk2. mysql8安装部署3. redis安装4. nginx 安装部署5. Tomcat10 下载和配置 Linux 环境6. 克隆项目二、后端项目2.1. 修改数据库连接2.2. 修改Redis连接信息2.3. 文件路径2.4. 日志存储路径调整2.5. 修改war打包2.6. 编译打包三、前端项目3.1.…

技术直播:讲一个Python编写监控程序的小故事

今年疫情“黑天鹅”事件改变了大家的生活。相信大家都经历过,每天早晨起床第一件事,就是查看数据。这些数据不仅仅是人们对活着的渴望,也是在建立对战胜疫情的决心。那么技术人怎么能通过自己所学的去进行数据监控呢?今天CSDN邀请…