Apache flink Flink,任务经理没有回应

Apache flink Flink,任务经理没有回应,apache-flink,flink-streaming,Apache Flink,Flink Streaming,在这种情况下,我们有3个kafka主题(每个主题有50个分区),它们有不同的消息,而所有这些消息都有“username”字段 topic_1 --> Message01 {String username; ...}, about 50,000 messages per minute topic_2 --> Message02 {String username; ...}, about 3,000,000 messages per minute topic_3 --> Messa

在这种情况下,我们有3个kafka主题(每个主题有50个分区),它们有不同的消息,而所有这些消息都有“username”字段

topic_1 --> Message01 {String username; ...}, about 50,000 messages per minute
topic_2 --> Message02 {String username; ...}, about 3,000,000 messages per minute
topic_3 --> Message03 {String username; ...}, about 70,000 messages per minute
我们定义了一个包装器类

MessageWrapper{
 List<Message01> list01;
 List<Message02> list02;
 List<Message03> list03;
}
所有3个流都由类似的flatMap()函数处理

public void flatMap(Message01 value, Collector<Tuple3<String, Integer, MessageWrapper>> out)
        throws Exception {
    String name = value.getUsername();
    if (!StringUtils.isBlank(name)) {
        MessageWrapper wrapper = new MessageWrapper();
        List<Message01> list = new ArrayList<>();
        list.add(value);
        wrapper.setList01(list);
        out.collect(new Tuple3<>(name, 1, wrapper));
    }
}
如果我们把时间窗口从5分钟缩短到1分钟,一切都很好。根据这一点,flink集群似乎没有足够的资源,但是80个内核+320G就足以容纳数百万条消息(每条消息的大小约为5KB),对吗


有人能在这里透露一些信息吗?或者代码中可能有一些问题?

我在集群设置中通过在所有机器的
/etc/hosts
文件中使用
127.0.1.1
注释行,解决了这个问题。我还增加了
conf/flink-conf.yaml
文件的
taskmanager.numberOfTaskSlots:
属性上插槽的并行性。

我通过在所有机器的
/etc/hosts
文件上注释
127.0.1.1
行,在集群设置中解决了这个问题。我增加了
conf/flink-conf.yaml
文件的
taskmanager.numberOfTaskSlots:
属性上插槽的并行性。

这实际上是什么时候发生的。就在比赛开始后?或者第一个窗口何时处理?根据您的规格,似乎每个任务管理器都有一个4的平行线,对吗(20x4=80)?这意味着每个插槽只有4GB和一个核心,不再是那么多了。也许降低任务管理器的平行度会有所帮助。@托比什通常情况下,这种情况发生在启动后几分钟,可能是3分钟或10分钟,每次都不同。如果数据不平衡,你有什么见解吗?有些用户可能有数百万个事件,您试图将其保存在内存中?如果不是:您可以只对它们进行计数,看看这是否是问题所在,而不是对它们进行聚合。您在MessageWrapper中使用的列表实现是什么?它应该是为插入而优化的。@TobiSH ArrayList这是什么时候发生的。就在比赛开始后?或者第一个窗口何时处理?根据您的规格,似乎每个任务管理器都有一个4的平行线,对吗(20x4=80)?这意味着每个插槽只有4GB和一个核心,不再是那么多了。也许降低任务管理器的平行度会有所帮助。@托比什通常情况下,这种情况发生在启动后几分钟,可能是3分钟或10分钟,每次都不同。如果数据不平衡,你有什么见解吗?有些用户可能有数百万个事件,您试图将其保存在内存中?如果不是:您可以只对它们进行计数,看看这是否是问题所在,而不是对它们进行聚合。您在MessageWrapper中使用的列表实现是什么?它应该是为插入@TobiSH ArrayList而优化的
public void flatMap(Message01 value, Collector<Tuple3<String, Integer, MessageWrapper>> out)
        throws Exception {
    String name = value.getUsername();
    if (!StringUtils.isBlank(name)) {
        MessageWrapper wrapper = new MessageWrapper();
        List<Message01> list = new ArrayList<>();
        list.add(value);
        wrapper.setList01(list);
        out.collect(new Tuple3<>(name, 1, wrapper));
    }
}
stream1.union(stream2, stream3).keyBy(0).timeWindow(Time.seconds(300))
        .process(
                new ProcessWindowFunction<Tuple3<String, Integer, MessageWrapper>, MessageWrapper, Tuple, TimeWindow>() {

                    @Override
                    public void process(Tuple key,
                            ProcessWindowFunction<Tuple3<String, Integer, MessageWrapper>, MessageWrapper, Tuple, TimeWindow>.Context ctx,
                            Iterable<Tuple3<String, Integer, MessageWrapper>> elements,
                            Collector<MessageWrapper> out) throws Exception {
                        // merge all entities which have same username, to get a big fat wrapper object
                        MessageWrapper w = new MessageWrapper();
                        for (Tuple3<String, Integer, MessageWrapper> t3 : elements) {
                            MessageWrapper ret = t3.f2;
                            Integer type = t3.f1;
                            if (type == 1) {
                                // add to list01
                            } else if (type == 2) {
                                // add to list02
                            } else if (type == 3) {
                                // add to list03
                            }
                        }

                        if (all 3 lists are not empty) {
                            out.collect(ret);
                        }
                    }
                });
Connecting to remote task manager + 'xxxxxxxxxxxxx' has failed. This might indicate that the remote task manager has been lost".