首页 > 解决方案 > 容器中的 TaskExecutorRunner JVM 重复,导致运行超出物理内存限制和 yarn kill

问题描述

我有一些在 Flink 中运行有界流的数据传输作业。这些作业每天都会通过 yarn-session detached 模式多次提交到 Flink 集群。每天都会发生一个奇怪的现象:随机的少数作业(大约 5% 不是内存密集型作业)失败,因为容器由于超出物理内存限制而被删除。

移除容器时,作业管理器已打印流程树。它表明有两个重复的 TaskExecutorRunner JVM 进程共享相同的参数,一个是另一个的父进程。

Flink 版本:1.6.2

我的任务管理器的容器出了什么问题?你见过这个问题吗?

jobmanager.log:

2020-07-13 08:20:38,353 INFO  org.apache.flink.yarn.YarnResourceManager                     - Closing TaskExecutor connection container_e17_1594464964771_78288_01_000002 because: Container [pid=126548,containerID=container_e17_1594464964771_78288_01_000002] is running beyond physical memory limits. Current usage: 2.5 GB of 2 GB physical memory used; 7.0 GB of 4.2 GB virtual memory used. Killing container.
Dump of the process-tree for container_e17_1594464964771_78288_01_000002 :
    |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
    |- 133231 126644 126548 126548 java 0 360 3703341056 324345 /usr/local/jdk1.8.0_112/bin/java -Xms1304m -Xmx1304m -XX:MaxDirectMemorySize=744m -Djob_name=squirrel_mt_netsec.db_conn_ip -Dengine_type=FLINK -Dlog.file=/data1/hadoop/yarn/userlogs/application_1594464964771_78288/container_e17_1594464964771_78288_01_000002/taskmanager.log -Dlogback.configurationFile=file:./logback.xml -Dlog4j.configuration=file:./log4j.properties org.apache.flink.yarn.YarnTaskExecutorRunner --configDir . 
    |- 126548 126400 126548 126548 bash 0 3 120193024 352 /bin/bash -c /usr/local/jdk1.8.0_112/bin/java -Xms1304m -Xmx1304m -XX:MaxDirectMemorySize=744m  -Djob_name=squirrel_mt_netsec.db_conn_ip -Dengine_type=FLINK -Dlog.file=/data1/hadoop/yarn/userlogs/application_1594464964771_78288/container_e17_1594464964771_78288_01_000002/taskmanager.log -Dlogback.configurationFile=file:./logback.xml -Dlog4j.configuration=file:./log4j.properties org.apache.flink.yarn.YarnTaskExecutorRunner --configDir . 1> /data1/hadoop/yarn/userlogs/application_1594464964771_78288/container_e17_1594464964771_78288_01_000002/taskmanager.out 2> /data1/hadoop/yarn/userlogs/application_1594464964771_78288/container_e17_1594464964771_78288_01_000002/taskmanager.err 
    |- 126644 126548 126548 126548 java 3872 777 3703341056 324345 /usr/local/jdk1.8.0_112/bin/java -Xms1304m -Xmx1304m -XX:MaxDirectMemorySize=744m -Djob_name=squirrel_mt_netsec.db_conn_ip -Dengine_type=FLINK -Dlog.file=/data1/hadoop/yarn/userlogs/application_1594464964771_78288/container_e17_1594464964771_78288_01_000002/taskmanager.log -Dlogback.configurationFile=file:./logback.xml -Dlog4j.configuration=file:./log4j.properties org.apache.flink.yarn.YarnTaskExecutorRunner --configDir . 

Container killed on request. Exit code is 143

标签: apache-flink

解决方案


折腾了好久,终于搞明白了这个问题:

我们在 Flink Taskmanager 上运行的应用程序使用了一些依赖库代码,旨在通过 shell 子进程获取一些主机信息。为了创建新的子进程,JVM 使用 C 库进行fork-exec技术。

当服务器上的可用内存不足或其他硬件问题时,fork 和 exec 子进程需要很长时间(3-6s)。在这个过程中,如果 YARN 两次检查 TaskManager 的内存使用情况,就会看到内存翻了一番,导致杀死进程并打印连线的进程树。


推荐阅读