对随机数源中的数字求和



我刚刚开始学习 flink,并尝试构建一个非常基本的玩具示例,该示例随着时间的推移对整数求和并定期打印到目前为止的总和

我创建了一个随机数生成器源类,如下所示:

// RandomNumberSource.java
public class RandomNumberSource implements SourceFunction<Integer> {
public volatile boolean isRunning = true;
private Random rand;
public RandomNumberSource() {
this.rand = new Random();
}
@Override
public void run(SourceContext<Integer> ctx) throws Exception {
while (isRunning) {
ctx.collect(rand.nextInt(200));
Thread.sleep(1000L);
}
}
@Override
public void cancel() {
this.isRunning = false;
}
}

如您所见,它每 1 秒生成一个随机数

现在我将如何对生成的数字求和?

// StreamJob.java
public class StreamingJob {
public static void main(String[] args) throws Exception {
// set up the streaming execution environment
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Integer> randomNumber = env.addSource(new RandomNumberSource());
// pseudo code:
// randomNumber
//    .window(Time.seconds(5))
//    .reduce(0, (acc, i) => acc+i) // (initial value, reducer)
//    .sum()

// execute program
env.execute("Flink Streaming Random Number Sum Aggregation");
}
}

我添加了伪代码来解释我正在尝试做什么。 即每 5 秒执行一次所有数字的总和并将其打印出来。

我觉得我的方法中缺少一些东西,可能需要一些关于如何做到这一点的指导。

window运算符用于键控流。应改为使用windowAll来完成此任务。这是代码片段:

randomNumber
.windowAll(TumblingProcessingTimeWindows.of(Time.seconds(5)))
.sum(0)
.print()
.setParallelism(1);

另请查看此内容以获取有关各种窗口注意事项的参考。

相关内容

  • 没有找到相关文章

最新更新