2015年四月月 发布的文章

[YARN] Label Based Scheduling

目标:

  1. 提供一种可靠的机制在特定的节点运行应用程序。
  2. 为队列提供一种可靠的机制在特定的节点上进行资源的调度
  3. 提供一种机制解决队列和application所定义节点在哪运行

定义

  • Node Label – 描述一个节点的标签,每个节点可以拥有多个标签
  • Label expression – 逻辑上的标签组合(使用 && 或 and,|| 或 or,!或 not)
  • Queue label – Label expression 决定哪些节点属于这个队列
  • Application Label – Label expression 决定应用程序容器在哪些节点运行
  • Queue Label Policy – Label Policy 配置在Queue中,其定义规则解决application label和queue label之间的冲突

使用案例

cluster A使用Fair Scheduler去调度application在他的节点上。 cluster 管理员定义多个队列包括嵌套队列去划分资源给不同的组织,所以每个组织都可以共享资源去使用。 除此之外,集群还在不同方面存在异构:

  • 拥有不同类型的硬件(一些节点拥有大内存,多CPU,有些则网络带宽占优势)
  • 数据在DFS中切分到分配到不同的节点/机架上
  • 其他的不同等等

cluster管理员根据差异用标签标记所有的节点:

  • 大内存使用red标记
  • 高CPU的使用blue标记
  • 高网络带宽的使用green标记
  • 节点在机架A标记为-rackA
  • 节点在机架B标记未-rackB

因为被标记为red的节点可以在rackA和rackB cluster管理员可以分配多个标签给它:

Node Regex Label1 Label2 LabelN
rackA_red red rackA
rackA_blue blue rackA
rackB_red red rackB

如果我们希望所有的应用提交到Queue1即运行在“rackA_red”或“rackA_blue”节点上,cluster管理员可以调整label expression即配置Queue1为(red || blue)&& rackA

另外cluster管理员配置Queue Policy去定义调度器的行为,假设提交的application也拥有自己的label expression

  • Queue Lable Expression优先
  • Application Label Expression优先
  • 取它们的交集
  • 取它们的或集

现在,用户B提交一个app到Queue1,但是这个app属于计算密集型的,他希望运行在高cpu的节点上,所以,这个app的lable expression可以为 “blue && rackA”

幸运的是集群管理员设置Queue Policy为“AND”,所以application将会被调度在“rackA_blue”的节点上运行。 假设集群管理员设置Queue Policy为“OR”,结果将会变为:“((red || blue) && rackA) || (blue && rackA)” ,即”(red || blue) && rackA”

设计

Node Labels, Label Expressions, Policies

Node Labels

最初的JIRA建议每个节点指定他们自己拥有的标签,并提供这些信息给ResourceManager. 我们建议集中式的把节点的标签存储到DFS上,所有的YARN daemons都可以访问,修改也不需要同步到整个集群或者客户端

标签可以被指定为下列的格式:

perfnode.* big, fast, physical, scale.* virtual, “slow”, perfnode30 ‘bad’

Label Expressions, Policies

Label expression 是一种逻辑表达式,它可以包含多个标签 (例如:big || virtual && !bad). Application Label expression 可以定义应用想要运行在哪些节点的集合 Queue Label expression 可以定义该队列“希望”应用运行在哪些节点。

Queue Label Policy

每个队列可以配置label expression和application Label Expression相互作用,通过配置Queue Label Policy可以解决Queue label和application label之间的冲突,决定应用在哪些类型节点上运行。

Label Manager

Label Manager是RM的一个新的服务 这个服务的主要作用为:

  • 从DFS加载节点的标签和维护内部节点和节点标签的map
  • 检查文件的变化,并更新内部节点和标签的映射关系
  • 基于 Application Label Expression, Queue Label Expression和Queue Label Policy结合构造新的逻辑表达式

英文不太好,望多多指正

参考资料: YARN-796

[HADOOP问题] 常见问题解决

问题1:在程序的日志中看到,在reduce阶段出现了异常:Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out ,程序里需要打开文件,系统默认为1024,也可以通过ulimit -a查看

编辑文件/etc/security/limits.conf 在文件后面添加:

# End of file
*       soft       nofile  102400
*       hard       nofile  409600

遇到这种错误网上也有不同的可能解决方法和解释,你们可以自己找找。

问题2: yarn日志页面出现异常:

Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file:
   /tmp/hsperfdata_hdp/6676
Try using the -Djava.io.tmpdir= option to select an alternate temp location

原因是根目录空间不足,解决问题的办法之一是清理根目录下不必要的文件,解决办法二就是,上面也就有提示了,不多说了。

/tmp/hsperfdata_username 目录的作用是什么呢?

jvm运行时在linux下默认在/tmp下生成上面的目录,目录下存放pid文件,和一些jvm进程信息,jmap、jstack等工具会读取该目录下的pid文件获取链接信息

问题3: 当任务不能跑满集群的时,为什么集群的节点会出现几个节点跑满容器,而其他节点则非常空闲?

原因是集群调度器默认处于批处理模式下,一个心跳会尽可能的分配任务,心跳先到达则会优先领取任务,我们可以通过参数yarn.scheduler.fair.max.assign参数设置为1,就可以大致的均衡任务到不同的节点

更新时间2015-07-18