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

时间:2017-02-24 10:03:43

标签: csv apache-flink flink-streaming

我正在尝试使用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流等。手动组合这两个文件并生成单个输出的正常工作流程是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

说到这里,将接收器的并行性降低到1非常简单: c.writeAsCsv("output").setParallelism(1);

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