Hadoop资源分配问题

目前客户有一个测试任务:要求有两个用户user1 user2,且有如下条件
设置用户USER1的资源配额为cpu占用20%,内存占用1GB;
设置用户USER2的资源配额为cpu占用80%,内存占用1GB;
目前我的思路是使用fair调度器,给每个用户创建了一个队列,然后配置内存资源为1G,但是发现提交JOB的时候,到Running Job就卡住了。然后修改fair-scheduler.xml中队列的配置信息为4GB,如下:
<maxResources>4096mb,6vcores</maxResources>
任务就可以正常提交了。可是测试方案要求job使用1G内存,请问有解决方法吗??

fish - Hadooper

赞同来自: mayibo_123

yarn-site.xml中yarn.scheduler.minimum-allocation-mb、yarn.scheduler.increment-allocation-mb、yarn.scheduler.maximum-allocation-mb这些都配置了啥?   如果是mapreduce任务,mapred-site.xml中的yarn.app.mapreduce.am.resource.mb、mapreduce.map.memory.mb、mapreduce.reduce.memory.mb、mapreduce.task.io.sort.mb这些都做个性化调整了么?

fish - Hadooper

赞同来自: mayibo_123

yarn.app.mapreduce.am.resource.mb默认值是1536了,比你这个queue的1G上限要大。 而且,你要是整个queue只给1G,yarn.scheduler.minimum-allocation-mb也给1G,然后yarn.app.mapreduce.am.resource.mb、mapreduce.map.memory.mb、mapreduce.reduce.memory.mb这些还用默认的这个较大的值,这个queue的配额肯定不够用啦。   把这些默认值都查下,根据具体需求,需要做调整。

fish - Hadooper

赞同来自: mayibo_123

yarn.scheduler.minimum-allocation-mb,为app分配内存时最小的配额。 yarn.scheduler.increment-allocation-mb,每次递加申请的内存资源数,比如,若yarn.scheduler.minimum-allocation-mb是50,yarn.scheduler.increment-allocation-mb是40,当申请60mb的时候,实际申请是90(50 < 60 < 50+40 ),当申请100mb的时候,实际是130(50 + 40 < 100 < 50 + 40*2)。 yarn.scheduler.maximum-allocation-mb,整个集群课分配的内存总量上限。   yarn.app.mapreduce.am.resource.mb,执行appManager时需要分配的内存。 mapreduce.map.memory.mb,map任务执行时要申请的内存。 mapreduce.reduce.memory.mb,reduce任务执行时要申请的内存。 mapreduce.task.io.sort.mb,任务在做spill时,内存的缓存量,之所以提出来,因为当我们将mapreduce.map.memory.mb和mapreduce.reduce.memory.mb减小时,需要将这个值也减小,否则会出现task任务资源不够跑不成功的问题。   根据自己需求做修改调整吧。    

fish - Hadooper

赞同来自: mayibo_123

嗯,再仔细看了下逻辑,之前忽略了Math.max(r.getMemory(), minimumResource.getMemory())中的max,你的说法是正确的。

fish - Hadooper

赞同来自: mayibo_123

那任务会启动多少个map?

fish - Hadooper

赞同来自:

关于博客,有机会我再跟西成确认一下,不过,从代码上看: org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator当中:
  @Override
  public Resource normalize(Resource r, Resource minimumResource,
      Resource maximumResource, Resource stepFactor) {
    int normalizedMemory = Math.min(
        roundUp(
            Math.max(r.getMemory(), minimumResource.getMemory()),
            stepFactor.getMemory()),
            maximumResource.getMemory());
    return Resources.createResource(normalizedMemory);
  }
 这其中调用到的roundUp为 org.apache.hadoop.yarn.util.resource.ResourceCalculator中的实现:
  public static int divideAndCeil(int a, int b) {
    if (b == 0) {
      return 0;
    }
    return (a + (b - 1)) / b;
  }

  public static int roundUp(int a, int b) {
    return divideAndCeil(a, b) * b;
  }
看起来是我说的逻辑,你是否有更多发现?

fish - Hadooper

赞同来自:

yarn.scheduler.maximum-allocation-mb这个是调度器允许调度的资源上限,一般都会把它设置的比集群总内存资源数还要大,为何要把它设小?设置小了肯定任务起不来。 capacity scheduler中的用户到queue映射的配置是yarn.scheduler.capacity.queue-mappings,如果将这个项配置成u:%user:%user,就将用户映射到与他同名的queue中。 具体可以直接看看源代码中的 capacity-scheduler.xml文件,对参数都有详细说明。

mayibo_123 - 90houIT

赞同来自:

111

fish - Hadooper

赞同来自:

队列资源上限设置成1G之后,之前说的那些配置都修改了么?改成了什么值?

fish - Hadooper

赞同来自:

哪个(或者哪些)改成512M了,计算一下跑一个任务所需要的资源在1G以内么?

fish - Hadooper

赞同来自:

如果一个任务由一个map/一个reduce(其实要加一个applicationMaster),你这配置就需要1.5GB内存,我觉得内部不够啊。怎么得到1G够用的结论?

fish - Hadooper

赞同来自:

mapreduce.task.io.sort.mb这个不能配512M那么高,即使任务跑起来,会oom,配成mapreduce.map.memory.mb的30%差不多了。 你现在任务能跑起来了么? yarn.scheduler.increment-allocation-mb跟yarn.scheduler.maximum-allocation-mb现在配的值分别是什么呢?

要回复问题请先登录注册