在Apache Flink中连续处理两个数据源

时间:2017-07-27 23:30:06

标签: apache-flink flink-streaming

我想用Apache Flink批量处理两个文件,一个接一个。

对于一个具体的例子:假设我想为每一行分配一个索引,这样第二个文件中的行跟在第一行之后。以下代码不是这样做,而是交错两个文件中的行:

val env = ExecutionEnvironment.getExecutionEnvironment

val text1 = env.readTextFile("/path/to/file1")
val text2 = env.readTextFile("/path/to/file2")

val union = text1.union(text2).flatMap { ... }

我想确保首先通过text1运算符发送所有flatMap,然后然后发送所有text2。建议的方法是什么?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

DataSet.union()不提供跨输入的任何订单保证。来自同一输入分区的记录将按顺序保留,但将与来自其他输入的记录合并。

但是有一个更基本的问题。 Flink是一个并行数据处理器。并行处理数据时,无法保留全局顺序。例如,当Flink并行读取文件时,它会尝试拆分这些文件并独立处理每个拆分。分割是在没有任何特定顺序的情况下分发的。因此,单个文件的记录已经被洗牌。您需要将整个作业的并行度设置为1并实现自定义InputFormat以使其正常工作。

你可以做到这一点,但它不会并行,你需要调整很多东西。我不认为Flink是这项任务的最佳工具。 您是否考虑过使用简单的unix命令行工具来连接文件?