如何在Flink的迭代器中获得当前的迭代步骤?

时间:2017-11-19 10:31:37

标签: scala apache-flink

在Apache Flink 1.3.2和Scala 2.10中执行迭代时是否可以访问当前的迭代索引?

val initialData: DataSet[(ItemSet[T], Int)]

initialData.iterate(maxIterations) {
    current: DataSet[(ItemSet[T], Int)] =>
        val currentIteration = ??? // Is this accessible somehow?
        // ...
        current
}

根据我的搜索到目前为止,简短的回答是"否"稍微长一点的答案就是可以使用Flink的raw state来解决这个问题。

1 个答案:

答案 0 :(得分:1)

解决方案#1:一种方法是在此迭代器中写入system.out.println()并将值打印到控制台,或将这些值写入CSV,但这些会有一些开销例。

解决方案#2:另一种方法是在地图函数中使用Counter,这会增加值,然后使用JobExecutionResult来获取此值

以下是我可以用Java完成的方法

让我们说我正在加入2个流,我想计算总共合并了多少个事件。

DataStream<Event> mergedStream = stream1.union(stream2);

为此,我将编写一个map函数,该函数将为每个合并事件调用,并使用countername.add(value_to_increment)执行增量。 另外,我们给它命名merged,可以在最后使用它来获取结果。

 mergedStream.map(new RichMapFunction<Event, Object>() {

            IntCounter counter1 ;

            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
                this.counter1 = getIterationRuntimeContext().getIntCounter("merged");
            }

            @Override
            public Object map(Event event) throws Exception {
                counter1.add(1);
                return null;
            }


        });

现在,我们将如何获得结果。这里JobExecutionResult将保存执行结果,以后可以查询

JobExecutionResult jobExecutionResult = envrionment.execute(" Started the execution ");

这就是我们如何获得合并事件的数量

number_of_merged_events = (Integer) jobExecutionResult.getAllAccumulatorResults().get("merged");

您也可以在地图中执行System.out.println();以查看控制台上的值。

如果您有任何其他问题,请与我们联系