热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

YARN动态资源池配置案例

EDH作为统一的企业级数据中心,往往是一个多租户的应用环境。在该环境中,不同用户会同时使用集群资源。如何保证用户数据不被任意篡改?如何保证任务的权限控制(例如用户A不能任性地取消用户B的任务)?如何
EDH作为统一的企业级数据中心,往往是一个多租户的应用环境。在该环境中,不同用户会同时使用集群资源。如何保证用户数据不被任意篡改?如何保证任务的权限控制 (例如用户A不能任性地取消用户B的任务)?如何确保用户资源使用不超过他们的配额?
1. 开启HDFS权限检查 (默认是开启的) YARN动态资源池配置案例

"Check HDFS Permissions"选中
2. 在集群中创建新用户,以cloudera-dev为例
 增加用户组
 [root]$ groupadd cloudera-dev
 # 增加用户
 [root]$ useradd -g cloudera-dev cloudera-dev
 # 查看用户 cloudera-dev 所属的所有组
 [root]$ groups cloudera-dev

 # Hadoop 创建相应的用户目录
 [root]$ sudo -u hdfs hdfs dfs -mkdir /user/cloudera-dev
 [root]$ sudo -u hdfs hdfs dfs -chown cloudera-dev:cloudera-dev /user/cloudera-dev 
一般而言,创建新用户会在集群中每台机器上都创建同样的用户。不过理论上,为了运行该案例,只需要在安装了资源管理器 (Resource Manager) 的机器上创建相应用户即可。CDH默认情况下使用whoami获取用户的信息,bash -c groups xxx 获取用户与组之间的映射关系,并使用这两份信息进行ACL验证
3. 运行第一个MapReduce示例程序 "word count"
 [root]$ su cloudera-dev
 [cloudera-dev]$ echo "Hello World Bye World" > file0
 [cloudera-dev]$ echo "Hello Hadoop Goodbye Hadoop" > file1
 [cloudera-dev]$ hdfs dfs -mkdir -p /user/cloudera-dev/wordcount/input
 [cloudera-dev]$ hdfs dfs -put file* /user/cloudera-dev/wordcount/input
 [cloudera-dev]$ hadoop jar /opt/cloudera/parcels/CDH/jars/hadoop-examples.jar wordcout wordcount/input wordcount/output
 [cloudera-dev]$ hdfs dfs -getmerge wordcount/output output.txt
 [cloudera-dev]$ cat output.txt
 Bye 1
 Hadoop 2
 Hello 2
 Goodbye 1
 World 2

4. 开启资源管理器ACL并设置相应的管理ACL (Admin ACL) YARN动态资源池配置案例

其中yarn.acl.enable默认值为true。而对于yarn.admin.acl默认值为*,意味着所有人都可以管理Resource Manager (比如运行yarn rmadmin)、管理已提交 (比如取消 kill) 的任务。格式为 "以逗号分隔的用户列表+空格+以逗号分隔的用户组列表",例如 "user1,user2 group1,group2"。如果只有组信息,需要在最前端加入一个空格,例如" group1,group2"。另外特别需要注意的是必须至少将"yarn"加入到用户列表中,默认安装CDH后,有关YARN服务的命令会以yarn用户的身份进行运行,若yarn不设置于yarn.admin.acl中,会出现权限相关的错误 (例如刷新动态资源池)。
在该示例中,yarn.admin.acl列表中包含一个用户yarn以及一个组cloudera-dev。博主注:配置在yarn.admin.acl中的用户、用户组并不能任意在资源池 (或者叫资源队列) 中提交任务。
5. 关闭未声明资源池的自动生成 YARN动态资源池配置案例

默认情况下,"Allow Undeclared Pools"可选项是选中的,需要关闭。否则如果用户指定一个尚未声明的资源池时,比如prod,YARN将会自动生成一个prod资源池。配置文件修改后需要重新启动YARN服务,重新部署客户端配置。
6. 配置“若用户提交任务不指定特定的queue,就使用default queue YARN动态资源池配置案例

默认情况下,“Fair Scheduler User As Default Queue”可选项是选中的,意味着如果用户提交任务时如果不指定特定的queue,就使用以用户命名的queue。
7. 进入动态资源池 (Dynamic Resource Pools) 配置页面 YARN动态资源池配置案例
访问动态资源池管理页面 YARN动态资源池配置案例
选择配置选项 (Configuration,右上角) YARN动态资源池配置案例

Resource Pools: 展示了当前资源池的分配情况,默认情况下,只有一个资源池 root.default。在该示例中,dev 是自定义的资源池。权重 (weight) 定义了资源池之间分配资源的比例。示例中,dev设置权重为4而 default 的权重为1,那么集群资源的 80% 会被分配给 dev。注意,这里提到的资源分配不是一个静态的概念,例如当前资源池 dev 中没有任务正在运行,那么资源池 default 是允许使用超过20%的集群资源,比如50%。博主注:资源池的配置信息会保存在fair-scheduler.xml文件中,Resource Manager会周期性读取该配置文件,因此资源池配置允许在线修改,即修改后不需要重新启动Yarn。
8. 为资源池 root 配置资源池 ACL 点击资源池 root 对应的 "Edit" 按钮 YARN动态资源池配置案例

在通用 (General) 栏,设置资源池 root 的调度算法,一般使用默认的DRF (根据CPU、Memory资源进行调度)。博主注:队列的"Submission Access Control"与"Administrator Access Control"的配置会自动继承子队列中,比如在root的"Submission Access Control"中配置用户alex,那么即使root.test的"Submission Access Control"中配置为空,用户alex也可以向队列root.test提交Yarn应用程序。 YARN动态资源池配置案例

在YARN栏,设置资源池权重,资源约束等 YARN动态资源池配置案例

在提交访问控制 (Submission Access Control) 栏设置哪些用户或用户组可以向该资源池提交任务 YARN动态资源池配置案例

在管理访问控制 (Administration Access Control) 栏设置哪些用户或用户组可以对资源池中的任务进行管理 YARN动态资源池配置案例
9. 为资源池 dev 配置资源池 ACL 可以使用与 root 相同的ACL配置,也可以使用不同的配置,该示例假设使用相同的设置。
10. 测试 测试一:用户 root 向资源池 dev 提交 word count 任务
 [root]$ hadoop jar wordcount-0.9.0.jar com.cloudera.example.WordCount -Dmapreduce.job.queuename=dev wordcount/input wordcount/output
 ...
 Exception in thread "main" java.io.IOException: Failed to run job: User root cannot submit applications to queue root.dev
 ...
注意:这里的word count是自定义的,与CDH自带的word count示例的唯一区别在于,自定义word count的Mapper程序在运行时首先使用Thread.sleep (300 * 1000) 休眠5分钟。这主要是为了后续对资源池管理的测试
测试二:用户 root 取消用户 cloudera-dev 提交的、运行于资源池 dev 中的 word count 任务 用户cloudera-dev向资源池dev提交word count任务
 [cloudera-dev]$ hadoop jar wordcount-0.9.0.jar com.cloudera.example.WordCount -Dmapreduce.job.queuename=dev wordcount/input wordcount/output
 ...

用户root查询相应任务的id,假设获得任务id为job_1421512955131_0006
 [root]$ hadoop job -list
 ...

用户root取消 (kill) 该任务
 [root]$ hadoop job -kill job_1421512955131_0006
 ...
 Exception in thread "main" java.io.IOException: org.apache.hadoop.yarn.exceptions.YarnException: Java.security.AccessControlException: User root cannot perform operation MODIFY_APP on application
_1421512955131_0006
 ...

测试三:用户 alex (属于组 cloudera-dev) 取消用户 cloudera-dev 提交的、运行于资源池 dev 中的 word count 任务 增加用户alex,设置所属组cloudera-dev
 [root]$ useradd -g cloudera-dev alex

用户cloudera-dev向资源池dev提交word count任务
 [cloudera-dev]$ hadoop jar wordcount-0.9.0.jar com.cloudera.example.WordCount -Dmapreduce.job.queuename=dev wordcount/input wordcount/output
 ...
 

用户alex查询相应任务的id,假设获得任务id为job_1421512955131_0006
 [alex]$ hadoop job -list
 ...

用户alex取消 (kill) 该任务
 [alex]$ hadoop job -kill job_1421512955131_0006
 ...
 INFO impl.YarnClientImpl: Killed application 
application_1421512955131_0006
 Killed job job_1421512955131_0006
 ...

11. Placement Rules 通过参数mapreduce.job.queuename可以显示地指定一个Yarn应用程序运行所在的资源池 (每个应用程序的运行都必须在资源池)。如果没有显示指定资源池,Yarn会根据一系列的规则 (Placement Rule) 自动生成资源池的名字。这些规则可以通过Cloudera Manager进行配置,如下所示:
YARN动态资源池配置案例
根据该规则: Yarn首先检查用户alex (用户组dev) 是否显示指定了资源池,并且资源池已经预先定义好了: 是 -> 运行 否 -> 检查root.alex资源池是否已经预先定义好了:     是 -> 运行     否 -> 检查root.dev资源池是否已经预先定义好了:         是 -> 运行         否 -> 使用default资源池进行运行
另外,目前在Cloudera Manager上虽然可以定义"嵌套式用户队列" (Nested User Queue),但是尚未允许就嵌套式用户队列设置Placement Rule。因此如果需要使用该功能,只能通过直接编写XML的方式实现。

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
雅白斋ab
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有