Apache flink 如何在flink中打印聚合数据流?

Apache flink 如何在flink中打印聚合数据流?,apache-flink,Apache Flink,我有一个自定义状态计算,表示为Set,当我的Datastream看到来自Kafka的新事件时,它将不断更新。现在,每次更新状态时,我都要将更新后的状态打印到标准输出。想知道在弗林克怎么做?对所有的窗口和触发器操作都有点困惑,我不断地得到以下错误 原因:java.lang.RuntimeException:记录具有长.MIN_值时间戳(=无时间戳标记)。是将时间特征设置为“ProcessingTime”,还是忘记调用“DataStream.assignTimestampsAndWatermarks

我有一个自定义状态计算,表示为
Set
,当我的
Datastream
看到来自Kafka的新事件时,它将不断更新。现在,每次更新状态时,我都要将更新后的状态打印到标准输出。想知道在弗林克怎么做?对所有的窗口和触发器操作都有点困惑,我不断地得到以下错误

原因:java.lang.RuntimeException:记录具有长.MIN_值时间戳(=无时间戳标记)。是将时间特征设置为“ProcessingTime”,还是忘记调用“DataStream.assignTimestampsAndWatermarks(…)”?

我只想知道如何将聚合流
数据流
打印到标准输出,或者将其写回另一个卡夫卡主题

下面是引发错误的代码片段

StreamTableEnvironment bsTableEnv = StreamTableEnvironment.create(env, bsSettings);

DataStream<Set<Long>> stream = bsTableEnv.toAppendStream(kafkaSourceTable, Row.class)
   stream
      .aggregate(new MyCustomAggregation(100))
      .process(new ProcessFunction<Set<Long>, Object>() {
       @Override
         public void processElement(Set<Long> value, Context ctx, Collector<Object> out) throws Exception {
           System.out.println(value.toString());
         }
       });
StreamTableEnvironment bsTableEnv=StreamTableEnvironment.create(env,bsSettings);
DataStream stream=bsTableEnv.toAppendStream(kafkaSourceTable,Row.class)
流动
.合计(新的MyCustomAggregation(100))
.process(新的ProcessFunction(){
@凌驾
公共void processElement(设置值、上下文ctx、收集器输出)引发异常{
System.out.println(value.toString());
}
});

使用Flink将集合保持在状态可能非常昂贵,因为在某些情况下,集合将经常被序列化和反序列化。如果可能,最好使用Flink的内置ListState和MapState类型

下面是一个例子,说明了一些事情:

publicstaticvoidmain(字符串[]args)引发异常{
StreamExecutionEnvironment环境=
StreamExecutionEnvironment.getExecutionEnvironment();
环境源元素(1L、2L、3L、4L、3L、2L、1L、0L)
.keyBy(x->1)
.process(新的KeyedProcessFunction(){
私有瞬态映射状态集;
@凌驾
公共void open(配置参数)引发异常{
set=getRuntimeContext().getMapState(新的MapStateDescriptor(“set”,Long.class,Boolean.class));
}
@凌驾
公共void processElement(长x、上下文上下文、收集器输出)引发异常{
if(集合包含(x)){
System.out.println(“集合包含”+x);
}否则{
set.put(x,true);
列表=新的ArrayList();
迭代器iter=set.keys().Iterator();
国际热核实验堆(列表::添加);
出、收(单);
}
}
})
.print();
execute();
}
注意,我想使用keyed state,但在事件中没有任何东西可以用作键,所以我只是通过一个常量为流设置了键。这通常不是一个好主意,因为它阻止了并行处理——但是由于您是作为一个集合进行聚合的,所以这不是您可以并行处理的事情,因此不会造成任何伤害

我将long集合表示为MapState对象的键。当我想输出集合时,我会将它收集为一个列表。当我只想打印一些东西进行调试时,我只使用System.out

在IDE中运行此作业时,我看到的是:

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
set contains 3
set contains 2
set contains 1
[0, 1, 2, 3, 4]

如果您希望每秒查看MapState中的内容,可以在进程功能中使用计时器。

请详细说明您希望完成的内容。在每个事件之后输出整个集合的成本都会很高,特别是当集合随着每个事件而增长时。这是调试用的,还是???是的,你明白了!这主要是为了调试,所以每秒钟输出对我来说也很好!不需要每次事件后都有输出。我无法从您共享的代码中找出发生了什么。关于时间戳和水印的错误只是从Flink的窗口代码中抛出的,我没有看到任何窗口。此外,在数据流上没有聚合方法——只有在windows上。我认为印刷可能会工作,但在到达那里之前工作失败了。嗨!非常感谢,但我很难将其映射到我的模型。你能从
Datastream
开始吗?因为如果我有
Datastream
我就不能做
keyBy(x->1)
之类的事情。我不明白你想做什么。请分享你所拥有的,即使它不起作用。粘贴引发错误的代码片段。