Apache flink Flink,任务经理没有回应
在这种情况下,我们有3个kafka主题(每个主题有50个分区),它们有不同的消息,而所有这些消息都有“username”字段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
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".