我尝试处理日志文件并将几乎类似的结果保存到两个不同的地方,而无需再次处理整个日志文件。
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;每次调用都会从一开始就评估整个数据。
为了不处理相同的数据两次,我能做些解决方法吗?
我知道它可以在流式传输中使用,但我无法使用流式传输。
答案 0 :(得分:2)
DataSet程序可以根据需要使用尽可能多的数据接收器。只需使用DataSet.output(OutputFormat)
添加一个或多个接收器,然后调用env.execute()
即可启动该程序。 Flink提供了JDBCOutputFormat
,您可以将其用于将数据写入数据库。
正如您所注意到的,您不应该使用collect()
,因为它会立即执行该程序。除了防止多个数据接收器collect()
之外,它还有一个缺点,即在将数据写入数据库之前将数据提取到客户端。直接从OutputFormat
编写数据是一种更具可扩展性的解决方案。