容器中的TaskExecutorRunner JVM重复,导致运行超出物理内存限制并终止线程



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

移除容器时,作业管理器已打印流程树。它显示有两个重复的TaskExecutiorRunner 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

在花了很长时间之后,我们最终解决了这个问题:

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

当服务器上的可用内存较低或存在其他硬件问题时,分叉和执行子流程需要很长的时间(3-6秒(。在这个过程中,如果YARN两次检查TaskManager的内存使用情况,它会发现内存增加了一倍,导致进程终止并打印有线进程树。

最新更新