我使用CDH5.1.0 (hadoop 2.3.0)。2个名称节点(2x 32GB RAM, 2核)和3个数据节点(3x 16GB RAM, 2核)
我正在调度默认队列中单个用户的mapreduce作业(没有其他用户和没有配置其他队列)。
当使用容量调度程序时,会发生以下情况:我可以提交多个作业,但只有两个作业正在并行执行(状态为'running')。
当使用fair scheduler时,会发生以下情况:我正在提交多个作业,并且集群/调度程序将4个作业设置为"运行"状态。这些工作永远保持在5%的进度。如果单个作业正在被终止,则新作业将被设置为5%的"运行"状态,同样没有进一步的进展。只有当作业少于4个且没有其他作业提交到队列中时,作业才会开始执行。
我已经多次重新配置集群,但是在使用容量调度程序时无法增加正在运行的作业数量,或者在使用公平调度程序时无法避免作业挂起
我的问题是-如何配置集群/yarn/调度器/动态和静态资源池使调度工作?
下面是一些配置参数:
yarn.scheduler.minimum-allocation-mb = 2GB
yarn.scheduler.maximum-allocation-mb = 12GB
yarn.scheduler.minimum-allocation-vcores = 1
yarn.scheduler.maximum-allocation-vcores = 2
yarn.nodemanager.resource.memory-mb = 12GB
yarn.nodemanager.resource.cpu-vcores = 2
mapreduce.map.memory.mb = 12GB
mapreduce.reduce.memory.mb = 12GB
mapreduce.map.java.opts.max.heap = 9.6GB
mapreduce.reduce.java.opts.max.heap = 9.6GB
yarn.app.mapreduce.am.resource.mb = 12GB
ApplicationMaster Java Maximum Heap Size = 788MB
mapreduce.task.io.sort.mb = 1GB
我已经离开静态和动态资源池与默认设置(cloudera)(例如最大运行的应用程序设置为空)
不是一个解决方案,但可能的解决方案
我们曾与MapR咨询公司的Christian Neundorf讨论过这个问题,他声称FairScheduler中有一个死锁错误(不是CDH特有的,而是标准的hadoop!)
他提出了这个解决方案,但我不记得我们是否试过了。请使用在你自己的风险,我不保证这实际上工作,我张贴这只给那些谁是真的绝望,愿意尝试任何事情,使您的应用程序工作:在yarn-site.xml(不知道为什么这个必须设置)
<property>
<name>yarn.scheduler.fair.user-as-default-queue</name>
<value>false</value>
<description>Disable username for default queue </description>
</property>
在fair-scheduler.xml <allocations>
<queue name="default">
<!-- you set an integer value here which is number of the cores at your disposal minus one (or more) -->
<maxRunningApps>number of cores - 1</maxRunningApps>
</queue>
</allocations>
减少这些参数:
mapreduce.map.memory.mb
mapreduce.reduce.memory.mb
yarn.app.mapreduce.am.resource.mb
到6Gb(并相应地减少堆大小)。
使用当前配置,您只能运行三个容器(每个节点一个)。
YARN至少需要两个容器来运行(一个用于ApplicationMaster,另一个用于Map或Reduce任务)。因此,当您为三个不同的作业启动树applicationmaster时,您很容易遇到这样的情况,这些作业将永远挂在那里,因为您没有任何容器来执行实际的Map/Reduce处理。
进一步,您应该限制可以在集群上并行运行的应用程序的数量(因为您没有那么多资源)为2或3。