当前位置: 首页 > 知识库问答 >
问题:

使用检查点岩石SDB甩下过大负载

饶元章
2023-03-14

目前,我们正试图找出如何有效地与Flink合作,我们仍在努力理解一切。

我们在一个独立的集群上运行大约60个非常轻量级的作业,这在普通的EC2实例上运行良好。然而,一旦我使用本地RocksDB状态后端启用检查点,集群的行为就会以意想不到的方式运行,停止作业,尝试重新启动它们,结果却丢弃了所有作业,并将错误日志留空。之后,Flink中没有留下作业或jar的任何痕迹。我知道对于每个作业,都会保留总JobManager内存的一小部分,同样,对于每个作业,都会在同一台机器上实例化一个本地RocksDB,但我认为它们同样轻量级,不需要太多内存/CPU容量。只需添加行env.enable检查点(1000);就会导致所有内容的完全失败,而不是之前的稳定集群。

我个人认为,我们可能已经达到了独立Flink群集的极限,即使增加内存也不够,但我想在开始构建分布式Flink群集之前确认一下这一点(我们需要自动化所有内容,这就是为什么我现在犹豫不决的原因)。我不确定将RocksDB检查点存储在S3等专用存储单元中是否能够解决此问题,以及是否会影响资源消耗(硬盘除外)。

迁移到分布式环境是解决我们问题的唯一方法,还是这表明其他一些问题,可以通过适当的配置来解决?

编辑:也许我应该补充一点,目前还没有加载,我们还没有讨论传入的数据,但作业仍在运行。目前FlinkSources中只有100条记录,但我们甚至无法处理这些记录。

编辑2:

这部分始终是作业代码的一部分:

try {
    env.setStateBackend((StateBackend) new RocksDBStateBackend("file://" + "/somePathOnInstance"));
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

我们添加了以下代码行:

env.enableCheckpointing(CHECKPOINTING_INTERVAL_MS);

没有必要将类型转换为StateBindend,因为根据文档,RocksDBStateBindend类的1.9.1版本应该已经实现了StateBindend而不是AbstractStateBindend。然而,doc与我们从Maven获得的实际类并不相似,所以就是这样。

共有1个答案

单于亮
2023-03-14

鉴于您正在运行的60个作业的工作负载相当微不足道,那么有理由认为打开检查点会产生重大影响。基本上,我怀疑有60-180个新线程(我不确定您的哪个运算符是有状态的)都试图频繁写入文件系统会使您的t3.medium实例不堪重负。

检查点由检查点协调器(在Flink主机中)管理,它与所有作业通信,启动检查点,等待检查点完成,并管理元数据。所涉及的大部分工作都是由任务管理器完成的,并且是异步完成的,因此在您的情况下,有很多新线程,每个线程都将要检查的数据复制到您的检查点存储(它应该是一个分布式文件系统,如S3)。如果检查点间隔很短,例如1秒,那么这一切都是每秒发生的。

您可以检查各种指标,试图找出瓶颈所在——您可能受到内存、CPU或网络带宽的限制。

对于RocksDB,增量检查点通常比完整检查点更轻,因此选择该选项会有所帮助——尽管对于如此少量的状态,我不认为这会有所帮助。更重要的是,出于性能原因,您应该避免使用EBS(或任何其他网络连接存储)作为RocksDB的本地磁盘。

 类似资料:
  • 如何在 .net 核心中配置 Quartz 以使用依赖注入?我使用标准的.net核心依赖机制。在实现 IJob 的类的构造函数中,我需要注入一些依赖项。

  • 首先也是最重要的: null 现在,这项工作一直很好,直到上周,我们有一个激增(10倍以上)的流量。从那时候起,Flink变成了香蕉。检查点大小开始从500MB缓慢增长到20GB,检查点时间大约需要1分钟,并且随着时间的推移而增长。应用程序开始失败,并且永远无法完全恢复,事件迭代器的年龄增长也永远不会下降,因此没有新的事件被消耗。 因为我是一个新的闪现,我不确定我做滑动计数的方式是不是完全没有优化

  • sdb

    sdb 是一个非常简单的磁盘基准测试程序。可以用来测试磁盘的顺序和并发的读写性能。一个内存缓冲区用于输入/输出得到值接近实际性能的磁盘或RAID系统。 您可以使用用O_DIRECT标志和O_SYNC,以避免由操作系统的缓冲。它类似于dd,但也有一些不同,因为dd不是创建一个磁盘用于基准测试。它可以初始化 缓冲与随机值写作之前他们磁盘或磁盘上的一个文件。这是一个简单但有效的程序,以得到最大速度的一个

  • SDB :纯 golang 开发、数据结构丰富、持久化的 NoSQL 数据库 试想以下业务场景: 计数服务:对内容的点赞、播放等数据进行统计 评论服务:发布评论后,查看某个内容的评论列表 推荐服务:每个用户有一个包含内容和权重推荐列表 以上几个业务场景,都可以通过 MySQL + Redis 的方式实现。 这里的问题是:MySQL 更多的是充当持久化的能力,Redis 充当的是在线服务的读写能力。

  • 问题内容: 这似乎不起作用: 当我在jsfiddle上运行它时,将触发一个请求(根据Chrome调试工具),如下所示: 然后(根据Chrome调试工具)我的本地服务器返回以下标头: (手动重新格式化以提高可读性) 然后在控制台中,我收到如下错误消息: 但是标题与我的服务器响应预检请求时显示的标题相同。那么,我在这个难题中遗漏了什么? 问题答案: OHHHHH,好的,我终于明白了… 显然,飞行前响应

  • 我有一个包含2900万行的大型PostgreSQL表。该表的大小(根据pgAdmin中的stats选项卡,几乎为9GB)为post-gis启用了一个空的geometry列。 我想使用ST_GeomFromText更新几何体列,从存储在同一表中的X和Y坐标列(SRID:27700)读取数据。但是,一次对整个表运行此查询会导致“磁盘空间不足”和“服务器连接丢失”错误……后者的频率较低。 为了克服这个问