{"record":{"id":"e43f2d6eecab8148","repo":"apache/hadoop","slug":"only-one-of-the-following-keys-can-be-specified-fo","errorCode":null,"errorMessage":"Only one of the following keys can be specified for a single job: {}, {}","messagePattern":"Only one of the following keys can be specified for a single job: (.+?), (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TaskAttemptImpl.java","lineNumber":732,"sourceCode":"    String resourceTypePrefix =\n        getResourceTypePrefix(taskType);\n    boolean memorySet = false;\n    boolean cpuVcoresSet = false;\n    if (RESOURCE_REQUEST_CACHE.get(taskType) != null) {\n      resourceCapability = RESOURCE_REQUEST_CACHE.get(taskType);\n      return;\n    }\n    if (resourceTypePrefix != null) {\n      List<ResourceInformation> resourceRequests =\n          ResourceUtils.getRequestedResourcesFromConfig(conf,\n              resourceTypePrefix);\n      for (ResourceInformation resourceRequest : resourceRequests) {\n        String resourceName = resourceRequest.getName();\n        if (MRJobConfig.RESOURCE_TYPE_NAME_MEMORY.equals(resourceName) ||\n            MRJobConfig.RESOURCE_TYPE_ALTERNATIVE_NAME_MEMORY.equals(\n                resourceName)) {\n          if (memorySet) {\n            throw new IllegalArgumentException(\n                \"Only one of the following keys \" +\n                    \"can be specified for a single job: \" +\n                    MRJobConfig.RESOURCE_TYPE_ALTERNATIVE_NAME_MEMORY + \", \" +\n                    MRJobConfig.RESOURCE_TYPE_NAME_MEMORY);\n          }\n          String units = isEmpty(resourceRequest.getUnits()) ?\n              ResourceUtils.getDefaultUnit(ResourceInformation.MEMORY_URI) :\n                resourceRequest.getUnits();\n          this.resourceCapability.setMemorySize(\n              UnitsConversionUtil.convert(units, \"Mi\",\n                  resourceRequest.getValue()));\n          memorySet = true;\n          String memoryKey = getMemoryKey(taskType);\n          if (memoryKey != null && conf.get(memoryKey) != null) {\n            LOG.warn(\"Configuration \" + resourceTypePrefix + resourceName +\n                \"=\" + resourceRequest.getValue() + resourceRequest.getUnits() +\n                \" is overriding the \" + memoryKey + \"=\" + conf.get(memoryKey) +\n                \" configuration\");","sourceCodeStart":714,"sourceCodeEnd":750,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TaskAttemptImpl.java#L714-L750","documentation":"TaskAttemptImpl resource parsing throws IllegalArgumentException when the job configuration defines memory twice under the same resource prefix — e.g. both mapreduce.map.resource.memory and mapreduce.map.resource.memory-mb (or the reduce variants under mapreduce.reduce.resource.). The two names alias the same resource ('memory' vs its alternative name 'memory-mb'), so the AM cannot decide which value wins and rejects the job.","triggerScenarios":"Job config carries <prefix>memory and <prefix>memory-mb simultaneously (XML, -D on the command line twice, or programmatic conf.set of both); a template merges legacy and new-style resource keys; getRequestedResourcesFromConfig returns both aliases for the prefix.","commonSituations":"Upgrading jobs from old memory settings while scripts still append the legacy alias; config-management (Ansible/Amber) templates layering resource keys; copy-pasted examples mixing mapreduce.map.resource.memory-mb with mapreduce.map.resource.memory.","solutions":["Grep the effective job config (job.xml in the job submission dir) for '^mapreduce.(map|reduce).resource.memory' and delete one of the two aliases — keep memory-mb","If a framework sets one alias for you, stop setting the other in your own defaults","For programmatic configs, assert the invariant before submission (see validation snippet)"],"exampleFix":"<!-- before -->\n<property><name>mapreduce.map.resource.memory</name><value>2048</value></property>\n<property><name>mapreduce.map.resource.memory-mb</name><value>2048</value></property>\n\n<!-- after - exactly one memory alias per task type -->\n<property><name>mapreduce.map.resource.memory-mb</name><value>2048</value></property>","handlingStrategy":"validation","validationCode":"// fail fast at submit time instead of in the AM\nfor (String prefix : new String[]{\"mapreduce.map.resource.\", \"mapreduce.reduce.resource.\"}) {\n  boolean hasMemory = conf.get(prefix + \"memory\") != null;\n  boolean hasMemoryMb = conf.get(prefix + \"memory-mb\") != null;\n  if (hasMemory && hasMemoryMb) {\n    throw new IllegalArgumentException(\n        \"Both \" + prefix + \"memory and \" + prefix + \"memory-mb set; remove one\");\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Adopt one memory key style ('memory-mb') across templates and never layer legacy aliases on top","Dump the effective job.xml of a submitted job and grep for duplicate resource aliases when in doubt"],"tags":["mapreduce","resources","configuration","illegal-argument"],"backgroundTag":"conflicting-config-keys","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}