Apache flink Flink流媒体示例,生成自己的数据

Apache flink Flink流媒体示例,生成自己的数据,apache-flink,flink-streaming,Apache Flink,Flink Streaming,早些时候我问弗林克一个简单的问题。这给了我一些很好的例子 然而,我想问一个更“流”的例子,我们每秒生成一个输入值。这在理想情况下是随机的,但即使每次都是相同的值也可以 目标是获得一个无需/最少外部接触就能“移动”的流 因此,我的问题是: 如何在没有外部依赖的情况下显示Flink实际的流式数据? 我发现如何通过外部生成数据、向Kafka写入数据或侦听公共源代码来显示这一点,但我正试图以最小的依赖性来解决它(比如从Nifi中的GenerateFlowFile开始)。下面是一个示例。这是一个如何使源和

早些时候我问弗林克一个简单的问题。这给了我一些很好的例子

然而,我想问一个更“流”的例子,我们每秒生成一个输入值。这在理想情况下是随机的,但即使每次都是相同的值也可以

目标是获得一个无需/最少外部接触就能“移动”的流

因此,我的问题是:

如何在没有外部依赖的情况下显示Flink实际的流式数据?
我发现如何通过外部生成数据、向Kafka写入数据或侦听公共源代码来显示这一点,但我正试图以最小的依赖性来解决它(比如从Nifi中的GenerateFlowFile开始)。

下面是一个示例。这是一个如何使源和汇可插拔的示例。其思想是,在开发中,您可以使用随机源并打印结果;在测试中,您可以使用硬连线的输入事件列表并在列表中收集结果;在生产中,您可以使用真实的源和汇

工作如下:

/*
*示例显示如何使源和汇在应用程序代码中可插入,以便
*您可以在测试中注入特殊的测试源和测试接收器。
*/
公共类TestableStreamingJob{
私有源函数源;
私人水槽;
公共可测试StreamingJob(SourceFunction源、SinkFunction接收器){
this.source=源;
this.sink=sink;
}
public void execute()引发异常{
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
数据流长流=
环境添加源(源)
.returns(TypeInformation.of(Long.class));
长流
.map(新的IncrementMapFunction())
.addSink(sink);
execute();
}
公共静态void main(字符串[]args)引发异常{
TestableStreamingJob作业=新的TestableStreamingJob(新的RandomLongSource(),新的PrintSinkFunction());
job.execute();
}
//虽然这样简单很吸引人,但要避免使用匿名类或lambda
//对于任何您可能希望进行单元测试的业务逻辑。
公共类IncrementMapFunction实现MapFunction{
@凌驾
公共长映射(长记录)引发异常{
退货记录+1;
}
}
}
以下是
RandomLongSource

公共类RandomLongSource扩展了RichParallelSourceFunction{
私有易失性布尔值=false;
私有随机;
@凌驾
公共void open(配置参数)引发异常{
super.open(参数);
随机=新随机();
}
@凌驾
公共无效运行(SourceContext ctx)引发异常{
而(!取消){
Long nextLong=random.nextLong();
已同步(ctx.getCheckpointLock()){
ctx.收集(下一个长度);
}
}
}
@凌驾
公开作废取消(){
取消=真;
}
}

下面是一个例子。这是一个如何使源和汇可插拔的示例。其思想是,在开发中,您可以使用随机源并打印结果;在测试中,您可以使用硬连线的输入事件列表并在列表中收集结果;在生产中,您可以使用真实的源和汇

工作如下:

/*
*示例显示如何使源和汇在应用程序代码中可插入,以便
*您可以在测试中注入特殊的测试源和测试接收器。
*/
公共类TestableStreamingJob{
私有源函数源;
私人水槽;
公共可测试StreamingJob(SourceFunction源、SinkFunction接收器){
this.source=源;
this.sink=sink;
}
public void execute()引发异常{
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
数据流长流=
环境添加源(源)
.returns(TypeInformation.of(Long.class));
长流
.map(新的IncrementMapFunction())
.addSink(sink);
execute();
}
公共静态void main(字符串[]args)引发异常{
TestableStreamingJob作业=新的TestableStreamingJob(新的RandomLongSource(),新的PrintSinkFunction());
job.execute();
}
//虽然这样简单很吸引人,但要避免使用匿名类或lambda
//对于任何您可能希望进行单元测试的业务逻辑。
公共类IncrementMapFunction实现MapFunction{
@凌驾
公共长映射(长记录)引发异常{
退货记录+1;
}
}
}
以下是
RandomLongSource

公共类RandomLongSource扩展了RichParallelSourceFunction{
私有易失性布尔值=false;
私有随机;
@凌驾
公共void open(配置参数)引发异常{
super.open(参数);
随机=新随机();
}
@凌驾
公共无效运行(SourceContext ctx)引发异常{
而(!取消){
Long nextLong=random.nextLong();
已同步(ctx.getCheckpointLock()){
ctx.收集(下一个长度);
}
}
}
@凌驾
公开作废取消(){
取消=真;
}
}

我觉得这一定是我想要的。我试图理解的一件事是速度是什么/如何设定。在while循环中添加“wait 1秒”有意义吗?当然可以在源的run循环中添加Thread.sleep。你想不想取决于你的目标。弗林克优雅地处理背压,因此震源不会超过t的其余部分