如何基于内容写入不同的文件以在Flink中进行批处理?

时间:2019-03-19 10:31:50

标签: apache-flink flink-streaming

我正在尝试处理HDFS上的某些文件,并将结果也写回HDFS。在作业开始之前已经准备好文件。我要根据文件内容写入不同的路径和文件。我知道提供了BucketingSinkdoc here)可以在Flink流中实现这一点。但是,看来Dataset没有类似的API。我发现了一些关于stackoverflow的问答。(123)。现在我认为我有两种选择:

  1. 使用Hadoop API:MultipleTextOutputFormatMultipleOutputs;
  2. 以流形式读取文件并使用BucketingSink

我的问题是如何在它们之间做出选择,还是有其他解决方案?任何帮助表示赞赏。

编辑:此问题可能与this 相同。

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题。我们也很惊讶DataSet不支持addSink()

我建议不要切换到流媒体模式。您可能会放弃在批处理模式下可用的一些优化(即内存池)。

您可能必须实现自己的 OutputFormat 来进行存储。

相反,您可以将OutputFormat[YOUR_RECORD](或RichOutputFormat[])扩展到仍可以使用BucketAssigner[YOUR_RECORD, String]打开/写入/关闭输出流的位置。

这就是我们所做的,而且效果很好。

我希望flink能够尽快在批处理模式下对此提供支持。