簡體   English   中英

在第二次計算中重用第一次計算的結果

[英]Reuse results of first computation in second computation

我正在嘗試在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)
    ...

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

public List<T> collect()

它將DataSet<T>作為List<T>提取到驅動程序。 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是您要收集的對象類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM