Uploaded image for project: 'Hadoop YARN'
  1. Hadoop YARN
  2. YARN-9205

When using custom resource type, application will fail to run due to the CapacityScheduler throws InvalidResourceRequestException(GREATER_THEN_MAX_ALLOCATION)

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Critical
    • Resolution: Fixed
    • Affects Version/s: 3.3.0
    • Fix Version/s: 3.1.2, 3.3.0, 3.2.1
    • Component/s: None
    • Labels:
      None

      Description

      In a non-secure cluster. Reproduce it as follows:

      1. Set capacity scheduler in yarn-site.xml
      2. Use default capacity-scheduler.xml
      3. Set custom resource type "cmp.com/hdw" in resource-types.xml
      4. Set a value say 10 in node-resources.xml
      5. Start cluster
      6. Submit a distribute shell application which requests some "cmp.com/hdw"

      The AM will get an exception from CapacityScheduler and then failed. This bug doesn't exist in FairScheduler.

      2019-01-17 22:12:11,286 INFO distributedshell.ApplicationMaster: Requested container ask: Capability[<memory:2048, vCores:2, cmp.com/hdw: 2>]Priority[0]AllocationRequestId[0]ExecutionTypeRequest[{Execution Type: GUARANTEED, Enforce Execution Type: false}]Resource Profile[]
      2019-01-17 22:12:12,326 ERROR impl.AMRMClientAsyncImpl: Exception on heartbeat
      org.apache.hadoop.yarn.exceptions.InvalidResourceRequestException: Invalid resource request! Cannot allocate containers as requested resource is greater than maximum allowed allocation. Requested resource type=[cmp.com/hdw], Requested resource=<memory:2048, vCores:2, cmp.com/hdw: 2>, maximum allowed allocation=<memory:8192, vCores:4>, please note that maximum allowed allocation is calculated by scheduler based on maximum resource of registered NodeManagers, which might be less than configured maximum allocation=<memory:8192, vCores:4, cmp.com/hdw: 9223372036854775807>
       at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.throwInvalidResourceException(SchedulerUtils.java:492)
       at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.checkResourceRequestAgainstAvailableResource(SchedulerUtils.java:388)
       at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.validateResourceRequest(SchedulerUtils.java:315)
       at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.normalizeAndValidateRequest(SchedulerUtils.java:293)
       at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.normalizeAndValidateRequest(SchedulerUtils.java:301)
       at org.apache.hadoop.yarn.server.resourcemanager.RMServerUtils.normalizeAndValidateRequests(RMServerUtils.java:250)
      at org.apache.hadoop.yarn.server.resourcemanager.DefaultAMSProcessor.allocate(DefaultAMSProcessor.java:240)
      at org.apache.hadoop.yarn.server.resourcemanager.scheduler.constraint.processor.DisabledPlacementProcessor.allocate(DisabledPlacementProcessor.java:75)
      at org.apache.hadoop.yarn.server.resourcemanager.AMSProcessingChain.allocate(AMSProcessingChain.java:92)
      at org.apache.hadoop.yarn.server.resourcemanager.ApplicationMasterService.allocate(ApplicationMasterService.java:424)
      at org.apache.hadoop.yarn.api.impl.pb.service.ApplicationMasterProtocolPBServiceImpl.allocate(ApplicationMasterProtocolPBServiceImpl.java:60)
      ...

      Did a roughly debugging, below method return the wrong maximum capacity.

      DefaultAMSProcessor.java, Line 234.

      Resource maximumCapacity =
       getScheduler().getMaximumResourceCapability(app.getQueue());

      The above code seems should return "<memory:8192, vCores:4, cmp.com/hdw:10>" but returns "<memory:8192, vCores:4>".

      This incorrect value might be caused by queue maximum allocation calculation involved in YARN-8720:

      AbstractCSQueue.java Line364

      this.maximumAllocation =
       configuration.getMaximumAllocationPerQueue(
       getQueuePath());

      And this invokes CapacitySchedulerConfiguration.java Line 895:

      Resource clusterMax = ResourceUtils.fetchMaximumAllocationFromConfig(this);
      

      Passing a "this" which is not a YarnConfiguration instance will cause below code return null for resource names and then only contains mandatory resources. This might be the root cause.

      private static Map<String, ResourceInformation> getResourceInformationMapFromConfig(
      ...
      // NULL value here!
      String[] resourceNames = conf.getStrings(YarnConfiguration.RESOURCE_TYPES);
      

        Attachments

        1. YARN-9205-branch-3.1.001.patch
          13 kB
          Zhankun Tang
        2. YARN-9205-branch-3.2.001.patch
          13 kB
          Zhankun Tang
        3. YARN-9205-trunk.001.patch
          7 kB
          Zhankun Tang
        4. YARN-9205-trunk.002.patch
          2 kB
          Zhankun Tang
        5. YARN-9205-trunk.003.patch
          14 kB
          Zhankun Tang
        6. YARN-9205-trunk.004.patch
          15 kB
          Zhankun Tang
        7. YARN-9205-trunk.005.patch
          14 kB
          Zhankun Tang
        8. YARN-9205-trunk.006.patch
          13 kB
          Zhankun Tang
        9. YARN-9205-trunk.007.patch
          15 kB
          Zhankun Tang
        10. YARN-9205-trunk.008.patch
          15 kB
          Zhankun Tang
        11. YARN-9205-trunk.009.patch
          15 kB
          Zhankun Tang

          Activity

            People

            • Assignee:
              tangzhankun Zhankun Tang
              Reporter:
              tangzhankun Zhankun Tang
            • Votes:
              0 Vote for this issue
              Watchers:
              7 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: