对随机数源中的数求和

vc9ivgsu  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(474)

我刚刚开始学习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");
    }
}

我添加了伪代码来解释我要做的事情。i、 e每5秒,对所有数字求和并打印出来。
我觉得我的方法中遗漏了一些东西,可能需要一些关于如何做到这一点的指导。

kuuvgm7e

kuuvgm7e1#

window 运算符用于键控流。你应该改用 windowAll 对于此任务。以下是片段:

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

另外,请检查此项,以参考各种窗口注意事项。

相关问题