11.3.3 MapReduce
MapReduce权限管理和身份认证涉及作业提交、作业控制、任务启动、任务运行和Shuffle等阶段。接下来分别对以上各阶段进行介绍。
(1)作业提交
用户提交作业后,JobClient需与NameNode和JobTracker等服务进行通信,以进行身份认证和获取相关令牌,具体过程如下:
步骤1 JobClient与NameNode通信,通过Kerberos验证后可获取授权令牌。使用该令牌,作业和任务可以读写HDFS上的文件。
步骤2 JobClient将作业运行相关的文件,比如作业配置文件job.xml、输入分片相关文件job.split和job.splitmetainfo、程序jar包等,上传到HDFS的目录${mapreduce.jobtracker.staging.root.dir}/${user}/.staging/${jobid}下(其中${mapreduce.jobtracker.staging.root.dir}为${hadoop.tmp.dir}/mapred/staging)。为了保证该目录中的文件不会被其他用户窃取,Hadoop将其访问权限设置为700。
步骤3 JobClient通过RPC将作业文件目录和授权令牌发送给JobTracker。
步骤4 JobTracker为作业生成作业令牌,连同HDFS的授权令牌,一并写入${mapred.system.dir}/${jobid}/job-info/jobToken中(${mapred.system.dir}默认值为${hadoop.tmp.dir}/mapred/system),同时将其访问权限设置为700。
注意 JobTracker对作业进行初始化时,需要从HDFS上读取job.splitmetainfo文件,此时,它是借用作业的授权令牌完成的。
(2)作业控制
用户提交作业时,可通过参数mapreduce.job.acl-view-job指定哪些用户或者用户组可以查看作业状态,也可以通过参数mapreduce.job.acl-modify-job指定哪些用户或者用户组可以修改或者杀掉job。
(3)任务启动
TaskTracker收到JobTracker分配的任务后,如果该任务来自某个作业的第一个任务,则会进行作业本地化:将任务运行相关的文件下载到本地目录下,其中,作业令牌文件会被写到${mapred.local.dir}/ttprivate/taskTracker/${user}/jobcache/${jobid}/jobToken目录下。由于只有该作业的拥有者可以访问该目录,因此令牌文件是安全的。此外,Task要使用作业令牌向TaskTracker进行安全认证,以请求新的任务或者汇报任务状态。
(4)任务运行
增加安全机制之前,Hadoop中所有用户的任务均是以启动Hadoop的用户的身份启动的,也就是说,虽然各个用户以不同身份提交作业,但最终在各个节点上是以同一个用户运行身份运行的。很显然,这是不安全的,比如任何一个用户可以很容易杀掉另外一个用户的任务。
为了解决该问题,Hadoop应以实际提交作业的那个用户身份运行相应的任务。为此,Hadoop用C程序实现了一个setuid程序以修改每个任务所在JVM的有效用户ID。若要启用该功能,管理员首先需编译setuid程序,并将生成的可执行程序存放到$HADOOP_HOME/bin目录下,然后在配置文件中将mapred.task.tracker.task-controller设置为org.apache.hadoop.mapred.LinuxTaskController,同时修改配置文件task-controller.cfg。
(5)Shuffle
在MapReduce中,一个作业的Map Task将结果直接写到TaskTracker的本地磁盘上,而Reduce Task则通过HTTP从TaskTracker上获取数据。在添加安全机制之前,任何用户只要通过URL即可获取任意一个Map Task的中间输出结果,比如可使用以下URL获取节点node100上作业job_201211011150_10219的第0个Map Task的第0片数据:
为了解决该问题,Hadoop在Reduce Task与TaskTracker之间的通信机制上添加了双向认证机制,以保证有且仅有同作业的Reduce Task才能够读取Map Task的中间结果。该双向认证是以它们之间共享的作业令牌为基础的。
TaskTracker对Reduce Task认证
Reduce Task从TaskTracker上获取数据之前,先要将HMAC-SHA1(URL, JobToken)发送给TaskTracker, TaskTracker利用自己保存的作业令牌计算HMAC-SHA1,然后比较该值与Reduce Task发送过来的是否一致,如果一致,则通过身份认证。
Reduce Task对TaskTracker认证
为了防止伪装的TaskTracker向Reduce Task发送数据,Reduce Task也需要对TaskTracker进行认证。TaskTracker对Reduce Task认证成功后,需使用Reduce Task发送过来的HMAC-SHA1值与作业令牌计算一个新的HMAC-SHA1,经Reduce Task验证后,双方认证才算通过,此时才可以正式传送数据。
(6)Web UI
在Hadoop中,任何用户均可以通过Web界面观察整个集群的资源使用情况和每个作业的运行状态,这很显然缺乏必要的安全认证机制。考虑到Hadoop中的界面是基于Jetty实现的,因此,为了实现安全认证机制,需在Jetty中添加相应的模块。Kerberos中已经自带了Web浏览器访问认证机制SPNEGO(Simple and Protected GSS-API Negotiation)。Hadoop 1.0直接采用了该认证机制。