Flink 将 SingleOutputStreamOperator 写入两个文件而不是一个

Flink writes SingleOutputStreamOperator to two files instead of one

我正在为一个工作项目尝试使用 flink。我已经达到了通过应用计数窗口等方式处理流的地步。但是,我注意到一个我无法解释的特殊行为。

好像一个流被两个线程处理了,输出也分成了两部分。

首先我注意到使用 stream.print().

将流打印到标准控制台时的行为

然后,我打印到一个文件,它实际上打印在输出文件夹中名为 12 的两个文件中。

    SingleOutputStreamOperator<Tuple3<String, String,String>> c = stream_with_no_err.countWindow(4).apply(new CountPerWindowFunction());
    // c.print()   // this olso prints two streams in the standard console

    c.writeAsCsv("output");

谁能解释一下为什么 flink 会出现这种行为?我该如何配置它?为什么需要拆分结果流?

我理解的并行性对速度(多线程)很有用,但为什么要拆分生成的流?

通常,我希望将结果流(处理后)作为单个文件或 tcp 流等。正常的工作流程是手动合并两个文件并生成一个输出吗?

谢谢!

Flink 是一个分布式并行流处理器。正如您所说的那样,并行化是实现高吞吐量所必需的。应用程序的吞吐量受其最慢的运算符的限制。所以在很多情况下,接收器也需要并行化。

话虽如此,将接收器的并行度降低到 1 非常简单: c.writeAsCsv("output").setParallelism(1);

现在,接收器将 运行 作为单个线程并且仅生成单个文件。