使用S3存储的Flink FsStateBackend太昂贵

时间:2020-10-27 06:14:30

标签: apache-flink flink-streaming

目前,我使用FsStateBackend作为检查点状态。我正在使用10秒间隔,如下面的代码。但是我看到使用检查点的转移存储桶的成本约为20美元/天,aws转移s3的定价是:0.005美元/ 1000个请求=>(我每天使用的是〜4000000个请求@@)。我有7个工作,其中:

  • 使用检查点间隔= 10000(ms)的6个作业
  • 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);

1 个答案:

答案 0 :(得分:1)

您将S3的哪个实现用于检查点?差别很大。

虽然您必须StreamingFileSink与S3的hadoop实现配合使用,但对于检查点而言,这是一个非常糟糕的选择。 Hadoop S3 FS尝试模仿S3之上的文件系统:

  • 在编写密钥之前,它会通过检查前缀为最后一个“ /”的密钥来检查“父目录”是否存在
  • 它会创建空的标记文件来标记此类父目录的存在
  • 所有这些“存在”请求都是昂贵的S3 HEAD请求

结果,Hadoop S3 FS具有很高的“创建文件”延迟,并且非常快达到请求速率限制(HEAD请求在S3上具有非常低的请求速率限制)。

Presto S3不会尝试这样做。 它只执行PUT / GET操作,而不会处理其他所有内容。 由于Flink的检查点仅是假设,因此更加有效和一致。

此外,使用Hadoop S3时,您可能会遇到还原操作失败的情况,因为它看起来好像不存在状态文件(HEAD请求导致S3负载平衡器中的错误缓存)。只有一会儿,文件才可见,然后还原将成功。

请注意,既可以将接收器的hadoop版本也可以将其用于检查点的presto版本。在这种情况下,您应该明确使用s3a://作为接收器的方案(Hadoop),并使用s3p://作为检查点的方案(Presto)。

Flink S3 docs