不管是MR还是spark,分布式并行计算是肯定的
分布式计算意味着多节点,每个节点必须要并行跑很多task(任务),因为如果一个节点只有一个task,那么节点数量远远不够。
让开发者直接操作 cpu和内存显然不合理,要用container抽象。
目前container只包含内存和vcore
每个container的内存(由配置确定:yarn.scheduler.minimum-allocation-mb),
每个container的 vCore (由配置决定:yarn.scheduler.minimum-allocation-vcores)。
节点总的资源上限,决定了节点有几个container
yarn.nodemanager.resource.memory-mb
VCores-Total = 1 (node) * 8 (containers) * 1 (vCore per container) = 8
Memory-Total = 1 (node) * 8 (containers) * 1228 MB (memory per container) = 9824 MB = 9.59375 GB = 9.6 GB
容器由 NodeManager 分配和管理,并被它所监控。
容器被 ResourceManager 进行调度。
当 AM 向 RM 申请资源时,RM 为 AM 返回的资源就是用 Container 表示的。RM 只负责告诉AM哪些 Containers是可以用的,实际上AM还需要去找NM请求分配具体的资源来创建 Container。YARN 会为每个任务分配 Container,且该任务只能使用分配的Container中描述的资源(底层是通过jvm参数进行资源隔离,yarn启动进程肯定是有jvm的shell命令的)。
一个 job 或 application 需运行在一个或多个 Container 中。
一个节点会运行多个 Container,但一个 Container 不会跨节点。