Apache flink 一个数据源的两个输出
我正在尝试处理日志文件,并将几乎相似的结果保存到两个不同的位置,而无需重新处理整个日志文件 e、 gApache 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
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());