我刚刚开始学习 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);
另请查看此内容以获取有关各种窗口注意事项的参考。