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

时间:2015-04-30 14:15:36

标签: java apache-flink

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

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

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

我不确定如何做到这一点。我尝试使用LocalCollectionOutputFormat,它在本地工作,但是当我在群集上部署作业时,我得到NullPointerException - 这并不奇怪。

Flink的做法是什么?

这是我的代码:

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
// ....

这是我得到的例外:

Error: The program execution failed: java.lang.NullPointerException
    at org.apache.flink.api.java.io.LocalCollectionOutputFormat.close(LocalCollectionOutputFormat.java:86)
    at org.apache.flink.runtime.operators.DataSinkTask.invoke(DataSinkTask.java:176)
    at org.apache.flink.runtime.execution.RuntimeEnvironment.run(RuntimeEnvironment.java:257)
    at java.lang.Thread.run(Thread.java:745)

org.apache.flink.client.program.ProgramInvocationException: The program execution failed: java.lang.NullPointerException
    at org.apache.flink.api.java.io.LocalCollectionOutputFormat.close(LocalCollectionOutputFormat.java:86)
    at org.apache.flink.runtime.operators.DataSinkTask.invoke(DataSinkTask.java:176)
    at org.apache.flink.runtime.execution.RuntimeEnvironment.run(RuntimeEnvironment.java:257)
    at java.lang.Thread.run(Thread.java:745)

    at org.apache.flink.client.program.Client.run(Client.java:328)
    at org.apache.flink.client.program.Client.run(Client.java:294)
    at org.apache.flink.client.program.Client.run(Client.java:288)
    at org.apache.flink.client.program.ContextEnvironment.execute(ContextEnvironment.java:55)
    at it.list.flink.test.Test01.main(Test01.java:62)
    ...

2 个答案:

答案 0 :(得分:3)

使用最新版本(0.9-milestone-1),Flink添加了Resources方法

collect()

public List<T> collect() 作为DataSet<T>提取到驱动程序。 List<T>也会触发立即执行该程序(不需要致电collect())。目前,大约10 MB的数据集存在大小限制。

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

答案 1 :(得分:0)

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

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

K是您要收集的对象类型