我已经设置了我的第一个玩具Flink,我想做一件非常简单的事情:连续读取本地文件并打印内容。
问题是,每次更新该本地文件时,Flink都会打印所有行,我希望它仅打印新添加的行。
代码段:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
String path = "/home/foobar/input";
TextInputFormat inputFormat = new TextInputFormat(new Path(path));
inputFormat.setCharsetName("UTF-8");
DataStreamSource<String> ds = env.readFile(inputFormat, path,
FileProcessingMode.PROCESS_CONTINUOUSLY, 60000l, BasicTypeInfo.STRING_TYPE_INFO);
ds.print();
env.execute("jobname02");
有人知道我在做什么错吗?感谢您的帮助。
答案 0 :(得分:3)
您没有做错任何事情,这是PROCESS_CONTINUOUSLY模式的documented行为:
如果watchType设置为FileProcessingMode.PROCESS_CONTINUOUSLY, 修改文件后,其内容将完全重新处理。这个 可能会破坏“完全一次”的语义,因为最后添加数据 文件中的所有内容都会被重新处理。
当应用于目录时,此模式更有用,一旦文件被完全写入,就可以自动将文件移动到其中。