Ada*_*ker 6 java hadoop mapreduce hadoop-yarn
hadoop集群中有10个节点,32GB RAM,一个64GB.
对于这10个节点,节点限制yarn.nodemanager.resource.memory-mb设置为26GB,64GB节点设置为52GB(对于单个reducer,有些作业需要50GB,它们在此节点上运行)
问题是,当我运行需要8GB映射器的基本工作时,32GB节点并行产生3个映射器(26/8 = 3),64GB节点产生6个映射器.由于CPU负载,此节点通常最后完成.
我想以编程方式限制作业容器资源,例如,对于大多数作业,将容器限制设置为26GB.怎么做到呢?
首先,yarn.nodemanager.resource.memory-mb(Memory) 、yarn.nodemanager.resource.cpu-vcores(vcore) 是 Nodemanager 守护进程/服务配置属性,不能在 YARN 客户端应用程序中覆盖。如果更改这些配置属性,则需要重新启动 Nodemanager 服务。
由于CPU是您的情况的瓶颈,我的建议是将YARN调度策略更改为Fairscheduler,并在集群级别使用DRF(Dominant Resource Fairness)调度策略,以便您可以灵活地根据内存指定应用程序容器大小和CPU核心。正在运行的应用程序容器(mapper/reducer/AM/tasks)的数量将基于您定义的可用 vcore
\n\n调度策略可以在公平调度程序队列/池级别设置。
\n\n调度策略:设置任意队列的调度策略。允许的值为 \xe2\x80\x9cfifo\xe2\x80\x9d/\xe2\x80\x9cfair\xe2\x80\x9d/\xe2\x80\x9cdrf\xe2\x80\x9d
\n\n有关更多详细信息,请参阅此 apache 文档-
\n\n使用 DRF 调度策略创建新的公平调度程序队列/池后,可以在程序中设置内存和 cpu 核心,如下所示。
\n\n配置conf = new Configuration();
\n\n如何在 MapReduce 应用程序中定义容器大小。
\n\nConfiguration conf = new Configuration();\n\nconf.set("mapreduce.map.memory.mb","4096");\nconf.set(mapreduce.reduce.memory.mb","4096");\n\nconf.set(mapreduce.map.cpu.vcores","1");\nconf.set(mapreduce.reduce.cpu.vcores","1");\nRun Code Online (Sandbox Code Playgroud)\n\n\n\nmapper/reducer 的 cpu.vcores 分配的默认值为 1,如果是 cpu 密集型应用程序,您可以增加此值。\n请记住,如果增加此值,并行运行的映射器/减速器任务的数量也会减少。
\n