我正在尝试使用flink来完成一个项目。我已经达到了通过应用计数窗口等处理流的程度。然而,我注意到了一种特殊的行为,我无法解释。
似乎流由两个线程处理,输出也分为两部分。
首先,我注意到使用stream.print()
将流打印到标准控制台时的行为。
然后,我打印到一个文件,它实际上在输出文件夹中打印了两个名为1
和2
的文件。
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流等。手动组合这两个文件并生成单个输出的正常工作流程是什么?
谢谢!
答案 0 :(得分:2)
Flink是一个分布式并行流处理器。正如您所说,并行化是实现高吞吐量的必要条件。应用程序的吞吐量受其最慢运算符的限制。因此在许多情况下,接收器也需要并行化。
说到这里,将接收器的并行性降低到1非常简单:
c.writeAsCsv("output").setParallelism(1);
现在,接收器将作为单个线程运行,并且只生成一个文件。