在Flink中,如何将DataStream写入单个文件?

时间:2016-08-16 14:51:32

标签: scala apache-flink

writeAsText的{​​{1}}或writeAsCsv方法写入与工作线程一样多的文件。据我所知,这些方法只允许您指定这些文件的路径和一些格式。

出于调试和测试的目的,能够将所有内容打印到单个文件中非常有用,而无需将设置更改为具有单个工作线程。

是否有任何非过于复杂的方法来实现这一目标?我怀疑它应该可以实现一个自定义DataStream,但不确定那个(此外,它对于看似相对简单的事情也感觉很麻烦。)

2 个答案:

答案 0 :(得分:8)

您可以通过将并行度设置为1来实现此目的。这样,只能在一台计算机上进行写入。

writeAsText(path).setParallelism(1);

答案 1 :(得分:1)

在 Flink 1.13 中,这不再使用 writeAsText 函数完成,因为它已被弃用。

可以看出 here 现在应该使用 StreamingFileSink 类和 addSink 操作。关于将并行度设置为 1,这也是不同的(通过将 StreamExecutionEnvironment 并行度设置为 1,使用 setParallelism 方法)

val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)

val sink: StreamingFileSink[String] = StreamingFileSink
  .forRowFormat(new Path(outPath), new SimpleStringEncoder[String]("UTF-8"))
  .build()

dataStream.map(_.toString).addSink(sink)