共计 6041 个字符,预计需要花费 16 分钟才能阅读完成。
Hadoop 集群上存储数据,同时基于 MapReduce 计算框架可以实现计算任务,那么无论是从数据保护的角度,还是从提交计算任务占用资源的角度来看,都需要存在一种权限管理与分配机制,能够很好地限制哪些人可以在 HDFS 上存储数据,哪些人可以利用集群的资源来处理特定的计算任务。当然,如果能够非常完美地解决这些问题是最好的。当前 Hadoop 本身提供的权限管理功能还不能满足普遍的需要,或者我们从 Hadoop 已有的一些简单或复杂的认证机制选择适合自己所在组织机构需要的,或者我们在外围开发一些权限管理系统与 Hadoop 整合作为补充。
对比 Kerberos 认证(Authentication)配置方式与 SLA 授权(Service Level Authorization)方式,Kerberos 配置相当复杂,而且还要依赖于外部的密钥分发中心 KDC(Key Distribution Center)服务器,如果 KDC 出现问题,那么就会导致依赖于 KDC 认证的整个 Hadoop 集群无法使用,鉴于此,对于一些相对小的开发团队来说还是更倾向于粗粒度的 Hadoop SLA 授权机制。
Hadoop SLA 基于 Hadoop 的各种服务(基于协议来划分)与 Linux 系统的用户、用户组来实现。Hadoop 通过制定接口协议的方式来实现节点之间服务调用的逻辑,这样每一个协议所指定的一组服务就是一个认证单元,再基于底层 Linux 系统的用户和用户组来限制用户(可能是节点服务)有权限执行某一种协议所包含的操作集合,下面我们看一下 Hadoop 中的各种协议:
协议名称 | 范围 | 说明 |
ClientProtocol | HDFS | 用户代码基于 DistributedFileSystem 与 NameNode 交互,可以操作 Hadoop 的 Namespace,以及打开 / 关闭文件流操作。 |
ClientDatanodeProtocol | HDFS | 客户端与 DataNode 交互协议,用来实现数据库恢复(Block Recovery)。 |
DatanodeProtocol | HDFS | DataNode 与 NameNode 通信的协议,DataNode 基于此协议向 NameNode 发送 block report,以及 DataNode 当前状态信息(如负载情况)。 |
InterDatanodeProtocol | HDFS | DataNode 之间进行通信的协议,用来更新 Block 副本(replica)信息,如时间戳、长度等信息。 |
NamenodeProtocol | HDFS | SecondaryNameNode 与 NameNode 进行通信的协议,用来获取 NameNode 的状态信息,如进行 checkpoint 的 edits 与 fsimage。 |
AdminOperationsProtocol | HDFS | HDFS 管理操作协议。 |
RefreshUserMappingsProtocol | HDFS、MR | 用来刷新缓存中用户与用户组映射关系信息,因为无论是操作 HDFS,还是运行 MapReduce Job,都会用到用户信息。 |
RefreshAuthorizationPolicyProtocol | HDFS、MR | 用来更新认证策略(Authorization Policy)配置,对应于配置文件 /etc/hadoop/hadoop-policy.xml,控制执行 hdfs dfsadmin -refreshServiceAcl 和 yarn rmadmin -refreshServiceAcl 的权限。 |
HAServiceProtocol | HDFS | HDFS HA 操作协议,用来管理 Active NameNode 与 Stand-by NameNode 状态。 |
ZKFailoverController | HDFS | ZooKeeper Failover 控制器操作权限,用于 HDFS HA。 |
QJournalProtocol | HDFS | QuorumJournalManager 与 JournalNode 之间通信的协议,用于 HDFS HA,用来同步 edits,并协调 Active NameNode 与 Stand-by NameNode 状态。 |
HSClientProtocol | HDFS | 客户端与 MR History Server 之间通讯的协议,用来查看 Job 历史信息。 |
ResourceTracker | YARN | ResourceManager 与 NodeManager 之间通信的协议。 |
ResourceManagerAdministrationProtocol | YARN | ResourceManager 管理操作协议。 |
ApplicationClientProtocol | YARN | YARN 客户端(Application)与 ResourceManager 通信的协议,包括 Job 提交、Job 取消,查询 Application 状态信息等。 |
ApplicationMasterProtocol | YARN | ApplicationMaster 与 ResourceManager 之间进行通信的协议,包括 AM 向 RM 发送注册或注销请求(获取或释放资源)。 |
ContainerManagementProtocol | YARN | ApplicationMaster 与 NodeManager 之间进行通信的协议,包括启动 / 停止 Container 调用请求。 |
LocalizationProtocol | YARN | NodeManager 与 ResourceLocalizer 之间进行通信的协议。 |
TaskUmbilicalProtocol | MR | Map/Reduce Task 进程与后台父进程(向 MR ApplicationMaster 请求创建 Map/Reduce Task)之间进行通信的协议。 |
MRClientProtocol | MR | MR JobClient 与 MR ApplicationMaster 之间进行通信的协议,包括查询 Job 状态等。 |
上表中是基于 SLA 划分的不同服务级别,要想使 SLA 认证生效,首相需要在 Hadoop 配置文件 /etc/hadoop/core-site.xml 中增加如下配置内容:
<property><name>hadoop.security.authorization</name><value>true</value></property>
该配置属性 hadoop.security.authorization 默认是 false,如果集群已经运行,修改了该配置需要重新启动 Hadoop 集群。然后需要进行 SLA 认证的详细配置,修改配置文件 /etc/hadoop/hadoop-policy.xml,该配置文件中的配置项与对应的 SLA 协议之间的对应关系如下表所示:
配置项 | 协议名称 |
security.client.protocol.acl | ClientProtocol |
security.client.datanode.protocol.acl | ClientDatanodeProtocol |
security.datanode.protocol.acl | DatanodeProtocol |
security.inter.datanode.protocol.acl | InterDatanodeProtocol |
security.namenode.protocol.acl | NamenodeProtocol |
security.admin.operations.protocol.acl | AdminOperationsProtocol |
security.refresh.usertogroups.mappings.protocol.acl | RefreshUserMappingsProtocol |
security.refresh.policy.protocol.acl | RefreshAuthorizationPolicyProtocol |
security.ha.service.protocol.acl | HAServiceProtocol |
security.zkfc.protocol.acl | ZKFailoverController |
security.qjournal.service.protocol.acl | QJournalProtocol |
security.mrhs.client.protocol.acl | HSClientProtocol |
security.resourcetracker.protocol.acl | ResourceTracker |
security.resourcemanager-administration.protocol.acl | ResourceManagerAdministrationProtocol |
security.applicationclient.protocol.acl | ApplicationClientProtocol |
security.applicationmaster.protocol.acl | ApplicationMasterProtocol |
security.containermanagement.protocol.acl | ContainerManagementProtocol |
security.resourcelocalizer.protocol.acl | LocalizationProtocol |
security.job.task.protocol.acl | TaskUmbilicalProtocol |
security.job.client.protocol.acl | MRClientProtocol |
配置 SLA 权限,实际上是增加 ACL(配置用户或用户组)基本格式要求如下:
- 如果既有用户,又有用户组,配置内容格式:user1,user2 group1,group2
- 如果只有用户组,配置内容前面增加一个空格:group1,group2
- 配置内容为 *,表示所有用户都具有对应的服务操作权限
下面, 我们给定如下的需求:
- hadoop 用户作为 Hadoop 集群的管理员角色,可以执行任何操作
- 为了防止其他用户使用 hadoop 用户,使 hadoop 用户归属于用户组 g_super_adm,使属于该组的用户具有集群管理员权限
- 只有 hadoop 用户具有修改 SLA 认证权限的配置
- Storm 集群使用 storm 用户运行 Topology,将实时数据写入 HDFS,storm 用户只具有操作 HDFS 权限
- 用户组 g_dfs_client 具有操作 HDFS 权限
- 用户组 g_mr_client 具有在 Hadoop 上运行 MapReduce Job 的权限
- 用户 stater 只具有操作 HDFS 和运行 MapReduce Job 的权限
通过进行配置实践,来满足上述要求。修改配置文件 /etc/hadoop/hadoop-policy.xml 中的部分配置项,具体修改的内容如下所示:
<property><name>security.client.protocol.acl</name><value>stater,storm g_super_adm,g_dfs_client</value><description>ACL for ClientProtocol, which is used by user code
via the DistributedFileSystem.
The ACL is a comma-separated list of user and group names. The user and
group list is separated by a blank. For e.g. "alice,bob users,wheel".
A special value of "*" means all users are allowed.
</description></property><property><name>security.refresh.policy.protocol.acl</name><value>hadoop</value><description>ACL for RefreshAuthorizationPolicyProtocol, used by the
dfsadmin and mradmin commands to refresh the security policy in-effect.
The ACL is a comma-separated list of user and group names. The user and
group list is separated by a blank. For e.g. "alice,bob users,wheel".
A special value of "*" means all users are allowed.
</description></property><property><name>security.job.client.protocol.acl</name><value>stater g_super_adm,g_mr_client</value><description>ACL for MRClientProtocol, used by job clients to
communciate with the MR ApplicationMaster to query job status etc.
The ACL is a comma-separated list of user and group names. The user and
group list is separated by a blank. For e.g. "alice,bob users,wheel".
A special value of "*" means all users are allowed.
</description></property>
其他的配置属性值保持默认值不变即可。为了保证整个 Hadoop 集群配置相同,需要将修改的配置文件同步到整个集群的所有节点上。
然后,为了使上述配置内容生效,需要执行如下命令:
hdfs dfsadmin -refreshServiceAcl
yarn rmadmin -refreshServiceAcl
修改 SLA 认证配置,不需要重启服务,根据修改内容执行上述命令就可以生效。
后面参考链接中,有些关于 Hadoop SLA 的文档内容貌似没有随着 Hadoop 版本升级而更新,与实际 Hadoop 发行版本中配置文件的内容有一定差别,可以参考,具体以实际版本的情况为准。
参考链接
- http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-common/ServiceLevelAuth.html
- http://hadoop.apache.org/docs/r2.2.0/hadoop-auth/Configuration.html
更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-07/133366.htm