Apache flink Flink StreamingFileSink未将数据写入AWS S3

Apache flink Flink StreamingFileSink未将数据写入AWS S3,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一个表示数据流的集合,并测试StreamingFileLink以将数据流写入S3。程序已成功运行,但给定的S3路径中没有数据 public class S3Sink { public static void main(String args[]) throws Exception { StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment();

我有一个表示数据流的集合,并测试StreamingFileLink以将数据流写入S3。程序已成功运行,但给定的S3路径中没有数据

    public class S3Sink {

    public static void main(String args[]) throws Exception {
        StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment();
        see.enableCheckpointing(100);

        List<String> input = new ArrayList<>();
        input.add("test");

        DataStream<String> inputStream = see.fromCollection(input);

        RollingPolicy<Object, String> rollingPolicy = new CustomRollingPolicy();

        StreamingFileSink s3Sink = StreamingFileSink.
                forRowFormat(new Path("<S3 Path>"),
                new SimpleStringEncoder<>("UTF-8"))
                .withRollingPolicy(rollingPolicy)
                .build();


        inputStream.addSink(s3Sink);

        see.execute();
    }
}
公共类S3Sink{
公共静态void main(字符串args[])引发异常{
StreamExecutionEnvironment请参见=StreamExecutionEnvironment.getExecutionEnvironment();
参见。启用检查点(100);
列表输入=新的ArrayList();
输入。添加(“测试”);
DataStream inputStream=参见.fromCollection(输入);
RollingPolicy RollingPolicy=新的CustomRollingPolicy();
StreamingFileSink s3Sink=StreamingFileSink。
forRowFormat(新路径(“”),
新的SimpleStringEncoder(“UTF-8”))
.withRollingPolicy(滚动策略)
.build();
inputStream.addSink(s3Sink);
参见。execute();
}
}
还启用了检查点。有没有想过为什么水槽不能按预期工作

更新: 根据David的回答,创建了连续生成随机字符串的自定义源代码,我希望在配置将数据写入S3的间隔后触发检查点

public class S3SinkCustom {

    public static void main(String args[]) throws Exception {
        StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment();
        see.enableCheckpointing(1000);

        DataStream<String> inputStream = see.addSource(new CustomSource());

        RollingPolicy<Object, String> rollingPolicy = new CustomRollingPolicy();

        StreamingFileSink s3Sink = StreamingFileSink.
                forRowFormat(new Path("s3://mybucket/data/"),
                new SimpleStringEncoder<>("UTF-8"))
                .build();


        //inputStream.print();

        inputStream.addSink(s3Sink);

        see.execute();
    }

    static class CustomSource extends RichSourceFunction<String> {

        private volatile boolean running = false;

        final String[] strings = {"ABC", "XYZ", "DEF"};

        @Override
        public void open(Configuration parameters){
            running = true;
        }

        @Override
        public void run(SourceContext sourceContext) throws Exception {
            while (running) {
                Random random = new Random();
                int index = random.nextInt(strings.length);
                sourceContext.collect(strings[index]);
                Thread.sleep(1000);
            }
        }

        @Override
        public void cancel() {
            running = false;
        }
    }

}
public类自定义{
公共静态void main(字符串args[])引发异常{
StreamExecutionEnvironment请参见=StreamExecutionEnvironment.getExecutionEnvironment();
参见。启用检查点(1000);
DataStream inputStream=see.addSource(新的CustomSource());
RollingPolicy RollingPolicy=新的CustomRollingPolicy();
StreamingFileSink s3Sink=StreamingFileSink。
forRowFormat(新路径(“s3://mybucket/data/”),
新的SimpleStringEncoder(“UTF-8”))
.build();
//inputStream.print();
inputStream.addSink(s3Sink);
参见。execute();
}
静态类CustomSource扩展了RichSourceFunction{
private volatile boolean running=false;
最后一个字符串[]字符串={“ABC”、“XYZ”、“DEF”};
@凌驾
公共无效打开(配置参数){
运行=真;
}
@凌驾
公共void运行(SourceContext SourceContext)引发异常{
(跑步时){
随机=新随机();
int index=random.nextInt(strings.length);
collect(字符串[索引]);
睡眠(1000);
}
}
@凌驾
公开作废取消(){
运行=错误;
}
}
}
尽管如此,s3中并没有数据,Flink进程甚至并没有验证给定的s3 bucket是否有效,但进程运行时并没有任何问题

更新:

以下是自定义滚动策略的详细信息:

public class CustomRollingPolicy implements RollingPolicy<Object, String> {

    @Override
    public boolean shouldRollOnCheckpoint(PartFileInfo partFileInfo) throws IOException {
        return partFileInfo.getSize() > 1;
    }

    @Override
    public boolean shouldRollOnEvent(PartFileInfo partFileInfo, Object o) throws IOException {
        return true;
    }

    @Override
    public boolean shouldRollOnProcessingTime(PartFileInfo partFileInfo, long l) throws IOException {
        return true;
    }
}
公共类CustomRollingPolicy实现RollingPolicy{
@凌驾
公共布尔值shouldRollOnCheckpoint(PartFileInfo PartFileInfo)引发IOException{
返回partFileInfo.getSize()>1;
}
@凌驾
公共布尔值shouldRollOnEvent(PartFileInfo PartFileInfo,对象o)引发IOException{
返回true;
}
@凌驾
公共布尔值shouldRollOnProcessingTime(PartFileInfo PartFileInfo,长l)引发IOException{
返回true;
}
}

我认为问题在于您编写的作业不会运行足够长的时间来实际检查点,因此输出不会最终确定


另一个潜在问题是StreamingFileLink仅适用于基于Hadoop的S3文件系统(而不是来自Presto的文件系统)。

在使用必需的s3a属性(如fs.s3a.access.key、fs.s3a.secret.key)设置flink-conf.yaml后,上述问题得到解决

我们还需要让Flink知道配置位置

初始化(GlobalConfiguration.loadConfiguration(“”)


通过这些更改,我可以从本地运行S3接收器,并且消息可以毫无问题地持久化到S3。

创建了生成数据流的自定义源,但检查点似乎仍然不起作用。更新了带有更多细节的问题。自定义滚动策略是什么样子的?我也尝试过不使用自定义滚动策略,但行为仍然相同。更新了带有自定义滚动策略详细信息的答案。您正在使用哪个S3库?StreamingFileLink仅适用于基于Hadoop的S3文件系统库(而不适用于Presto的文件系统库)。您检查过检查点是否完成了吗?您可以在web ui中看到这一点。org.apache.flink-flink-s3-fs-hadoop 1.8.1