一个DataSource的两个输出

时间:2016-09-28 19:40:57

标签: apache-flink

我尝试处理日志文件并将几乎类似的结果保存到两个不同的地方,而无需再次处理整个日志文件。

e.g。

    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());

此代码打印&#34;输入辛勤工作&#34;数据源中元素数量的两倍。 我知道这是它应该如何工作的,因为&#34; collect()&#34;每次调用都会从一开始就评估整个数据。

为了不处理相同的数据两次,我能做些解决方法吗?

我知道它可以在流式传输中使用,但我无法使用流式传输。

1 个答案:

答案 0 :(得分:2)

DataSet程序可以根据需要使用尽可能多的数据接收器。只需使用DataSet.output(OutputFormat)添加一个或多个接收器,然后调用env.execute()即可启动该程序。 Flink提供了JDBCOutputFormat,您可以将其用于将数据写入数据库。

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