Apache flink 使用检查点岩石SDB打掉过度负载

Apache flink 使用检查点岩石SDB打掉过度负载,apache-flink,Apache Flink,目前,我们正试图找出,如何有效地与Flink合作,我们仍在努力理解一切 我们在一个独立的集群上运行了大约60个非常轻量级的作业,这在一个普通的EC2实例上运行良好。但是,一旦我使用本地RocksDB状态后端启用了检查点,集群就会以一种意外的方式运行,停止作业,尝试重新启动作业,只是为了放弃所有作业,并将错误日志留空。在那之后,弗林克再也找不到乔布斯和罐子的踪迹了。 我知道,对于每个作业,总JobManager内存的一小部分是保留的,同样,对于每个作业,本地RocksDB在同一台机器上实例化,但我

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

我们在一个独立的集群上运行了大约60个非常轻量级的作业,这在一个普通的EC2实例上运行良好。但是,一旦我使用本地RocksDB状态后端启用了检查点,集群就会以一种意外的方式运行,停止作业,尝试重新启动作业,只是为了放弃所有作业,并将错误日志留空。在那之后,弗林克再也找不到乔布斯和罐子的踪迹了。 我知道,对于每个作业,总JobManager内存的一小部分是保留的,同样,对于每个作业,本地RocksDB在同一台机器上实例化,但我认为它们同样轻量级,不需要太多内存/CPU容量。只需添加行
env.enableCheckpointing(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获得的实际类并不相似,因此存在这样的情况。

鉴于您正在运行的60个作业的工作负载非常小,因此有理由认为打开检查点会产生重大影响。基本上,我怀疑有60-180个新线程(我不确定您的哪些操作符是有状态的)都试图频繁地写入文件系统,这会让您的t3.medium实例不知所措

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

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


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

您是否同时启用了检查点并切换到使用RocksDB,或者您以前是否成功地使用了RocksDB,而没有使用检查点?@Davidderson我们以前已经启用了RocksDB,我在最初的帖子中添加了详细信息,请查看最近的编辑。然而,在不使用检查点的情况下,RocksDB可能只是用来捕获状态,在我们的例子中,状态非常小(部分只是一个布尔值)。我只能假设它的资源密集程度比使用实际的检查点要低一些?启用检查点确实会在一定程度上增加资源需求。您真的在一个EC2实例上同时运行60个作业吗?“你一次为所有人打开了检查站?”大卫·丹德森从这个问题判断,我想这很不寻常吧?答案是肯定的,60个作业(主要是一个源、一个接收器和一个简单的函数),这在t3上实际上不是什么大问题。没有检查点的中等实例。但是,没有重载,最多只有几千条记录,但它是这样工作的。我不知道这是否是一种改进,但我要指出的是,在同一个作业中运行多个管道是可能的。使用这种技术来减少工作总数应该会减少总体资源需求。感谢您提供的详细答案,我将在此基础上继续进行调查。我最初的问题出在其他地方,但我成功地解决了它,现在我收到了错误日志消息,这非常清楚地表明内存不足。目前,作业高度模块化(因此数量较多),但每4-5个作业实际上都是链接的,即一个流的输出是另一个流的输入。将这些整合为一个工作资源是否有显著优势?我们喜欢这里的逻辑分离,但还不知道这会在多大程度上影响效率。关于内存,这并不奇怪。整合可能会有很大帮助,但如果您想确定的话,应该做一些测试。在更大的实例上运行可能是一个更愉快的解决方案;很难说。从长远来看,除了转移到分布式集群之外,没有其他方法,增加机器大小并不是一件令人满意的事情