为什么不直接操作State,而是要额外定义一个变量

2023-05-16

    最近浏览Flink文章的时候发现一个现象,就是在操作State的时候,很多文章里面并不会直接操作State,而是会定义一个相似的变量去操作,在 snapshot 和 recover 的时候讲变量中的内容写入到State或者从State中恢复,为啥要这么使用呢?本文探究StateBa

RocksDB介绍:

    本文探究以RocksDBStateBackend为例进行说明,因为它的数据都是存放在磁盘上的,所以它能存放超大State,生产环境上一般用的也是它。虽然StateBackend还有MemoryStateBackend和FsStateBackend,但是它们都基于JVM堆,即运行中状态存储在JVM堆中,不能存放太大的State。而且MemoryStateBackend一般都用于测试环境,生产环境上没人会用这个。FsStateBackend个人感觉是可以直接操作State的,这个后续看完整篇文章就会明白了。

   RocksDB 是一个非常优秀的 Key-Value 存储,经过了 Facebook 多年的迭代和优化。它通过Java本机接口(JNI)与Flink进行交互。如下所示:

 

    可以按照HBase的概念去理解RockDB。RockDB写入是也是先写入Memtable(类似HBase MemStore),达到一定大小的时候再Flush到磁盘上形成一个SST文件(来源于Google的Big Table)。如果开启了WAL的话数据会同步写入到WAL中。读取的时候,会从Memtable、Block Cache、SST 文件。然后数据会进行文件的Compaction操作,此操作同时会删除和更新数据。

    不过和HBase不同的是,RocksDB文件存储组织成了多个层级,不同层级之间会通过异步 Compaction 合并重复、过期和已删除的数据。:

所以,为什么额外要再自己定义一个变量来操作State呢?

    本质的原因还是磁盘IO问题,RockDB写数据时候的Flush操作和Compaction会消耗IO的。如果在内存中额外定义一个变量,只在Checkpoint和Recover的时候才去操作State,就免去了磁盘IO问题!

    当然,如果State非常大的话,那还是得直接去操作State,不然TM内存也放不下不是,大部分State不大场景下,个人理解最好都是额外定义一个变脸来操作State。

    和大佬交流之后发现自身理解有误,State只有在snapshot的时候才会真正的落盘。
新进来的数据写入到了State中,但是都是在内存里,没有落到磁盘上。 例如看windowState就可以大概了解,数据写入了State如果是立即落盘,那么数据就会重复消费,无法保证Exactly_Once语义了。

    现在个人看法是,尽量直接操作State。如果有特殊自定义的TTL逻辑,可以考虑额外定义一个变量来操作State。

参考:

         字节跳动使用 Flink State 的经验分享-51CTO.COM

        Apache Flink: Using RocksDB State Backend in Apache Flink: When and How

        Pebble/RocksDB SST 文件详解_Caption 嘟嘟嘟的博客-CSDN博客_sst文件

        Why not RocksDB in Streaming State? | 廖嘉逸's Blog

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不直接操作State,而是要额外定义一个变量 的相关文章

  • 在事件中使用 Context/Toast 时出现不需要的重组 - Jetpack Compose

    在 Jetpack Compose 应用程序中 我有两个与此处类似的可组合项 Composable fun Main println Composed Main val context LocalContext current var te
  • 类型错误:无法读取反应中未定义的属性“减少”

    我有一个表单 要求用户输入几个字段的字段值 将字段值存储在状态中并以自定义格式显示状态值 所以 我有几个输入字段和一个提交按钮
  • 当状态发生变化时如何运行操作?

    enum SectionType String CaseIterable case top Top case best Best struct ContentView View State private var selection Int
  • 如何列出检查点中的某些变量?

    我正在使用自动编码器 我的检查点包含网络的完整状态 即编码器 解码器 优化器等 我想玩弄编码 因此 在我的评估模式中 我只需要网络的解码器部分 如何从现有检查点中仅读取一些特定变量 以便我可以在另一个模型中重用它们的值 There s li
  • android:媒体记录器:启动失败:-38

    简介 如何检查录音是否已在其他应用程序的后台运行 详细信息 如果录音已在本机应用程序的后台运行 录音机 现在我已将录音作为我的应用程序中的功能之一 问题 当我尝试同时在我的应用程序中录制时 出现错误 E MediaRecorder star
  • 如何在 ReactJS 的功能组件中声明变量

    我有一个变量 myVar 不是状态 const myComponent gt const myState setMyState useState true const myVar false return
  • 无法使用 NGXS 更新存储来修补状态。我不断看到类型错误:无法冻结

    我正在使用一个基本的 Angular 11 应用程序 该应用程序已实现身份验证 使用 AWS Cognito 和 Amplify 我在这里想做的事情非常简单 我正在使用内置的 AWS Amplify 方法进行身份验证 我正在使用 NGXS
  • 如何避免全局状态?

    所以 我正在阅读谷歌测试博客 它说全局状态很糟糕并且使得编写测试变得困难 我相信 我的代码现在很难测试 那么如何避免全局状态呢 我使用全局状态 据我所知 最重要的用途是管理我们的开发 验收和生产环境之间的关键信息 例如 我有一个名为 Glo
  • 在 Backbone.js 中使用状态并登录用户

    我需要检查用户是否已登录并经过身份验证 然后才能让我的用户使用我的backbone js基于应用程序 用户身份验证作为属性存储在本机主干模型中 我在启动主路由器之前通过调用进行检查Backbone history start 这样 未经身份
  • ui-router 中 templateUrl 从一种状态动态更改为另一种状态

    html a target blank t name a 上面的代码位于 ng repeat 中 其中许多模板链接加载了名称和 id 因此当我单击每个链接时 href 将更新 并将 id 号附加到所选模板链接 我使用相同的控制器生成大约十个
  • 在 VueJS 中取消选中 CheckBox 及其标签

    我试图取消选中在 VueJs 中使用其标签选中的复选框 DEMO new Vue el app data checkedNames checkedName true methods uncheck function this checked
  • Flutter:webview_flutter 更新同一 webview 小部件中的 url

    嘿 我正在尝试创建一个屏幕 显示带有底部应用栏的网络视图 因此 您加载网络视图 当点击底部应用栏中的某个项目时 其他网站应该加载到同一个网络视图中 除了我最初解析的网站之外 我不知道如何打开另一个网站 我尝试使用 setState 更新网址
  • Redux 不就是美化了全局状态吗?

    所以我一周前开始学习 React 我不可避免地遇到了状态问题以及组件应该如何与应用程序的其余部分进行通信 我四处搜寻了一下 Redux 似乎是这个月的热门 我通读了所有文档 我认为这实际上是一个相当革命性的想法 以下是我的想法 人们普遍认为
  • botbuilder v 4,带有下拉菜单并根据提示捕获值的动态自适应卡

    我正在使用 ms botbuilder v 4 我正在使用 webcontrol webchat js 最新 react 案例非常简单 我想在下拉列表中显示可能值的列表 值将是动态的 来自 API 我需要那里的标题和值 Id 然后 当用户选
  • Angular Digest 循环正在运行,但 ng-bind 值未更新

    我有一个包含导航栏的父视图 在该视图内部我有一个 div 渲染我所在的任何子视图的元素 我想根据子视图的路线有条件地显示 隐藏父视图中的导航栏 现在 我有这个 div
  • Google OAuth 2 和状态参数值需要在重定向 url 中注册

    根据 Google Oauth 2 0 文档的状态参数 指示收到响应后可能对您的应用程序有用的任何状态 Google 授权服务器会往返此参数 因此您的应用程序会收到与发送的值相同的值 可能的用途包括将用户重定向到站点中的正确资源 随机数和跨
  • 克隆一个lua状态

    最近 我在使用C 和Lua进行开发时遇到了很多困难 我的情况是 由于某种原因 我的 C 程序中可能有数千个 Lua 状态 但这些状态在初始化后应该是相同的 当然 我可以为每个状态执行 luaL loadlibs 和 lua loadfile
  • 如何在 Ocaml 中表示一个简单的有限状态机?

    我用 C 和 Java 编写过一些状态机 但从未用过像 Ocaml 这样的函数式语言 问题是我不知道我是否可以从对象语言版本中调整代码 因为在 Ocaml 中记录和变体比类更强大 所以 我需要一个事件驱动的有限状态机 像 UML 中的分层结
  • HttpWebRequest 和 HttpWebResponse :维护连续查询的登录请求状态

    我有一些 HttpWebRequest 和 HttpWebResponse 链接在一起 也使用 CookieContainer 该代码模拟用户浏览三个不同的 我同意 页面 这些页面设置了 cookie 信息 在第四个页面上使用用户名和密码登
  • 为什么在类构造函数中使用 setState 方法时 React 会抛出错误?

    我知道在为尚未安装的组件设置状态时会引发错误 这解释了我使用 setState 函数而不是显式直接设置状态所得到的错误 import React Component from react class SearchBar extends Co

随机推荐