Java 在第二次计算中重用第一次计算的结果

Java 在第二次计算中重用第一次计算的结果,java,apache-flink,Java,Apache Flink,我试图用Flink编写一个需要两个阶段的计算 在第一阶段中,我从一个文本文件开始,执行一些参数估计,得到一个表示数据统计模型的Java对象 在第二阶段,我想使用这个对象为模拟生成数据 我不知道怎么做。我尝试了LocalCollectionOutputFormat,它在本地工作,但是当我在集群上部署作业时,我得到了NullPointerException——这并不奇怪 弗林克的做法是什么 这是我的密码: ExecutionEnvironment env = ExecutionEnvironment

我试图用Flink编写一个需要两个阶段的计算

在第一阶段中,我从一个文本文件开始,执行一些参数估计,得到一个表示数据统计模型的Java对象

在第二阶段,我想使用这个对象为模拟生成数据

我不知道怎么做。我尝试了
LocalCollectionOutputFormat
,它在本地工作,但是当我在集群上部署作业时,我得到了
NullPointerException
——这并不奇怪

弗林克的做法是什么

这是我的密码:

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
GlobalConfiguration.includeConfiguration(configuration);

// Phase 1: read file and estimate model
DataSource<Tuple4<String, String, String, String>> source = env
        .readCsvFile(args[0])
        .types(String.class, String.class, String.class, String.class);

List<Tuple4<Bayes, Bayes, Bayes, Bayes>> bayesResult = new ArrayList<>();
// Processing here...
....output(new LocalCollectionOutputFormat<>(bayesResult));

env.execute("Bayes");

DataSet<BTP> btp = env
        .createInput(new BayesInputFormat(bayesResult.get(0)))
// Phase 2: BayesInputFormat generates data for further calculations
// ....
在最新版本(0.9-milestone-1)中,Flink添加了一个
collect()
方法

public List<T> collect()
public List collect()
它将
数据集
作为
列表
获取到驱动程序
collect()
还将触发程序的立即执行(不需要调用
ExecutionEnvironment.execute()
)。目前,大约10 MB的数据集有大小限制


如果未在驱动程序中计算模型,还可以将两个程序链接在一起,并通过连接数据接收器将模型发射到侧面。这将更有效,因为数据不会在客户端计算机上进行往返。

如果使用0.9之前的Flink,则可以使用以下代码段将数据集收集到本地集合:

val dataJavaList = new ArrayList[K]
val outputFormat = new LocalCollectionOutputFormat[K](dataJavaList)
dataset.output(outputFormat)
env.execute("collect()")

其中
K
是您想要收集的对象类型

谢谢,这非常有用。我尝试了链接,但第一次运行的结果基本上是一组参数,即一行。将这一行分配给客户端,我可以使用InputFormat在每个客户端上并行生成数据,而使用链接我找不到相同的方法。不确定是否正确,但是您可以使用以下技巧:将参数放入广播变量并将其分配给一组
flatMap
操作符。这些
flatMap
操作符中的每一个都可以访问所有参数,并且可以根据需要发出任意数量的记录。但是,您需要使用虚拟输入记录触发
flatMap
的执行,该记录可以从包含每个并行
flatMap
实例的一个
Integer
的集合输入格式提供。在进入
flatMap
操作符之前,需要对收集的IF数据进行
重新平衡。我不知道Scala,但在我看来,您的建议与我在问题中报告的内容相同,通过这种方法,我得到了NPE。
val dataJavaList = new ArrayList[K]
val outputFormat = new LocalCollectionOutputFormat[K](dataJavaList)
dataset.output(outputFormat)
env.execute("collect()")