Apache flink Flink StreamingFileSink未将数据写入AWS S3
我有一个表示数据流的集合,并测试StreamingFileLink以将数据流写入S3。程序已成功运行,但给定的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();
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