Apache flink 一个数据源的两个输出

Apache flink 一个数据源的两个输出,apache-flink,Apache Flink,我正在尝试处理日志文件,并将几乎相似的结果保存到两个不同的位置,而无需重新处理整个日志文件 e、 g ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment(); 数据源ds=env.fromCollection(bigData()); MapOperator hardWorkDS=ds.map(i->{ System.out.println(“输入艰苦工作”); 返回工作(一); }); saveToDB(ha

我正在尝试处理日志文件,并将几乎相似的结果保存到两个不同的位置,而无需重新处理整个日志文件

e、 g

ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment();
数据源ds=env.fromCollection(bigData());
MapOperator hardWorkDS=ds.map(i->{
System.out.println(“输入艰苦工作”);
返回工作(一);
});
saveToDB(hardworks.collect());
savetootherdb(hardworks.map(i->moreWork(i)).collect());
此代码打印的“EnterHardWork”是数据源中元素数的两倍。 我知道它应该是这样工作的,因为“collect()”从一开始就在每次调用中计算整个数据

是否有一种变通方法可以避免对同一数据进行两次处理


我知道这在流媒体中是可能的,但我不能使用流媒体来实现这一点。

一个数据集程序可以有您需要的任意多个数据接收器。只需使用
DataSet.output(OutputFormat)
添加一个或多个接收器,然后调用
env.execute()
启动程序。Flink提供了一个
JDBCOutputFormat
,您可以使用它将数据写入数据库

正如您所注意到的,您不应该使用
collect()
,因为它会立即执行程序。除了防止多个数据接收器之外,
collect()
还有一个缺点,即它在将数据写入数据库之前先将数据提取到客户端。直接从
OutputFormat
写入数据是一种更具可扩展性的解决方案

    ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
    DataSource<Integer> ds = env.fromCollection(bigData());


    MapOperator<Integer, Integer> hardWorkDS = ds.map(i -> {

        System.out.println("enter hard work");

        return hardWork(i);
    });


    saveToDB(hardWorkDS.collect());
    saveToAnotherDB(hardWorkDS.map(i -> moreWork(i)).collect());