使用S3存储的Flink FsStateBackend太贵



当前我使用FsStateBackend进行检查点状态。我使用间隔10s,就像下面的代码一样。但我看到使用检查点的传输桶的成本约为20美元/天,aws传输s3定价:0.005/1000个请求=>(我每天使用约4000000个请求@@(。我有7份工作,它们是:

  • 使用检查点间隔的6个作业=10000(ms(
  • 使用检查点间隔的1个作业=1000(ms(

并在AWS EMR上运行flink。每个检查点的平均状态大小为(8KB->30M(。检查站后面发生了什么?

// set up checkpoint
        env.enableCheckpointing(1000 or 10000);
        // advanced options:
        // make sure 500 ms of progress happen between checkpoints
        env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
        // checkpoints have to complete within one minute, or are discarded
//            env.getCheckpointConfig().setCheckpointTimeout(60000);
        // allow only one checkpoint to be in progress at the same time
        env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
        // enable externalized checkpoints which are retained after job cancellation
        env.getCheckpointConfig().enableExternalizedCheckpoints(
                CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
        // folder to checkpoint
        StateBackend backend = new FsStateBackend(checkpointPath, true);
        env.setStateBackend(backend);

S3的哪个实现用于检查点?这有很大的不同。

虽然必须将S3的hadoop实现与StreamingFileSink一起使用,但对于检查点来说,这可能是一个糟糕的选择。Hadoop S3 FS试图模仿S3之上的文件系统:

  • 在写入密钥之前;父目录";通过检查前缀直到最后一个"0"的密钥而存在/">
  • 它创建空的标记文件来标记此类父目录的存在
  • 所有这些";存在";请求是昂贵的S3 HEAD请求

因此Hadoop S3 FS具有非常高的";创建文件";延迟,并且它很快达到请求速率限制(HEAD请求在S3上具有非常低的请求速率限制(。

Presto S3并没有试图做到这一点;它只是简单地执行PUT/GET操作,而不需要所有其他东西。因为Flink的检查点只假设了这一点,所以它更高效、更一致。

此外,使用HadoopS3,您可能会遇到恢复操作失败的情况,因为它看起来没有状态文件(HEAD请求导致S3负载均衡器中的错误缓存(。只有过一段时间,文件才会可见,只有到那时恢复才会成功。

但是,请注意,使用Presto S3进行检查点操作也存在问题。参见FLINK-24392。这两种实现方式都不理想。

顺便说一句,可以将hadoop版本用于接收器,也可以将presto版本用于检查点。在这种情况下,应该明确使用s3a://作为接收器(Hadoop(的方案,使用s3p://作为检查点(Presto(。

Flink S3文档。

相关内容

  • 没有找到相关文章

最新更新