Flink,TaskManager没有响应

时间:2019-03-14 05:57:53

标签: apache-flink flink-streaming

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

raise TypeError("Image data cannot be converted to float")

我们定义了一个包装器类

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

我们有一个flatMap,可以将原始消息“转换”为元组3,

MessageWrapper{
 List<Message01> list01;
 List<Message02> list02;
 List<Message03> list03;
}

所有3个流均由类似的flatMap()函数处理,

String field --> username
Integer field --> type
MessageWrapper field --> the wrapper object

在flatMap()之后,我们合并了这3个流,

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));
    }
}

当前,我们使用20个任务管理器,每个4核+ 16G,总共80个插槽,我们使用50个并行度。

我们总是遇到由于过多的gc导致taskmanager无法响应的问题,

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);
                        }
                    }
                });

如果我们将时间范围从5分钟减少到1分钟,那么一切都很好。据此看来,flink集群似乎没有足够的资源,但是对于几百万条消息(每个消息的大小约为5KB)而言,80核+ 320G足够了吗?

任何人都可以在这里找到一些启示吗?或者代码中可能存在一些问题?

1 个答案:

答案 0 :(得分:0)

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