我是hadoop / yarn的新手,需要在任务执行期间消耗容器资源。
当我在apache hadoop网站上查看doc时,它说" nodemanager ...负责容器,监控他们的资源使用情况(cpu,内存,磁盘,网络)并向资源管理器报告#34 ;。 我的理解是节点管理器会定期报告资源使用情况以及心跳。
当我查看源代码时。在NodeStatusUpdaterImpl中,totalResource包含在RegisterNodeManagerRequest中。我认为它是在init nodemanager时调用的,并告诉RM有关配置的资源。但在NodeHeartbeatRequest中,nodestatus只有容器ID,但没有cpu内存等。
那么请你帮我澄清一下容器使用的CPU内存是否会报告给RM?我怎么能得到这样的数据?
非常感谢!
答案 0 :(得分:1)
这是Container Monitor的实现:
hadoop-2.6.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainersMonitorImpl.java
有一些方法可以检查容器是否超出限制,而这个isProcessTreeOverLimit
将显示纱线如何获取某个容器(进程)的内存使用情况。我不确定是否有可用于获取这些信息的API。但是你可以看到这个文件
hadoop-2.6.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/ProcfsBasedProcessTree.java
它向您展示Yarn如何获取内存:跟踪/proc
中的流程文件。这个answer会给你命令。我认为可以在没有Yarn API的情况下添加某些代码来获取内存(我希望它也有这些API)。