以编程方式限制 YARN 容器



我在Hadoop集群中有10个节点,RAM为32GB,一个节点为64GB。

对于这 10 个节点,节点限制yarn.nodemanager.resource.memory-mb设置为 26GB,对于 64GB 节点设置为 52GB(有一些作业需要 50GB 的单个化简器,它们在此节点上运行)

问题是,当我运行需要 8GB 映射器的基本作业时,32GB 节点并行生成 3 个映射器(26/8 = 3),64GB 节点生成 6 个映射器。由于 CPU 负载,此节点通常最后完成。

我想以编程方式限制作业容器资源,例如,将大多数作业的容器限制设置为 26GB。怎么能做到呢?

首先yarn.nodemanager.resource.memory-mb(内存)、yarn.nodemanager.resource.cpu-vcores(vcore)是 Nodemanager 守护程序/服务配置属性,不能在 YARN 客户端应用程序中重写。如果更改这些配置属性,则需要重新启动节点管理器服务。

由于 CPU 是您案例中的瓶颈,因此我的建议是在集群级别将 YARN 调度策略更改为具有 DRF(主导资源公平性)调度策略的 Fairscheduler,以便您可以灵活地根据内存和 CPU 内核指定应用程序容器大小。正在运行的应用程序容器(映射器/化简器/AM/任务)的数量将基于定义的可用 vCore

可以在公平调度程序队列/池级别设置调度策略。

调度策略:设置任意队列的调度策略。允许的值为"fifo"/"公平"/"drf"

有关更多详细信息,请参阅此 apache 文档 -

使用 DRF 调度策略创建新的公平调度程序队列/池后,可以在程序中按如下方式设置两个内存 CPU 内核。

配置 conf = new Configuration();

如何在mapreduce应用程序中定义容器大小。

Configuration conf = new Configuration();
conf.set("mapreduce.map.memory.mb","4096");
conf.set(mapreduce.reduce.memory.mb","4096");
conf.set(mapreduce.map.cpu.vcores","1");
conf.set(mapreduce.reduce.cpu.vcores","1");

参考资料 - https://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

映射器/化简器的 cpu.vcore 分配默认值为 1,如果是 CPU 密集型应用程序,可以增加此值。 请记住,如果增加此值,并行运行的映射器/化简器任务的数量也将减少。

您必须像这样设置配置。试试这个

// create a configuration
Configuration conf = new Configuration();
// create a new job based on the configuration
Job job = new Job(conf);
// here you have to put your mapper class
job.setMapperClass(Mapper.class);
// here you have to put your reducer class
job.setReducerClass(Reducer.class);
// here you have to set the jar which is containing your 
// map/reduce class, so you can use the mapper class
job.setJarByClass(Mapper.class);
// key/value of your reducer output
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
// this is setting the format of your input, can be TextInputFormat
job.setInputFormatClass(SequenceFileInputFormat.class);
// same with output
job.setOutputFormatClass(TextOutputFormat.class);
// here you can set the path of your input
SequenceFileInputFormat.addInputPath(job, new Path("files/toMap/"));
// this deletes possible output paths to prevent job failures
FileSystem fs = FileSystem.get(conf);
Path out = new Path("files/out/processed/");
fs.delete(out, true);
// finally set the empty out path
TextOutputFormat.setOutputPath(job, out);
// this waits until the job completes and prints debug out to STDOUT or whatever
// has been configured in your log4j properties.
job.waitForCompletion(true); 

对于 YARN,需要设置以下配置。

// this should be like defined in your yarn-site.xml
conf.set("yarn.resourcemanager.address", "yarn-manager.com:50001"); 
//For set to 26GB
conf.set("yarn.nodemanager.resource.memory-mb", "26624"); 

// framework is now "yarn", should be defined like this in mapred-site.xm
conf.set("mapreduce.framework.name", "yarn");
// like defined in hdfs-site.xml
conf.set("fs.default.name", "hdfs://namenode.com:9000");

相关内容

  • 没有找到相关文章

最新更新