对来自随机数源的数字求和
Summing a number from a random number source
我刚开始学习 flink 并尝试构建一个非常基本的玩具示例,它随时间对整数求和并定期打印到目前为止的总和
我创建了一个随机数生成器源 class,如下所示:
// 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);
另请查看 this,以供参考各种 window 考虑因素。
我刚开始学习 flink 并尝试构建一个非常基本的玩具示例,它随时间对整数求和并定期打印到目前为止的总和
我创建了一个随机数生成器源 class,如下所示:
// 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);
另请查看 this,以供参考各种 window 考虑因素。