在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来解决这个问题。
答案 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();
以查看控制台上的值。
如果您有任何其他问题,请与我们联系