Hadoop资源分配问题

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

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现在配的值分别是什么呢?

要回复问题请先登录注册